Wordにはルビ(ふりがな)を付ける機能があります。
これを解除して括弧付のテキストに変換するマクロを考えました。
マクロを実行すると編集中の文書の全てのルビを変換します。例えば「りんご」というルビが付いた「林檎」を「林檎(りんご)」に変換します。
前半がマクロの本体です。
Wordのルビはフィールドで設定されているので、これを全て取得し、それぞれ置換します。「EQ~」というフィールドですので、どうやらWordは数式を利用してルビを表現しているようです。
後半はフィールドコードから元の文字列とルビの文字列を取得し「元の文字列(ルビの文字列)」という形に変換します。
Sub ルビを括弧付のテキストに変換()
Dim myfield As Object
Dim mycode As String
For Each myfield In ActiveDocument.Fields
mycode = myfield.Code
myfield.Select
Selection.Range.text = ruby(mycode)
Next
End Sub
Function ruby(codetext)
'codetextはルビを表すフィールドコード「EQ~(~(るび),ルビ)」
Dim i, pos As Long
Dim rubybase, rubytext, t As String
pos = 0
rubybase = ""
rubytext = ""
For i = 1 To Len(codetext)
t = Mid(codetext, i, 1)
If t = "(" Or t = ")" Or t = "," Then
pos = pos + 1
ElseIf pos = 2 Then
rubytext = rubytext & t
ElseIf pos = 4 Then
rubybase = rubybase & t
End If
Next i
ruby = rubybase & "(" & rubytext & ")"
End Function
Dim myfield As Object
Dim mycode As String
For Each myfield In ActiveDocument.Fields
mycode = myfield.Code
myfield.Select
Selection.Range.text = ruby(mycode)
Next
End Sub
Function ruby(codetext)
'codetextはルビを表すフィールドコード「EQ~(~(るび),ルビ)」
Dim i, pos As Long
Dim rubybase, rubytext, t As String
pos = 0
rubybase = ""
rubytext = ""
For i = 1 To Len(codetext)
t = Mid(codetext, i, 1)
If t = "(" Or t = ")" Or t = "," Then
pos = pos + 1
ElseIf pos = 2 Then
rubytext = rubytext & t
ElseIf pos = 4 Then
rubybase = rubybase & t
End If
Next i
ruby = rubybase & "(" & rubytext & ")"
End Function
VBAでは工夫すれば正規表現が使えるのですが、今回は括弧やカンマの位置からルビの文字列を取得しています。となると「ルビに括弧やカンマが含まれていたら取得できない」という問題がありますが、実はそもそもWordではルビに括弧やカンマをセットすることができないようです。Word2007で確認しました。
コメント