マクロでルビ振りをするときの注意(Word)

マクロでルビ振りをするときの注意(Word)

Word VBA のバグを発見したので、ここで盛大に晒しますw

[Range].PhoneticGuideメソッドでルビを振る

まず、次のようなドキュメント(笑)を用意する。

f:id:akashi_keirin:20200124074659j:plain

選択部分を見たらわかるように、フォントは「MS 明朝」。

んで、こいつに、次のリスト1を実行する。

リスト1
Private Sub TestPhoneticGuide()
  Const MS_P_MINGZHAO As String = "MS P明朝"
  Call Selection.Range.PhoneticGuide( _
                         Text:="とも", _
                         Alignment:=wdPhoneticGuideAlignmentOneTwoOne, _
                         Raise:=10, _
                         FontSize:=5, _
                         FontName:=MS_P_MINGZHAO)
End Sub

[Range].PhoneticGuideメソッドを用いて、「強敵」という親文字に、5ポイントのMS P明朝で「とも」とルビを振るコード。

f:id:akashi_keirin:20200124074734g:plain

こうなる。

で、「強敵」の部分を調べると、

f:id:akashi_keirin:20200124074702j:plain

このように、ちゃんと5ポイントのMS P明朝で「とも」とルビが振られていることがわかる。

ここで、一旦ドキュメント(笑)を閉じ、開き直す。

もう一度、「強敵」の部分を調べる。

f:id:akashi_keirin:20200124074704j:plain

何も変わっていない。当り前だけど。

ここで、フィールドコードを調べる。

f:id:akashi_keirin:20200124074707j:plain

EQ \* jc2 \* "Font:MS P明朝" \* hps10 \o\ad(\s\up 10(とも),強敵)

こうなっている。

hps10」の部分がルビのフォントサイズを表す。実際のサイズ(5ポイント)の2倍の数値が記録されている。

マクロでルビのフォントサイズを変更する

このフィールドコードをマクロで書き換えてみる。

スト2
Private Sub testReplaceFieldCode()
  Dim tgtField As Field
  With Selection.Fields(1)
    .Code.Text = Replace(.Code.Text, "hps10", "hps9")
  End With
End Sub

選択範囲のField.Codeプロパティの返り値(Rangeオブジェクト)のTextプロパティがフィールドコード文字列を表すので、その「hps10」を「hps9」に置換してやれば、フォントサイズは4.5ポイントに変わる。

スト2を実行した後、「強敵」の部分を調べると、

f:id:akashi_keirin:20200124074710j:plain

ちゃんとフォントサイズが4.5ポイントになっている。

f:id:akashi_keirin:20200124074713j:plain

フィールドコードはこのとおり。ちゃんと「hps9」になっているのがわかる。

ドキュメント(笑)を開き直す

さて、先ほどのドキュメント(笑)を一旦閉じて開き直すと、どうなるか。

f:id:akashi_keirin:20200124074716j:plain

おわかりだろうか。

なんと、ルビのフォントが親文字と同じ「MS 明朝」に化けてしまうのである。

これは、結構深刻な問題ではなかろうか。

回避策

ちなみに、フォントサイズだけではなく、フォントの種類など、とにかくマクロでフィールドコードを書き換えると、同様のことが起こる。

今回は、親文字がMS 明朝、ルビがMS P明朝という非常に違いのわかりづらい(笑)例だったが、ゴシック系の親文字に明朝系のルビ、みたいなときは非常に困る。

今のところ回避策としては、

  • [Range].PhoneticGuideでルビを振る
  • [Alt]+[F9]でフィールドコードを表示する
  • [Ctrl]+[H]で置換ダイアログを表示する
  • 関係するフィールドコード文字列を置換する

ぐらいしか思いつかない。

今回の例だと、

[Alt]+[F9]でフィールドコードを表示し、

f:id:akashi_keirin:20200124074719j:plain

[Ctrl]+[H]で置換ダイアログの「検索する文字列」に「hps10」、「置換する文字列」に「hps9」を入力して[置換]ボタンをクリック。

f:id:akashi_keirin:20200124074724j:plain

完了。

「強敵」のところを調べると、

f:id:akashi_keirin:20200124074727j:plain

このとおり。

今度は、一旦閉じて開き直しても、

f:id:akashi_keirin:20200124074730j:plain

大丈夫。

おわりに

わけのわからんことが起こるなあ。