【入門編】【上級者向け】段落の「フォント」情報をバイナリレベルで解析し、文字化けや破損を検知する – Word VBA解析バイブル

スポンサーリンク

Word VBAの深淵を覗く:フォント情報の「バイナリ的解析」で文書破損を制圧する

こんにちは。自動化の荒波を越えてきた皆さん。
普段、何気なく使っているWordの「太字」や「フォント設定」。実はこれ、Wordの裏側では非常に複雑な構造で管理されています。

「マクロの記録」で生成されるコードは、あくまで「表面的な動作」をなぞっているに過ぎません。今日は、Word VBAのプロフェッショナルを目指す皆さんのために、「Rangeオブジェクトすら裏切るような、不可視の書式不整合」を検知する、一歩踏み込んだ手法を伝授します。

1. なぜ「Rangeオブジェクト」だけでは不十分なのか?

Word VBAで書式を扱うとき、私たちは `Range.Font` や `Paragraph.Style` を使います。しかし、これらはあくまでWordが「解釈した後の姿」です。

文書がコピー&ペーストを繰り返されたり、異なる言語設定のPC間を行き来したりすると、Word内部のフォントテーブルに「実体のない参照」や「不正なエンコーディング」が紛れ込むことがあります。これがいわゆる「文字化けの種」です。

低レイヤーな視点を持つということは、「Wordが見せようとしている顔ではなく、背後にあるデータ構造の歪み」を疑うことに他なりません。

2. 実践:段落単位での「フォント不整合」検知コード

今回は、Range内の文字コードを走査し、そのフォントが「現在のシステムで正しく描画できるか」、あるいは「埋め込みフォントの破損の兆候はないか」を判定するアプローチを紹介します。

以下のコードは、文書内の段落を一つずつ解析し、文字コードの範囲外や、フォントのリンク切れを簡易的に診断するものです。

Option Explicit

‘ 【上級者向け】文書内のフォント・文字コード整合性チェック
Public Sub InspectParagraphFormat()
Dim para As Paragraph
Dim rng As Range
Dim i As Long
Dim charCode As Long

‘ ドキュメントの全段落をループ
For Each para In ActiveDocument.Paragraphs
Set rng = para.Range

‘ 段落内の各文字をバイナリレベルで走査
For i = 1 To rng.Characters.Count
‘ 文字コードを取得
charCode = AscW(rng.Characters(i).Text)

‘ 【重要】負の値や、制御コード(0-31)の異常な混入を検知
‘ 通常の文章中に含まれるべきでないコードを抽出する
If charCode < 32 And charCode <> 13 And charCode <> 9 Then
Debug.Print “異常な制御コード検知: 段落 ” & para.Range.Information(wdActiveEndAdjustedPageNumber) _
& ” 文字位置: ” & i & ” コード: ” & charCode
End If

‘ フォント名の取得と、埋め込み情報の簡易チェック
‘ プロフェッショナルは「NameFarEast」にも注目する
If rng.Characters(i).Font.Name = “” Then
Debug.Print “警告: 段落 ” & para.Range.Information(wdActiveEndAdjustedPageNumber) _
& ” でフォント参照が破損しています。”
End If
Next i
Next para

MsgBox “解析完了。イミディエイトウィンドウを確認してください。”, vbInformation
End Sub

コードの解説

  • `AscW`関数の重要性: `Asc`関数ではなく、Unicodeを扱える`AscW`を使うのが鉄則です。これで、現代のWordで使われる広大な文字空間のコードを正確に捉えられます。
  • `Font.Name = “”`の罠: これが最も重要な知見です。Range内の文字に複数のフォントが混在している場合、あるいはフォント情報が破損している場合、Wordは`Name`プロパティを空文字(null)として返します。これを検知することで、ユーザーが気づかないうちに混入している「お化け書式」をあぶり出せます。

3. 陥りやすいエラーと「現場の知恵」

初心者がこの領域に踏み込むと、必ず「オブジェクトの解放」「パフォーマンス」の壁にぶつかります。

1. 無限ループの罠: `Paragraphs.Count`でループを回す際、途中で段落を削除したり結合したりすると、Wordのインデックスが狂い、実行時エラーが発生します。常に「後ろからループする(Step -1)」か、Rangeオブジェクト自体を再定義する癖をつけましょう。
2. イミディエイトウィンドウの活用: 解析結果を`MsgBox`で出すのは素人のやり方です。大量のログが出る場合は、必ず`Debug.Print`を使い、イミディエイトウィンドウ(Ctrl+G)で後から精査してください。
3. パフォーマンス: `Characters`を文字単位でループするのはWord VBAにおいて最も重い処理の一つです。文書が数百ページある場合は、`Range.Text`を一括で取得し、VB.NETの正規表現エンジンに渡して解析する方が、処理速度は100倍速くなります。

最後に:エンジニアとしての一歩先へ

Word VBAは「枯れた技術」と言われますが、それは表面を撫でているだけの話です。段落の構造、フォントの埋め込み、文字コードの不整合――これらに目を向けることは、「文書というデータの構造を掌握すること」に他なりません。

今回紹介したコードは、単なる書式チェックではありません。文書の健康診断を行うための「最初のメス」です。ここをクリアすれば、あなたはもうマクロの記録に頼る初心者ではありません。Wordの深淵に足を踏み入れた、真の自動化エンジニアの仲間入りです。

次は、この解析結果を元に、自動でフォントを統一する「クレンジング処理」に挑戦してみましょう。応援しています。

タイトルとURLをコピーしました