【入門編】【中級者向け】フォントの「埋め込み」状態をチェックし、VBAで一括修正する – Word VBA解析バイブル

スポンサーリンク

【Word VBA道場】フォントの「埋め込み」を制する!文書のポータビリティを極める自動化術

こんにちは、エンジニアの皆さん。
Wordで作成した渾身のドキュメントを他人のPCで開いた瞬間、「レイアウトが崩れた」「フォントが明朝体に化けた」……そんな冷や汗をかく経験をしたことはありませんか?

それは、あなたの文書が「特定のPCの環境」に依存しているからです。プロの現場では、文書のポータビリティ(持ち運びやすさ)は必須スキル。今日は、Word VBAを駆使して「埋め込み不可能な危険なフォント」を一掃し、安全な文書へと昇華させる「極限の自動化術」を伝授します。

1. なぜ「フォントの埋め込み」が重要なのか?

Wordのフォントは、PC内にインストールされているものを参照する仕組みです。特殊なフォントや、埋め込みを許可していないフォントを使っていると、配布先で強制的に代替フォントに置き換わります。

これを防ぐには、「埋め込み可能なフォントのみで文書を構成する」のが鉄則です。しかし、数千行の文書から一つ一つフォントを確認するのは、地獄の作業ですよね。ここでVBAの出番です。

2. 実践:文書内のフォントを検証・置換するVBA

このスクリプトは、文書内の全段落を走査し、指定した「非推奨フォント」を「埋め込み可能な標準フォント」へ一括置換します。

Sub ReplaceUnsafeFonts()
‘ — プロの設計:オブジェクトを明示的に解放する —
Dim rng As Range
Dim targetFont As String
Dim safeFont As String

‘ 置換対象と置換後のフォントを設定
targetFont = “MS 明朝” ‘ ここに埋め込み不可なフォント名を指定
safeFont = “游明朝” ‘ 埋め込み可能なフォントを指定

‘ 文書の先頭から末尾までをRangeオブジェクトで取得
Set rng = ActiveDocument.Content

‘ Findオブジェクトを使って高速置換
With rng.Find
.ClearFormatting
.Font.Name = targetFont ‘ 検索対象

.Replacement.ClearFormatting
.Replacement.Font.Name = safeFont ‘ 置換後

‘ 全て置換を実行
.Execute Replace:=wdReplaceAll, _
Forward:=True, _
Format:=True, _
MatchCase:=False
End With

MsgBox “フォントの最適化が完了しました。保存して埋め込み設定を確認してください。”
End Sub

このコードの「ここがプロの技」

  • Rangeオブジェクトの活用: `Selection`を使うと画面がチラつき、処理速度が大幅に低下します。`Range`を直接操作することで、バックグラウンドでの爆速処理を実現しています。
  • Find/Replaceの利用: 段落を一つずつループで回す(`For Each`)のは初学者の罠です。`Find`オブジェクトを使う方が、Word内部の最適化エンジンを通すため、圧倒的に高速です。

3. 陥りやすいエラーと対処法

VBAを触り始めた皆さんが必ずと言っていいほどぶつかる壁が2つあります。

① フォント名が正確でない

`targetFont = “MS明朝”` と `MS 明朝`(スペースの有無)は別物として扱われます。エラーが出る場合は、Wordのフォント選択ドロップダウンに表示されている名前を正確にコピーしてください。

② 「埋め込み設定」そのものが漏れている

このコードでフォントを入れ替えても、Word側の「フォントを埋め込む」オプションがオフなら意味がありません。仕上げに以下のコードを走らせて、埋め込み設定を強制オンにしましょう。

Sub ForceEmbedFonts()
‘ 文書のプロパティに直接介入する
With ActiveDocument
.EmbedTrueTypeFonts = True
.SaveSubsetFonts = True
End With
MsgBox “フォント埋め込み設定を有効化しました。”
End Sub

4. さらなる高みへ:オブジェクトのライフサイクルを意識する

中級者へのステップアップとして意識してほしいのが「オブジェクトの解放」です。

今回のような小さなスクリプトでは問題になりませんが、大規模な文書処理を行う際、作成したオブジェクトを `Nothing` で明示的に解放しないと、Wordのメモリが肥大化し、最悪の場合Wordがクラッシュします。

`Set rng = Nothing`

コードの最後には必ずこの一文を添える癖をつけてください。これだけで、あなたのコードの「格」が一段上がります。

まとめ:自動化は「未来の自分」への贈り物

今回紹介した技術は、単なるフォント置換ではありません。「環境に依存せず、どこでも同じレイアウトで開ける文書」を作るための基盤技術です。

マクロの記録から脱却し、こうしてロジックを組めるようになれば、あなたはもう「Wordを操作する人」から「Wordを制御するエンジニア」へ進化しています。

まずはこのコードをVBE(Visual Basic Editor)に貼り付け、適当な文書で試してみてください。何か不明点があれば、またいつでも聞きに来てくださいね。あなたの挑戦を応援しています!

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