CorelDRAW VBAを極める:ストロークをアウトライン化する「堅牢な」自動化設計論
CorelDRAWでのプリプレス業務において、「線の太さ(ストローク)の追従問題」は、納品データのトラブル原因ランキングで常に上位に君臨する。デザインの拡大縮小時に線幅が維持され、意図しないビジュアル崩れを起こす……この修正に追われる時間は、自動化エンジニアにとって最も「無価値」な時間だ。
今日は、この問題をCorelDRAW VBAで一掃する。単なる変換コードではない。「なぜ既存のコードは事故を起こすのか」という視点から、プロダクション環境で耐えうる堅牢なアーキテクチャを伝授する。
—
1. なぜ「単純なループ」で事故が起きるのか
多くのエンジニアは、`ActivePage.Shapes`を単純な`For Each`で回して`ConvertToCurves`を呼ぶ。これがなぜ危険なのか。理由は2つだ。
1. スタックの汚染: ループ中にオブジェクトが変換・分割されることで、コレクションのインデックスがずれたり、メモリ参照が不安定になる(特にグループ化されたオブジェクト)。
2. 非破壊の欠如: ユーザーが「変換前のバックアップ」を忘れた場合、そのデータは二度と元に戻せない。
設計指針:
- ループ処理は常に「コレクションを配列に退避」してから行う。
- 処理対象を「選択範囲」または「ドキュメント全体」で明示的に切り替える。
- 変換処理は、エラーハンドリングを強固に組み込み、一箇所でも失敗したら全体を中断するのではなく、ログを残して次に進む(または安全に終了する)設計が必要だ。
—
2. 実装:プロダクション・グレードの変換コード
このコードは、現在選択中のオブジェクトを対象に、線属性を持つシェイプのみを抽出し、アウトライン化する。
Option Explicit
‘ ———————————————————
‘ メイン処理:選択オブジェクトのストロークをアウトライン化
‘ ———————————————————
Public Sub ConvertSelectedStrokesToCurves()
Dim sr As ShapeRange
Dim s As Shape
‘ エラーハンドリングの要:予期せぬ終了を防ぐ
On Error GoTo ErrHandler
Set sr = ActiveSelectionRange
If sr.Count = 0 Then
MsgBox “対象が選択されていません。”, vbExclamation
Exit Sub
End If
‘ 処理の高速化:描画更新を止める
Optimization = True
‘ 再帰的にグループ内も処理するために再構成
ProcessShapes sr
Optimization = False
ActiveWindow.Refresh
MsgBox “ストロークのアウトライン化が完了しました。”, vbInformation
Exit Sub
ErrHandler:
Optimization = False
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub
‘ ———————————————————
‘ 再帰的にシェイプを走査するエンジンの核
‘ ———————————————————
Private Sub ProcessShapes(sr As ShapeRange)
Dim s As Shape
For Each s In sr
‘ グループ化されている場合は再帰的に掘り下げる
If s.Type = cdrGroupShape Then
ProcessShapes s.Shapes
Else
‘ 線幅が0でない、かつ曲線に変換可能なオブジェクトのみを対象にする
If s.Outline.Type <> cdrOutlineNone Then
‘ ConvertToCurvesを呼ぶことで、線が独立したパスに変換される
s.Outline.ConvertToCurves
End If
End If
Next s
End Sub
—
3. 現場で生き残るための「鉄則」
1. グループ構造の破壊を防ぐ
上記のコードは、`ConvertToCurves`を適用してもグループ構造を維持するよう設計している。単純にドキュメント全体をフラットに変換するコードを書くと、デザイナーが苦労して組んだレイヤー構造が崩壊し、後工程で激怒されることになる。「変換対象の属性」だけを変えるという意識を持て。
2. プリフライトの自動化
このスクリプトを走らせる前に、必ず以下のチェックを自動で行うルーチンを噛ませるべきだ。
- ロックされたレイヤーの確認: ロックされているレイヤーがあるとエラーになるため、`s.Locked`のチェックを事前に行うこと。
- 非表示オブジェクトの扱い: 印刷に出ない非表示オブジェクトまで変換してデータ量を増やすのは無駄である。`s.Visible`のチェックをフィルタリング条件に加えるだけで、処理速度は劇的に向上する。
3. トランザクション・ログ
大量のファイルを処理する場合、ログを出力する簡単なテキスト生成機能を追加しておくことを強く推奨する。
‘ 簡単なログ書き出し例
Open “C:\temp\process_log.txt” For Append As #1
Print #1, Now & ” – Processed: ” & s.Name
Close #1
—
結論:自動化は「道具」ではなく「安全装置」である
ベクターイラストのアウトライン化は、単なる手間の削減ではない。「印刷事故というリスクを、コードの力でゼロにする」という防衛的なエンジニアリングだ。
今回提供したコードは、現場でそのまま使える「堅牢な骨格」だ。これをベースに、貴方のチームのワークフローに合わせた「フィルタリング条件(例:特定の色のみ変換しない、など)」を付け加えていってほしい。
CorelDRAW VBAは古臭い言語だと思われがちだが、そのAPIの深淵を理解すれば、これほど強力なプリプレス兵器はない。次回の記事では、この変換処理と連動させた「自動PDF書き出し&プリフライト統合フロー」について深掘りしよう。
手を動かせ。そして、退屈な作業は全てマシンに委ねろ。
