【実務・中級編】【初心者向け】ドキュメント内のすべてのテキストオブジェクトをスキャンしてフォント名の一覧をイミディエイトウィンドウに出力する手法 – CorelDRAW VBA解析バイブル

スポンサーリンク

CorelDRAW VBAを掌握せよ:フォントの「棚卸し」を自動化する職人の流儀

業務自動化の現場において、「ドキュメント内の全フォントを把握する」という作業は、単なる確認作業ではありません。これは、入稿時のトラブルを未然に防ぎ、印刷事故という最大の損失を回避するための「防衛ライン」です。

CorelDRAWの深い階層構造を理解せず、ただループを回すだけのコードは、複雑なグループ化やレイヤー構造の前であっけなく沈黙します。今日は、実務に耐えうる「堅牢で、速く、美しい」テキスト解析の設計図をあなたに授けます。

なぜ「雑な走査」ではいけないのか?

多くの初心者が陥る罠は、`ActivePage.Shapes` を単純にループさせることです。しかし、CorelDRAWのオブジェクトモデルには「ネスト(入れ子)」という概念があります。グループの中にグループがあり、さらにその中にテキストがある……という構造を無視すれば、あなたのマクロはドキュメントの半分も解析できないでしょう。

真のエンジニアは、「再帰処理(Recursion)」という武器を使います。階層の深さを問わず、すべてのオブジェクトを掘り起こす設計こそが、プロダクション環境で信頼されるコードの条件です。

実装:プロフェッショナルなフォントスキャナー

以下のコードは、単にイミディエイトウィンドウに結果を吐き出すだけではありません。`Scripting.Dictionary` を利用して重複を排除し、解析後のデータ加工を容易にする設計にしています。

Option Explicit

‘ メインプロシージャ
Public Sub ListUsedFonts()
Dim fontDict As Object
Set fontDict = CreateObject(“Scripting.Dictionary”)

‘ ドキュメントが開かれているか確認
If Documents.Count = 0 Then
MsgBox “ドキュメントを開いてください。”, vbExclamation
Exit Sub
End If

‘ 再帰的に全シェイプをスキャン
ScanShapes ActivePage.Shapes, fontDict

‘ 結果の出力
Debug.Print “— 使用フォント一覧 —”
Dim key As Variant
For Each key In fontDict.Keys
Debug.Print key
Next
Debug.Print “— 計 ” & fontDict.Count & ” 種類のフォントを発見 —”
End Sub

‘ 再帰的にオブジェクトを走査するアーキテクチャ
Private Sub ScanShapes(shapes As shapes, fontDict As Object)
Dim s As shape
For Each s In shapes
‘ グループ化されている場合は内部を再帰的に走査
If s.Type = cdrGroupShape Then
ScanShapes s.shapes, fontDict
‘ テキストオブジェクトであればフォント名を抽出
ElseIf s.Type = cdrTextShape Then
Dim fontName As String
fontName = s.Text.Story.Font
‘ 重複排除して辞書に追加
If Not fontDict.Exists(fontName) Then
fontDict.Add fontName, True
End If
End If
Next
End Sub

コードの解説と「設計の急所」

1. 再帰構造(ScanShapes): `s.Type = cdrGroupShape` の分岐が肝です。グループを見つけるたびに自分自身を呼び出すことで、ドキュメントの構造がどれほど複雑にネストされていても、最深部まで確実にリーチします。
2. `Scripting.Dictionary` の活用: 配列をループで回して「既出かどうか」を判定するのは計算効率が悪いです。辞書オブジェクトを使えば、キー(フォント名)が存在するかどうかを高速に判定でき、コードも簡潔になります。
3. エラーハンドリングの思考: 本番環境では、破損したテキストオブジェクトや、予期せぬレイヤー構造が存在する可能性があります。今回はシンプルに構成しましたが、本格運用時には `On Error Resume Next` を適切に配置し、スタックオーバーフローを避ける工夫が必要です。

次のステップ:データベース連携への布石

このコードで抽出したフォント名リストは、単に眺めるためのものではありません。以下のように拡張することで、自動化の価値は飛躍的に高まります。

  • Excelへの書き出し: `CreateObject(“Excel.Application”)` を介して、フォントの一覧をシートに転記し、社内の「使用可能フォント管理台帳」と照合する。
  • プリフライトチェック: 特定の禁止フォントが混入していた場合に、アラートを出し、該当オブジェクトの座標を取得してユーザーに警告する(これは上級編のテクニックです)。

最後に:エンジニアとしての矜持

VBAはレガシーな言語だと揶揄されることもあります。しかし、CorelDRAWの強力なAPIを掌握し、業務上の課題を数秒で解決するこの力は、どんな最新言語にも負けない「最強の武器」です。

今日書いたこのコードを、単なる「動くもの」で終わらせないでください。「なぜこのアルゴリズムなのか」「どうすればもっと速くなるのか」を常に自問自答する。その姿勢こそが、あなたを単なるマクロ作成者から、真の業務自動化エンジニアへと進化させるはずです。

さあ、エディタを開き、あなたのドキュメントを解析してみてください。そこに潜む無秩序なフォントたちを、あなたのコードで秩序立てるのです。

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