マクロでルビ振りをするときの注意(Word)
マクロでルビ振りをするときの注意(Word)
Word VBA のバグを発見したので、ここで盛大に晒しますw
[Range].PhoneticGuideメソッドでルビを振る
まず、次のようなドキュメント(笑)を用意する。
選択部分を見たらわかるように、フォントは「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明朝で「とも」とルビを振るコード。
こうなる。
で、「強敵」の部分を調べると、
このように、ちゃんと5ポイントのMS P明朝で「とも」とルビが振られていることがわかる。
ここで、一旦ドキュメント(笑)を閉じ、開き直す。
もう一度、「強敵」の部分を調べる。
何も変わっていない。当り前だけど。
ここで、フィールドコードを調べる。
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を実行した後、「強敵」の部分を調べると、
ちゃんとフォントサイズが4.5ポイントになっている。
フィールドコードはこのとおり。ちゃんと「hps9
」になっているのがわかる。
ドキュメント(笑)を開き直す
さて、先ほどのドキュメント(笑)を一旦閉じて開き直すと、どうなるか。
おわかりだろうか。
なんと、ルビのフォントが親文字と同じ「MS 明朝」に化けてしまうのである。
これは、結構深刻な問題ではなかろうか。
回避策
ちなみに、フォントサイズだけではなく、フォントの種類など、とにかくマクロでフィールドコードを書き換えると、同様のことが起こる。
今回は、親文字がMS 明朝、ルビがMS P明朝という非常に違いのわかりづらい(笑)例だったが、ゴシック系の親文字に明朝系のルビ、みたいなときは非常に困る。
今のところ回避策としては、
[Range].PhoneticGuide
でルビを振る- [Alt]+[F9]でフィールドコードを表示する
- [Ctrl]+[H]で置換ダイアログを表示する
- 関係するフィールドコード文字列を置換する
ぐらいしか思いつかない。
今回の例だと、
[Alt]+[F9]でフィールドコードを表示し、
[Ctrl]+[H]で置換ダイアログの「検索する文字列」に「hps10
」、「置換する文字列」に「hps9
」を入力して[置換]ボタンをクリック。
完了。
「強敵」のところを調べると、
このとおり。
今度は、一旦閉じて開き直しても、
大丈夫。
おわりに
わけのわからんことが起こるなあ。