現場のエンジニアへ: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は、使いこなせば最強の自動化兵器となる。コードの海で溺れるな。構造を理解し、メモリを支配せよ。それが、プロのエンジニアの流儀だ。
