【実務・中級編】【中級者向け】グラフィック内の全テキストオブジェクトのアウトライン化(カーブ変換)を一括で行う入稿前チェッカー – CorelDRAW VBA解析バイブル

スポンサーリンク

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とのメタデータ照合」が必要なら、いつでもこの場所へ来るといい。君の次の挑戦を待っている。

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