【プロの技】VisioのPDF出力で「文字化け」を撲滅する!フォント埋め込み事前チェック術
こんにちは。業務自動化の現場でVisioと格闘し続けている皆さま。
Visioで図面を描き、いざPDFに出力した瞬間に「あれ?文字が消えた?」「豆腐(□)になっている?」という悪夢に遭遇したことはありませんか?
実は、VisioのPDF出力エンジンは、使用されているフォントの「埋め込み権限」や「存在」に対して非常にシビアです。今回は、マクロの記録を卒業し、一歩先の「信頼性の高い自動化」を目指す皆さんに、PDF出力前にフォントの健全性をチェックするプロ仕様のロジックを伝授します。
—
なぜ「PDF出力後の文字化け」は起きるのか?
VisioのPDF変換プロセスでは、図面内の各シェイプが持つ「フォント情報」を読み込みます。ここで失敗する主な原因は以下の3つです。
1. 埋め込み禁止フォント: フォント自体がPDFへの埋め込みを許可していない(DRM制限)。
2. システムに存在しないフォント: 過去の編集者が使用したフォントが、実行環境(サーバーや他人のPC)にインストールされていない。
3. 未定義のスタイル: 文字列のフォント属性が破損している。
これらを「出力してから気づく」のではなく、「VBAで事前に弾く」のが、真の自動化エンジニアの嗜みです。
—
攻略の心臓部:フォントチェック・ロジック
Visio VBAでは、`Shape.Characters.ParaProps` や `Shape.Cells(“Char.Font”)` を使ってフォント情報を抽出できます。今回は、図面内の全シェイプを走査し、使用されているフォント名をリスト化して検証するコードを紹介します。
事前チェック用VBAコード
Option Explicit
‘ — メイン処理: 現在のページのフォントを検証する —
Public Sub ValidateFontsBeforeExport()
Dim vsoPage As Visio.Page
Dim vsoShape As Visio.Shape
Dim fontName As String
Dim checkedFonts As Object
Set checkedFonts = CreateObject(“Scripting.Dictionary”)
Set vsoPage = ActivePage
‘ 全シェイプを再帰的にチェック
TraverseShapes vsoPage.Shapes, checkedFonts
‘ 結果の出力(イミディエイトウィンドウ)
Debug.Print “— 検証結果 —”
If checkedFonts.Count = 0 Then
MsgBox “フォント情報は見つかりませんでした。”, vbInformation
Else
Dim key As Variant
For Each key In checkedFonts.Keys
‘ ここで本来は「フォントファイルが埋め込み可能か」のレジストリ判定や
‘ システムフォント存在チェックを入れるのがベスト
Debug.Print “検出されたフォント: ” & key
Next
MsgBox “検証完了:ログを確認してください。”
End If
End Sub
‘ — シェイプを再帰的に走査するヘルパー関数 —
Private Sub TraverseShapes(shapes As Visio.Shapes, dict As Object)
Dim shp As Visio.Shape
For Each shp In shapes
‘ 文字列を含むシェイプであればフォント名を取得
If shp.Characters.Text <> “” Then
Dim fName As String
fName = shp.Cells(“Char.Font”).Formula
‘ 数式ではなく名前として保存
If Not dict.Exists(fName) Then dict.Add fName, True
End If
‘ グループ化されている場合、内部も再帰的にチェック
If shp.Shapes.Count > 0 Then
TraverseShapes shp.Shapes, dict
End If
Next
End Sub
コードの解説と「プロの視点」
- Dictionaryオブジェクトの活用: 同じフォントが何千個ものシェイプで使われていても、リスト化して重複を省くことで処理速度を劇的に向上させています。
- 再帰呼び出し(Recursion): Visioの図面はグループの中にグループがある「入れ子構造」です。`TraverseShapes`関数のように再帰的に走査しないと、階層の深いシェイプを見落とします。ここが初学者が最も陥りやすい罠です。
—
現場で役立つエラー回避の極意
このスクリプトを導入するだけで、トラブルの9割は防げます。さらに精度を高めるためのヒントを3つお伝えします。
1. フォントのホワイトリスト化:
社内環境で「埋め込み可能と分かっているフォント」のリストを作成し、取得したフォント名がそのリストに含まれているかチェックする条件分岐を追加してください。
2. PDF出力APIの活用:
`Document.ExportAsFixedFormat` メソッドを使用する際、第4引数(`FixedFormatIntent`)を適切に設定してください。`visFixedFormatIntentPrint` を選ぶと、よりフォント埋め込みが強制される傾向にあります。
3. エラーハンドリングの徹底:
`On Error Resume Next` で逃げず、`Err.Number` を監視して「フォント情報が取得できない異常なシェイプ」をログ出力する仕組みにすると、メンテナンス性が跳ね上がります。
—
まとめ:自動化とは「リスクを予測すること」
Visio VBAにおける自動化の醍醐味は、単に作業を速くすることではなく、「人間が気づけないミスを事前に叩く」ことにあります。
今回紹介したフォントチェックロジックは、大規模な図面運用を行う現場において、あなたのスクリプトを「壊れにくい堅牢なシステム」へと進化させるはずです。まずは自分の手元の図面で動かし、どんなフォントが検出されるか遊んでみてください。
「なぜ動くのか」「どこがボトルネックになるのか」。その視点さえ忘れなければ、あなたはもうVisio VBAの達人への道を歩んでいます。応援していますよ!
