CorelDRAW VBAを掌握せよ:プリプレス事故をゼロにする「完全アウトライン化」の極意
現場のエンジニア諸君。CorelDRAWでの入稿作業、まだ手作業で一つひとつテキストを確認しているのか?
「最後にアウトライン化を忘れてフォントが文字化けした」「隠れたレイヤーのテキストを見落とした」。そんなプリプレス事故は、個人の注意深さではなく、「自動化されたバリデーション」で防ぐのがエンジニアの流儀だ。
今日は、単に全オブジェクトをカーブ変換するだけの退屈なコードではない。「変換漏れを許さない堅牢な設計」と「実行後の検証ロジック」を組み合わせた、プロダクションレベルの自動化手法を伝授する。
—
1. なぜ「単純なループ」では失敗するのか
初心者が陥りがちなのが、`ActivePage.Shapes.All.ConvertToCurves` のような単純な処理だ。これには2つの致命的な欠陥がある。
1. ロックされたオブジェクトの無視: レイヤーがロックされていると、`ConvertToCurves` は黙ってスルーする。結果、変換漏れが発生する。
2. ネスト構造の突破力不足: グループ化されたテキスト、あるいはPowerClip内に潜むテキストに対して、再帰的な走査を行わない限り、変換は不完全になる。
真のエンジニアは、「全レイヤーを解放し、再帰的にすべてのコンテナを探索する」というアプローチを取る。
—
2. 堅牢なアウトライン化・検証スクリプト
以下のコードは、単にアウトライン化するだけでなく、実行後に「まだテキストオブジェクトが存在しないか」を再検査し、残存していれば即座に警告を出す設計になっている。
‘ CorelDRAW Automation: 全テキストアウトライン化 & 完了チェック
Public Sub RobustOutlineConverter()
Dim s As Shape
Dim p As Page
Dim l As Layer
Dim textFound As Boolean
‘ 1. 安全のためにアクティブドキュメントを保存推奨
‘ ActiveDocument.Save
‘ 2. 全レイヤーのロックを解除(事故防止のための強制操作)
For Each p In ActiveDocument.Pages
For Each l In p.Layers
l.Locked = False
Next l
Next p
‘ 3. 再帰的にテキストを探し、カーブ変換を実行
‘ FindShapesを用いてTextタイプを直接指定して処理する
ProcessShapes ActiveDocument.ActivePage.Shapes
‘ 4. 検証フェーズ:変換し損ねたテキストがないか走査
textFound = CheckForRemainingText(ActiveDocument.ActivePage.Shapes)
If textFound Then
MsgBox “【警告】変換不可能なテキストオブジェクトが残存しています!手動確認が必要です。”, vbCritical
Else
MsgBox “すべてのテキストがカーブへ変換されました。入稿準備完了です。”, vbInformation
End If
End Sub
‘ 再帰的にShapesを走査してカーブ変換する関数
Private Sub ProcessShapes(ss As Shapes)
Dim s As Shape
For Each s In ss
If s.Type = cdrTextShape Then
s.ConvertToCurves
ElseIf s.Type = cdrGroupShape Or s.Type = cdrContainerShape Then
ProcessShapes s.Shapes ‘ 再帰呼び出し
End If
Next s
End Sub
‘ 変換漏れを検知する関数
Private Function CheckForRemainingText(ss As Shapes) As Boolean
Dim s As Shape
For Each s In ss
If s.Type = cdrTextShape Then
s.Selected = True ‘ 該当箇所を明示的に選択させる
CheckForRemainingText = True
Exit Function
ElseIf s.Type = cdrGroupShape Or s.Type = cdrContainerShape Then
If CheckForRemainingText(s.Shapes) Then
CheckForRemainingText = True
Exit Function
End If
End If
Next s
End Function
—
3. コードの設計思想:なぜこの構造なのか
A. 再帰呼び出し(Recursion)の重要性
CorelDRAWのオブジェクトモデルにおいて、`Shapes`は階層構造を持つ。グループ、コンテナ、PowerClip…これらをフラットに扱うと、深い階層にあるテキストは無視される。`ProcessShapes`関数のように再帰的にメソッドを呼び出すことで、ドキュメントのあらゆる深淵に潜むテキストを狩り出すことができる。
B. 変換後のバリデーション(Verification)
自動化で最も怖いのは「正常に終了したと思い込むこと」だ。例えば、フォントが破損していたり、特定の特殊効果が適用されていると変換がスキップされることがある。`CheckForRemainingText`関数は、変換処理後に「もしテキストが見つかったら、それを選択状態にして警告を出す」という、デバッグを極限まで楽にする設計にしている。
C. 実務への統合に向けた注意点
- レイヤーの強制解放: `l.Locked = False` は強力だが、入稿用マスターデータの構造を変えてしまう可能性がある。運用環境に応じて、「作業用コピーを作成してから実行する」というロジックを先頭に追加することをお勧めする。
- エラーハンドリング: 大規模なドキュメントでは、メモリ消費が激しくなる。`DoEvents`をループに挟むことで、CorelDRAWが「応答なし」になるのを防ぐ心遣いも忘れないように。
—
結論:自動化は「品質」への投資である
今回紹介したコードは、単なるツールではない。「フォントトラブルによる刷り直し」という、企業にとって最も避けるべきコストをゼロにするための防波堤だ。
自動化エンジニアの役割は、コードを書くことではない。「人が介在する隙(=ミス)をコードで埋めること」だ。このスクリプトをベースに、君たちの現場の運用フローに合わせて最適化してほしい。
健闘を祈る。何かあれば、またコードの深淵で会おう。
