-3

我在 Excel 2013 中有一个包含字母和数字 1、2、3 和 4 的列(代表拼音发音和音调值)。它们都采用相同的字体和格式,但我只想将数字转换为上标。我似乎无法使用 Excel 的任何内置查找和替换功能将单元格中的单个字符替换为其上标版本:整个单元格格式都发生了变化。我看到一个线程Format individual characters in a single Excel cell with python显然有一个解决方案,但那是我第一次听说 Python 或 xlwt。

由于我从未使用过 Python 和 xlwt,有人可以给我一套基本的分步说明来安装这些实用程序、自定义脚本并运行它吗?

样本:

Li1Shi4
Qin3Fat1
Gon1Lin3
Den1Choi3
Xin1Nen3

来自其他线程的脚本:

import xlwt

wb = xlwt.Workbook()
ws = wb.add_sheet('Sheet1')

font0 = xlwt.easyfont('')
font1 = xlwt.easyfont('bold true')
font2 = xlwt.easyfont('color_index red')
style = xlwt.easyxf('font: color_index blue')

seg1 = ('bold', font1)
seg2 = ('red', font2)
seg3 = ('plain', font0)
seg4 = ('boldagain', font1)

ws.write_rich_text(2, 5, (seg1, seg2, seg3, seg4))
ws.write_rich_text(4, 1, ('xyz', seg2, seg3, '123'), style)

wb.save('rich_text.xls')

实现“查找数字并用上标替换”的语法是什么?它是字体还是样式?来自另一个线程的代码似乎手动输入了 "seg1" 、 "seg2" 、 "seg3" 等。还是我误解了代码?

提前致谢。我正在使用 Windows 8、64 位、Excel 2013。

4

1 回答 1

2

我很无聊,处于教学状态,所以,这里有一个很长的“答案”,它也解释了一些关于你将来如何为自己解决这些问题的问题:)

我输入abc123def了一个单元格,并使用宏记录器录制了一个宏。

如果您不知道正确的语法是什么,那么 您应该始终从这里开始。

无论如何,我选择了这个单元格的数字部分,然后右键单击,格式化单元格,将字体更改为上标。

这是宏记录器给我的。这是很多代码。幸运的是,它有很多垃圾。

Sub Macro2()
    With ActiveCell.Characters(Start:=1, Length:=3).Font  'Applies to the first 3 characters
        .Name = "Calibri"
        .FontStyle = "Regular"
        .Size = 11
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ThemeColor = xlThemeColorLight1
        .TintAndShade = 0
        .ThemeFont = xlThemeFontMinor
    End With
    With ActiveCell.Characters(Start:=4, Length:=3).Font 'Applies to the middle 3 characters
        .Name = "Calibri"
        .FontStyle = "Regular"
        .Size = 11
        .Strikethrough = False
        .Superscript = True
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ThemeColor = xlThemeColorLight1
        .TintAndShade = 0
        .ThemeFont = xlThemeFontMinor
    End With
    With ActiveCell.Characters(Start:=7, Length:=3).Font 'Applies to the last 3 characters
        .Name = "Calibri"
        .FontStyle = "Regular"
        .Size = 11
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ThemeColor = xlThemeColorLight1
        .TintAndShade = 0
        .ThemeFont = xlThemeFontMinor
    End With
End Sub

它代表的是三个格式块:第一个是没有更改的前 3 个字符,然后是我们应用上标的 3 个字符,然后是最后三个字符。

几乎所有这些都是默认属性,因为我没有进行其他更改,所以我可以将其修改为:

Sub Macro2()
    With ActiveCell.Characters(Start:=4, Length:=3).Font
        .Superscript = False
    End With
End Sub

现在我们可以看到这有两个重要部分。第一部分是如何指定要格式化的字符。这是通过引用单元格的.Characters

ActiveCell.Characters(Start:=4, Length:=3).Font

所以我们可以看到这个宏引用了字符串“abc123def”或“123”中4-6位的字符。

接下来,显而易见的部分是分配.Font.Superscript属性 is True

现在你想概括它,以便你可以在任何地方应用它。上面的代码是“硬编码”的StartandLength参数。我们需要让它动态化。最简单的方法是一次输入 1 个字符,并检查它是否为数字,如果是,则应用上标。

Sub ApplySuperscriptToNumbers()
    Dim i As Long
    Dim str As String
    Dim rng As Range
    Dim cl As Range

    '## Generally should work on any contiguous "Selection" of cell(s)
    Set rng = Range(Selection.Address)
    '## Iterate over each cell in this selection
    For Each cl In rng.Cells
        str = cl.Value
        '## Iterate over each character in the cell
        For i = 1 To Len(str)
            '## Check if this character is numeric
            If IsNumeric(Mid(str, i, 1)) Then
                '## Apply superscript to this 1 character
                cl.Characters(Start:=i, Length:=1).Font.Superscript = True
            End If
        Next
    Next
End Sub
于 2013-10-06T02:31:30.737 回答