CorelDRAW VBAの深淵:テキストアウトライン化の「鉄則」と実装の極意
プロの現場において、入稿データのテキストアウトライン化は単なる作業ではない。「フォント欠損」という致命的な事故を防ぐための、最後の防衛ラインだ。
しかし、CorelDRAWのVBAでこの処理を安易に書くと、中規模以上のドキュメントではメモリリークや予期せぬクラッシュを招く。今日は、伝説的な安定性と速度を両立させるための「CorelDRAW VBAによるアウトライン化アーキテクチャ」を伝授する。
—
なぜ「単純なループ」ではいけないのか
多くの初心者が書くコードは、`ActivePage.Shapes`を単純にループさせ、`ConvertToCurves`を呼ぶだけだ。これには2つの重大な落とし穴がある。
1. グループ化されたオブジェクトの罠: テキストがグループ(`Group`)の中に埋め込まれている場合、単純なループではインデックスの整合性が崩れ、実行時エラーを引き起こす。
2. レイヤー構造の無視: ロックされたレイヤーや不可視レイヤーを考慮せず処理を強行し、ドキュメントの整合性を損なう。
我々プロは、再帰的探索(Recursive Search)を用いて、レイヤー構造を問わず「テキストオブジェクト」をピンポイントで捕捉し、処理を行う設計をとる。
—
実装:プロダクション・グレードのコード
以下のコードは、ドキュメント内の全ページ、全レイヤー、全グループを再帰的にスキャンし、テキストオブジェクトのみを安全にアウトライン化する。
‘ ———————————————————
‘ CorelDRAW アウトライン化・最適化エンジン
‘ ———————————————————
Public Sub ExecuteTextToCurves()
Dim doc As Document
Set doc = ActiveDocument
‘ 処理の高速化:画面描画と再計算を停止
Optimization = True
EventsEnabled = False
On Error GoTo Cleanup
‘ 全ページを順次処理
Dim p As Page
For Each p In doc.Pages
p.Activate
ProcessShapes p.Shapes
Next p
MsgBox “全テキストのアウトライン化が完了しました。”, vbInformation
Cleanup:
‘ 終了処理:環境を元に戻す
Optimization = False
EventsEnabled = True
If Err.Number <> 0 Then MsgBox “エラー発生: ” & Err.Description, vbCritical
End Sub
‘ 再帰的に形状を探索するコアエンジン
Private Sub ProcessShapes(shapes As shapes)
Dim s As Shape
Dim i As Long
‘ 逆順ループ:インデックスの変動を防ぐ鉄則
For i = shapes.Count To 1 Step -1
Set s = shapes(i)
‘ コンテナ(グループ等)の場合は再帰的に深掘り
If s.Type = cdrGroupShape Or s.Type = cdrCombinedPathsShape Then
ProcessShapes s.UngroupEx.Shapes ‘ 必要に応じて構造を保持したまま処理
ElseIf s.Type = cdrTextShape Then
‘ テキストオブジェクトならアウトライン化
s.ConvertToCurves
End If
Next i
End Sub
—
プロの知見:設計の要諦
1. 逆順ループ(Step -1)の絶対遵守
オブジェクトを操作する際、順方向(1 to Count)でループしてはならない。`ConvertToCurves`を実行すると、元のテキストオブジェクトは破棄され、新しいカーブオブジェクトが生成される。このとき、コレクションのインデックスがずれるため、順方向だと必ず処理漏れや「オブジェクトが見つかりません」というエラーが発生する。「削除・変換を伴うループは必ず最後尾から」。これは自動化エンジニアの鉄則だ。
2. Optimization と EventsEnabled
CorelDRAWのVBAは、各オブジェクトの変更のたびに画面再描画やイベント監視を行う。数千のテキストがある場合、これだけで処理時間は数倍に跳ね上がる。`Optimization = True` を設定することで、バックグラウンドでのメモリ操作に集中させ、劇的なパフォーマンス向上を実現できる。
3. 堅牢な保存とフォーマット変換
もしこのスクリプトを「入稿前自動保存」まで拡張したい場合、ファイルパスの命名規則にはデータベース的な一意性を確保することをお勧めする。
‘ ファイル保存のベストプラクティス
Dim exportPath As String
exportPath = “C:\Output\” & Left(doc.Name, InStrRev(doc.Name, “.”) – 1) & “_Outline.cdr”
doc.SaveAs exportPath, cdrCDRVersion15 ‘ 互換性のためバージョンを固定するのも手
—
最後に:自動化の先にあるもの
このスクリプトは、あなたの時間を奪う「繰り返し作業」を葬り去るための第一歩に過ぎない。しかし、業務自動化の本質は「コードを書くこと」ではなく、「ヒューマンエラーを物理的に排除する仕組みを作ること」にある。
テキストのアウトライン化は、単なる変換ではない。それは、制作の魂を「解釈の余地のない、唯一無二の図形」へと昇華させる儀式だ。このコードをあなたのツールボックスに加え、よりクリエイティブな課題に集中してほしい。
もし、さらに高度な「PDFプリフライト機能」や「社内DBとのメタデータ照合」が必要なら、いつでもこの場所へ来るといい。君の次の挑戦を待っている。
