文字列をメモ帳にコピー&ペーストすると文字化けしたり、フォント指定で検索しているのに何故かヒットしなかったり、Wordマクロを書く人間にとって何かと厄介なのが“Symbol(シンボル)フォント”です。
ライターや翻訳者など、大量の文字をWordで扱ったことがある人ならば、一度は引っ掛かったことがあるのではないでしょうか?
Word MVPの新田さんのブログにも、このSymbolフォントを扱っている記事が数多くあります。
- こうすればできる!!シンボルフォントの検索
- http://ameblo.jp/gidgeerock/entry-10551329646.html
- こうすればできる!!シンボルフォントの検索(2)
- http://ameblo.jp/gidgeerock/entry-10554187847.html
- こうすればできる!!シンボルフォントの検索(3)
- http://ameblo.jp/gidgeerock/entry-10555132625.html
- Symbolフォントのギリシャ文字を蛍光ペンで着色するマクロ
- http://ameblo.jp/gidgeerock/entry-11072233749.html
- Symbolフォントのギリシャ文字を蛍光ペンで着色するマクロ(解説)
- http://ameblo.jp/gidgeerock/entry-11072244135.html
- 【Wordマクロ】ギリシャ文字をシンボルフォントに変更する
- http://ameblo.jp/gidgeerock/entry-11664073459.html
- 【Wordマクロ】Symbolフォントの段落番号を通常の段落番号に変換する
- http://ameblo.jp/gidgeerock/entry-11985521615.html
私も数年前にHPで「指定したフォントが使われているかどうかをチェックする」というWordマクロのコードを書いたのですが、以前書いたコードは非効率的な部分もあるので、今回改めてコードを見直すことにしました。
Option Explicit Public Sub Sample() '"Symbol"フォントかどうかを一文字ずつチェック Dim tmp As Word.Range Dim r As Word.Range Set tmp = Selection.Range Application.ScreenUpdating = False For Each r In ActiveDocument.Characters If ChkSymbolFont(r) = True Then '"Symbol"フォントだったら蛍光ペンでマーク r.HighlightColorIndex = wdPink End If Next Application.ScreenUpdating = True tmp.Select MsgBox "処理が終了しました。", vbInformation + vbSystemModal End Sub Private Function ChkSymbolFont(ByVal TargetCharacter As Word.Range) As Boolean '指定したRange(1文字)のフォントが「Symbol」かどうかをチェック Dim FontName As String: FontName = LCase("Symbol") Dim ret As Boolean '文字数チェック If TargetCharacter.Characters.Count > 1 Then _ Err.Raise Number:=513, Description:="引数の文字数を「1」にしてください。" '初期化 ret = False TargetCharacter.Select 'Fontオブジェクトのプロパティチェック With Selection If LCase(.Font.Name) = FontName Then ret = True: GoTo EndProc If LCase(.Font.NameAscii) = FontName Then ret = True: GoTo EndProc If LCase(.Font.NameBi) = FontName Then ret = True: GoTo EndProc If LCase(.Font.NameFarEast) = FontName Then ret = True: GoTo EndProc If LCase(.Font.NameOther) = FontName Then ret = True: GoTo EndProc End With 'フォントダイアログチェック With Application.Dialogs(wdDialogFormatFont) If LCase(.Font) = FontName Then ret = True: GoTo EndProc If LCase(.FontHighAnsi) = FontName Then ret = True: GoTo EndProc If LCase(.FontLowAnsi) = FontName Then ret = True: GoTo EndProc If LCase(.FontNameBi) = FontName Then ret = True: GoTo EndProc End With '記号と特殊文字ダイアログチェック With Application.Dialogs(wdDialogInsertSymbol) If LCase(.Font) = FontName Then ret = True: GoTo EndProc End With EndProc: ChkSymbolFont = ret End Function
やっていることは以前書いたコードと同じで、一文字ずつチェック用の関数に渡して、文書中のどこにSymbolフォントがあるのかをチェックする、というものです。
Fontオブジェクトからフォント名関連の各プロパティをチェック、フォントダイアログから取得できる各フォント名をチェック、記号と特殊文字ダイアログから取得できるフォント名をチェック、これだけやればさすがに漏れなくチェックできるのではないかと思います。
ホントは下記コードのようにRangeやSelectionか取得できるXMLから判別する方法も考えたのですが、効率が悪そうなので止めにしました。
Dim node As Object Dim attr As Object With CreateObject("MSXML2.DOMDocument") If .LoadXML(Selection.XML) = True Then Set node = .SelectSingleNode("/w:wordDocument/w:body/wx:sect/w:p/w:r/w:sym") If Not node Is Nothing Then Set attr = node.Attributes.getNamedItem("w:font") If Not attr Is Nothing Then If LCase(attr.NodeValue) = LCase("Symbol") Then MsgBox "Symbolフォントです。" End If End If End If End With
一文字ずつのチェックになるため、動作速度としては速いものではありませんが、Symbolフォントの対応に苦慮されている方の参考になれば幸いです。
この記事へのコメントはありません。