【テクニカル・上級編】【初心者向け】ドキュメント内の全テキストフレームのフォントファミリーを一覧化し重複を除いて出力する基本スクリプト – CorelDRAW VBA解析バイブル

スポンサーリンク

現場のエンジニアへ:CorelDRAW VBAにおける「フォント監査」の真髄

CorelDRAWの自動化に携わる諸君。諸君が日常的に扱うベクターデータは、単なる図形ではない。それは膨大なオブジェクトのライフサイクルが凝縮された「動的な構造体」だ。

特に、クライアントから持ち込まれる「混沌としたドキュメント」を整理する際、フォントの棚卸しは避けて通れない。これを手動で行うのはエンジニアの恥だ。今回は、ドキュメント内の全テキストフレームをスキャンし、重複を排除してフォント名を抽出する、堅牢かつ「メモリ効率を意識した」スクリプトを伝授する。

1. なぜ「力技」ではいけないのか

初心者は `ActiveDocument.Pages` を単純にループさせれば良いと考えがちだ。しかし、CorelDRAWのオブジェクトモデル(VBA)は、メモリ管理において非常にデリケートである。

  • 再帰的探索の罠: `Layer`、`Group`、そして `PowerClip` 内の `Shape` は、階層構造を成している。これらを深追いする際にオブジェクトを不用意に保持し続けると、スタックオーバーフローやメモリリークを招く。
  • コレクションの最適化: 重複排除には `Scripting.Dictionary` を使用する。これはハッシュテーブルとして実装されており、リストの照合コストを $O(1)$ に抑えるための必須の選択だ。

2. 実装:高速フォント監査エンジン

以下のコードは、単なるフォント抽出ではない。`Shape` の再帰的探索を行い、メモリを解放しながら効率的にフォント名を蓄積するアーキテクチャだ。

Option Explicit

‘ 伝説的なエンジニアは、無駄なオブジェクトを保持しない
Public Sub AuditUsedFonts()
Dim dict As Object
Set dict = CreateObject(“Scripting.Dictionary”)

‘ ドキュメントの最適化:画面更新を止めることで描画コストをゼロにする
Optimization = True

‘ 再帰的に全ページ・全レイヤーを探索
Dim p As Page
For Each p In ActiveDocument.Pages
ProcessShapes p.Shapes, dict
Next p

‘ 結果を出力
Dim msg As String
msg = “【検出されたフォント一覧】” & vbCrLf & Join(dict.Keys, vbCrLf)
MsgBox msg, vbInformation, “Font Audit Report”

‘ 明示的解放
Set dict = Nothing
Optimization = False
End Sub

‘ 階層構造を再帰的にトラバースする真のエンジン
Private Sub ProcessShapes(shapes As shapes, dict As Object)
Dim s As Shape
For Each s In shapes
‘ テキストフレームのみをフィルタリング
If s.Type = cdrTextShape Then
Dim fontName As String
fontName = s.Text.Story.Font
If Not dict.Exists(fontName) Then
dict.Add fontName, True
End If
End If

‘ グループやPowerClip内のネストを解決
If s.HasShapes Then
ProcessShapes s.Shapes, dict
End If
Next s
End Sub

3. チーフアーキテクトからの助言:さらなる極みへ

このコードを「完成形」だと思ってはいけない。現場のシステム管理者として、さらに先へ進むための知見を共有する。

  • Win32 APIの活用:

もし大規模なドキュメントで実行速度がボトルネックとなるなら、`Windows API` を呼び出し、Windowsのフォントキャッシュを直接叩く手法も検討すべきだ。VBAのオブジェクトモデルを通すよりも、システムレベルでのアクセスの方が、特に数千のテキストフレームがある場合には圧倒的に高速だ。

  • メモリの明示的解放:

VBAのガベージコレクションは信用するな。`Set s = Nothing` をループの最後に入れるような微細な工夫が、長時間稼働するバッチ処理では命取りになる。

  • レガシー対応:

古いCorelDRAWバージョン(X4〜X6世代)では、`Story` オブジェクトのプロパティが安定しないことがある。その場合は、`TextRange` を介してフォントへアクセスするよう、ラッパー関数を用意するのが定石だ。

結び

このスクリプトは、諸君の現場における「最初のピース」に過ぎない。これをベースに、不要なフォントを自動置換するエンジンや、社内標準フォント以外を使用している場合に警告を発するバリデーターへと拡張せよ。

CorelDRAW VBAは、使いこなせば最強の自動化兵器となる。コードの海で溺れるな。構造を理解し、メモリを支配せよ。それが、プロのエンジニアの流儀だ。

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