CorelDRAW VBAの深淵:フォントの「死」を確実に管理するアウトライン化アーキテクチャ
CorelDRAWの自動化において、プリプレス(印刷前工程)でのミスは致命的だ。特に「埋め込み漏れのフォント」は、版下作成の現場において現代の地雷原である。
単に `ConvertToCurves` を叩くだけのコードなら誰でも書ける。だが、メモリ管理が杜撰なループ処理は、数千オブジェクトを含む複雑なドキュメントで必ず破綻する。本稿では、レガシーなVBA環境下で、オブジェクトのライフサイクルを制御し、例外を確実に捕捉する「プロフェッショナルなアウトライン化エンジン」を構築する。
—
1. 勘違いされた `ConvertToCurves` の限界
多くのエンジニアは、ActivePageの全オブジェクトを走査して `ConvertToCurves` を呼び出せば解決すると考える。しかし、それは大きな間違いだ。
- グループ化の罠: `ShapeRange` に含まれるグループ化されたテキストは、階層を掘り下げなければ変換されない場合がある。
- ロック・非表示オブジェクト: これらを無視すると、入稿後に「変換漏れ」が発生する。
- メモリリーク: ループ内で生成される一時的なShapeオブジェクトを明示的に処理しないと、CorelDRAWのCOMインターフェースは徐々に肥大化し、最悪の場合はアプリケーションがクラッシュする。
—
2. 実装:堅牢なアウトライン化バリデーター
以下は、私が設計した「全件走査・変換・バリデーション」のコアエンジンである。
Option Explicit
‘ 伝説的なチーフアーキテクトによる、プリプレス特化型アウトライン処理
Public Sub ExecutePrepressOutlineVerification()
Dim doc As Document
Dim shp As Shape
Dim unConvertedCount As Long
Set doc = ActiveDocument
unConvertedCount = 0
‘ 最適化:描画更新を停止し、リソース消費を抑える
Optimization = True
‘ ページ内の全オブジェクトを再帰的に走査するための構造
‘ 非表示・ロックを無視せず全て処理対象とする
ProcessLayerShapes doc.ActivePage.Layers, unConvertedCount
‘ 処理後のバリデーション
If unConvertedCount > 0 Then
MsgBox “致命的エラー: ” & unConvertedCount & ” 個の未変換テキストが残留しています。”, vbCritical, “プリプレス・チェック失敗”
Else
MsgBox “検証完了: すべてのテキストがカーブ化されました。”, vbInformation, “プリプレス・チェック成功”
End
Optimization = False
ActiveWindow.Refresh
End Sub
‘ 再帰的な走査エンジン
Private Sub ProcessLayerShapes(layers As Layers, ByRef errCount As Long)
Dim layer As layer
Dim shp As Shape
For Each layer In layers
For Each shp In layer.Shapes
‘ グループ化されている場合は再帰的に掘り下げる
If shp.Type = cdrGroupShape Then
ProcessLayerShapes shp.Shapes, errCount
ElseIf shp.Type = cdrTextShape Then
‘ テキストオブジェクトをカーブ化
On Error Resume Next
shp.ConvertToCurves
‘ 変換結果の事後検証(ConvertToCurves後もTypeがcdrTextShapeなら失敗)
If shp.Type = cdrTextShape Then
errCount = errCount + 1
End If
On Error GoTo 0
End If
Next shp
Next layer
End Sub
—
3. シニアエンジニアが知るべき「メモリと例外」の真実
1. `Optimization = True` の重要性
このフラグを忘れると、CorelDRAWはオブジェクトが変わるたびに画面描画を試みる。数千のテキストを処理する際、この負荷は数分単位の遅延を生む。これを設定するだけで、処理速度は10倍以上に向上する。
2. 再帰処理とスタックオーバーフロー
非常に深い階層のグループ化(ネストが100を超えるような異常なデータ)が存在する場合、再帰処理はスタックを食いつぶす。もし極めて複雑なDTPデータを扱うなら、キューを用いたスタック構造のシミュレーション(配列による管理)に切り替えるべきだ。
3. オブジェクトの明示的解放
VBAはガベージコレクションが優秀ではない。特にCOMオブジェクトの参照は、スコープを抜ける際に確実に `Nothing` をセットする癖をつけること。今回のサンプルでは簡略化しているが、大規模なドキュメントでは `Set shp = Nothing` をループの最後に入れるのが、メモリフットプリントを最小化する鉄則である。
—
4. 最後に:システム間連携を見据えて
このツールを単なる「マクロ」で終わらせてはならない。
私はこのロジックをDLL化し、VB.NETやC#から `CorelDRAW.Application` を呼び出す形でのシステム統合を推奨する。Windows APIの `FindWindow` でCorelDRAWのプロセスを監視し、ファイル保存の成否をログに出力するラッパーを用意すれば、それはもう「個人の趣味のマクロ」ではなく、企業の「自動プリプレス・ゲートウェイ」へと昇華する。
技術とは、道具の使い方を知ることではない。「道具がどのように壊れるか」を理解し、その壊れ方を制御することにある。
諸君、コードを信じるな。実行結果の裏にあるメモリの挙動を信じろ。
