このマクロには改良版があります。 【コード】上付きに見えるけど上付きではない文字を上付きに変換するWordマクロ(その1) 【コード】上付きに見えるけど上付きではない文字を上付きに変換するWordマクロ(その2) 【コード】上付きに見えるけど上付きではない文字を上付きに変換するWordマクロ(その3)
【Word】上付きに見えるけど上付きではない文字(その1) 【Word】上付きに見えるけど上付きではない文字(その2) に関連した記事です。
これまでの2回の記事で、見た目は上付きなのに上付きではない文字列を紹介しました。
今回の記事では、上記の(その1)で紹介した「上方にずれている文字」を上付きに変換するマクロを紹介します。
このマクロでできること
記事「【Word】上付きに見えるけど上付きではない文字(その1)」で紹介したような上方にずれた位置にある文字を上付きに変換します。
また処理した箇所を明るい緑で着色します。
一括処理をする場合には、どの箇所を処理したか自分で確認できるようにしておく必要があると思っています。
マクロの解説
文字が上方にずれているかどうかを判定するには、Font オブジェクトの Position プロパティの値を判定します。
この値が0の場合には、通常の位置に文字が配置されています。この値ば0より大きい場合には上方向にずれており、0より小さい場合には下方向にずれています。
マクロ1のように文字1つ1つをインデックスで指定するやり方(For… Next ステートメント)の場合、処理時間がかかります。対象となるファイルがパソコンのスペックに対して大きい場合、Wordに負荷がかかりすぎて落ちることがあります(汗)。
Wordで段落の処理や文字の処理をする場合には、マクロ2のようにオブジェクト変数を使った For Each… Next ステートメントを使うようにしましょう。
処理時間の差を示すためにサンプルを作りました。
サンプルとして、125ページの英日の対訳表を用意しました。86,000語、20万文字の分量があり、この中に72箇所だけ上方にずれた文字列が存在します。
この場合の処理時間は
- マクロ1:6.72秒
- マクロ2:0.87秒
となりました。
この差は処理対象箇所の数により異なりますが、差が歴然としていることがわかると思います。
マクロ1
Sub 上方に位置する文字を上付きに変換する1() Dim i As Long Dim myDoc As Document Dim a As Single Dim b As Single Dim c As Single a = Timer() Set myDoc = ActiveDocument For i = 1 To myDoc.Range.Characters.Count With myDoc.Range.Characters(i) If .Font.Position > 0 Then .Font.Position = 0 .Font.Superscript = True .HighlightColorIndex = wdBrightGreen End If End With Next b = Timer() c = Round(b - a, 2) MsgBox "終わりました。" & vbCr & c & "秒" End Sub
マクロ2
Sub 上方に位置する文字を上付きに変換する2() Dim myChar As Range Dim myDoc As Document Dim a As Single Dim b As Single Dim c As Single a = Timer() Set myDoc = ActiveDocument For Each myChar In myDoc.Characters With myChar If .Font.Position > 0 Then .Font.Position = 0 .Font.Superscript = True .HighlightColorIndex = wdBrightGreen End If End With Next b = Timer() c = Round(b - a, 2) MsgBox "終わりました。" & vbCr & c & "秒" End Sub
次の記事で、更に高速化するためのコツを紹介します。