こんにちは。Visioの世界へようこそ。
「マクロの記録」ボタンを押すだけの世界から一歩踏み出し、自らの手でVisioを制御しようとしているあなたを歓迎します。
VisioでPDFを出力する際、最も頭を抱えるのが「フォント埋め込みエラー」です。PDFを開いた瞬間、文字化けしていたり、フォントが勝手に置き換わってレイアウトが崩れていたり……。あれは本当に胃が痛くなりますよね。
今回は、そんな悲劇を未然に防ぐための「フォント検閲ルーチン」を一緒に構築していきましょう。これを実装すれば、あなたのVBAエンジニアとしての格が一段上がります。
—
なぜVisioのPDF出力でフォントが化けるのか?
原因はシンプルです。「PDF出力時に、そのフォントが埋め込みを許可されていない(あるいはライセンス的に制限されている)」からです。
Visioは非常に柔軟なアプリケーションですが、PDF変換エンジンは正直です。埋め込めないフォントがあれば、標準フォントに置換してしまう。その結果、図面の命である「レイアウト」が崩壊します。
これを防ぐには、「出力前に、使用されている全てのフォントをプログラムで洗い出し、ブラックリストと照合する」というプロセスを自動化するのが正解です。
—
現場で使える「フォント検閲」ロジック
以下のコードは、図面内の全シェイプを巡回し、使用されているフォントの名前を取得して、特定の条件(埋め込み不可フォントなど)に該当しないかチェックするものです。
実装コード
‘ Visioの全ページ・全シェイプからフォントを抽出するロジック
Public Sub CheckFontsBeforeExport()
Dim vsoPage As Visio.Page
Dim vsoShape As Visio.Shape
Dim fontName As String
Dim hasError As Boolean
hasError = False
‘ 警告すべきフォントリスト(ここに埋め込み不可のフォント名を入れる)
Dim forbiddenFonts As String
forbiddenFonts = “|MS Gothic|MS Mincho|SimSun|” ‘ 区切り文字で管理
‘ 全ページをループ
For Each vsoPage In ActiveDocument.Pages
‘ 全シェイプを再帰的にチェックするプロシージャへ
If CheckShapesInPage(vsoPage, forbiddenFonts) Then
hasError = True
End If
Next vsoPage
If hasError Then
MsgBox “警告: 埋め込み不可のフォントが検出されました。PDF出力前に修正してください。”, vbCritical
Else
MsgBox “フォントチェック完了:安全です。PDFを出力します。”, vbInformation
‘ ここにPDF出力の処理を記述
‘ ActiveDocument.ExportAsFixedFormat …
End If
End Sub
‘ 再帰的にシェイプを走査する関数
Private Function CheckShapesInPage(obj As Object, forbiddenList As String) As Boolean
Dim shp As Visio.Shape
Dim currentFont As String
For Each shp In obj.Shapes
‘ テキストがあるシェイプならフォントを取得
If shp.Text <> “” Then
currentFont = shp.Cells(“Char.Font”).Formula
‘ 余計なダブルクォーテーションを削除して比較
currentFont = Replace(currentFont, “”””, “”)
‘ ブラックリストに含まれているかチェック
If InStr(forbiddenList, “|” & currentFont & “|”) > 0 Then
Debug.Print “不適切なフォントを検出: ” & currentFont & ” (シェイプ名: ” & shp.Name & “)”
CheckShapesInPage = True ‘ エラーフラグを立てる
End If
End If
‘ グループ化されている場合は再帰的に中身をチェック
If shp.Shapes.Count > 0 Then
If CheckShapesInPage(shp, forbiddenList) Then CheckShapesInPage = True
End If
Next shp
End Function
—
コードのポイント:なぜ「再帰」を使うのか?
プログラミング初心者が陥りやすい罠が、「一番上の階層のシェイプしか見ない」ことです。Visioの図面はグループ化の塊(入れ子構造)です。
このコードでは、「再帰呼び出し(Recursive Call)」という手法を使っています。グループの中にグループがある場合でも、中身を次々と潜って探索し続けるため、どんなに複雑な図面でもフォントの漏れを許しません。
陥りやすいエラーと対策
1. 「Textプロパティにアクセスできない」エラー:
テキストを持っていないシェイプ(コネクタや図形など)に`shp.Text`でアクセスするとエラーになることがあります。実務では `On Error Resume Next` を活用するか、事前に `shp.Type` を確認するフィルタリングを入れるとより堅牢になります。
2. グループ構造の深さ:
あまりに深くグループ化された図面だと、処理速度が落ちます。しかし、PDF出力という重い処理の前であれば、この程度の負荷は誤差の範囲です。
—
最後に:エンジニアとしての一歩先へ
「とりあえず動けばいい」コードは、誰でも書けます。しかし、「将来発生するであろうエラーを予測し、それを未然に防ぐコード」を書くのが、一流のエンジニアです。
このフォントチェックロジックをあなたのツールボックスに入れておけば、もう「PDFを開いて真っ青になる」ことはありません。
まずはこのコードをコピーして、ご自身の環境で動かしてみてください。「フォント名」を書き換えて、自分の図面がどう判定されるか試してみるのが、一番の学習の近道です。
さあ、自動化の力で、もっとクリエイティブな仕事に時間を使いましょう!
