-3

Excel 2013 に、文字と数字 1、2、3、および 4 (ピンインの発音とトーン値を表す) を含む列があります。それらはすべて同じフォントと形式ですが、数字のみを上付き文字に変換したいと思います。Excel の組み込みの検索と置換機能を使用して、セル内の 1 文字を上付き文字に置き換えることはできないようです。セル全体の書式が変更されます。明らかに解決策を保持しているPythonを使用して単一のExcelセルで個々の文字をフォーマットするスレッドを見ましたが、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 文字、次に上付き文字を適用した 3 文字、そして最後の 3 文字です。

他に変更を加えていないため、これのほとんどすべてがデフォルトのプロパティであるため、次のように修正できます。

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

これには 2 つの重要な部分があることがわかります。最初の部分は、どの文字をフォーマットするかを指定する方法です。これは、セルの を参照することによって行われ.Charactersます。

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

したがって、このマクロは、文字列「abc123def」または「123」の 4 ~ 6 番目の文字を参照していることがわかります。

.Font.Superscript次の明らかな部分は、プロパティ isを割り当てることですTrue

これを一般化して、どこにでも適用できるようにします。Start上記のコードは、引数と引数が「ハードコード」されていLengthます。動的にする必要があります。これを行う最も簡単な方法は、一度に 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 に答える