【コード】上付きに見えるけど上付きではない文字を上付きに変換するWordマクロ(その1)

【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

次の記事で、更に高速化するためのコツを紹介します。

トップへ戻る