【入門編】【中級者向け】印刷入稿の必須要件!全テキストのアウトライン化(カーブ変換)とフォント未埋め込みの自動チェッカー – CorelDRAW VBA解析バイブル

スポンサーリンク

こんにちは!CorelDRAW VBAの世界へようこそ。いつも業務自動化やデザインワークフローの改善、お疲れ様です。

デザインの現場で避けて通れないのが、印刷入稿時の「フォントのアウトライン化(カーブ変換)」ですよね。
「すべてアウトライン化したはずなのに、印刷会社から『フォントが未アウトラインのまま残っています』と差し戻されてしまった…」
「グループ化の奥深くや、PowerClip(マスク)の中に隠れていたテキストを見落としていた…」

このようなトラブルは、手作業はもちろん、CorelDRAWの標準機能や単純な「マクロの記録」だけで解決しようとすると、どうしても限界があります。

この記事では、マクロの記録から一歩踏み出し、CorelDRAWの内部構造を深く理解しながら、「ドキュメント内のすべてのテキストを漏れなくカーブに変換し、本当にテキストが残っていないかを二重チェックする」という、極めて実用的で堅牢なプロ仕様のマクロを作成します。

「ここをクリアすれば、CorelDRAW VBAの基本とオブジェクト操作はバッチリマスターできますよ」というポイントを、優しく、かつプロの視点から徹底的に解説していきますね。一緒に学んでいきましょう!

1. なぜ「マクロの記録」では失敗するのか?

プログラミング初学者の多くは、まず「マクロの記録」を使ってテキストのアウトライン化を記録しようとします。しかし、記録されたコードは通常、次のような形になります。

‘ マクロの記録で生成されるコードのイメージ(不完全な例)
ActiveDocument.ActivePage.Shapes.All.CreateSelection
ActiveSelection.ConvertToCurves

このアプローチには、実務において3つの致命的な死角が存在します。

1. 階層構造の死角: グループ化されたシェイプの中や、PowerClip(クリッピングコンテナ)の内部にあるテキストにアクセスできません。
2. レイヤー状態の死角: ロックされたレイヤーや、非表示レイヤーにあるテキストを処理しようとするとエラーで強制終了します。
3. 「変換できたつもり」の死角: 特殊効果(立体化やドロップシャドウなど)が適用されたテキストは、1回の変換コマンドではカーブに変わらない場合があります。

これらの死角を排除するためには、CorelDRAWドキュメントの階層構造(オブジェクトツリー)を正しく理解し、プログラムで1つひとつの要素を丁寧に走査(スキャン)していく必要があります。

2. CorelDRAWのドキュメント構造をビジュアルで理解する

CorelDRAWのデータ構造は、ツリー状の階層構造になっています。

ActiveDocument (ドキュメント)
└─ Pages (全ページ)
└─ Layers (各レイヤー)
└─ Shapes (図形・テキスト・グループ)
├─ Normal Shape (通常のパスやテキスト)
├─ Group Shape (グループ:内部にさらにShapesを持つ)
└─ PowerClip Shape (パワークリップ:内部に隠れたShapesを持つ)

見落としがちなテキストは、この図の「Group Shape」の奥深くや、「PowerClip Shape」の内部に隠れています。
今回のマクロでは、このツリー構造を最下層まで追いかける「再帰処理(Recursive Process)」という強力なテクニックを使って、すべてのテキストをあぶり出します。

3. 【実践】全自動アウトライン化&未埋め込みチェッカー(VBAコード)

それでは、実際に使えるVBAコードを紹介します。
このコードは、ただ変換するだけでなく、「実行後にドキュメント全体を再スキャンして、テキストが本当にゼロになったかを検証する」というダブルチェック機能を備えています。

CorelDRAWのVBAエディタ(`Alt + F11`)を開き、標準モジュールに以下のコードを貼り付けてください。

Option Explicit

‘ ==============================================================================
‘ メイン処理:全テキストのアウトライン化と検証
‘ ==============================================================================
Public Sub ConvertAllTextsToCurvesWithCheck()
Dim doc As Document
Set doc = ActiveDocument

‘ ドキュメントが開かれていない場合は処理を中断
If doc Is Nothing Then
MsgBox “アクティブなドキュメントが見つかりません。”, vbCritical, “エラー”
Exit Sub
End If

‘ ユーザーへの確認
Dim response As VbMsgBoxResult
response = MsgBox(“ドキュメント内のすべてのテキストをカーブに変換します。” & vbCrLf & _
“※念のため、実行前にファイルのバックアップを推奨します。” & vbCrLf & vbCrLf & _
“実行してもよろしいですか?”, vbYesNo + vbQuestion, “実行確認”)
If response = vbNo Then Exit Sub

‘ パフォーマンス最適化とUndo(元に戻す)のグループ化
On Error GoTo ErrorHandler
Optimization = True
doc.BeginCommandGroup “全テキストのカーブ変換”

Dim pageObj As Page
Dim convertedCount As Long
Dim lockedCount As Long

convertedCount = 0
lockedCount = 0

‘ 1. すべてのページをループ処理
For Each pageObj In doc.Pages
pageObj.Activate
‘ 各ページの全シェイプを走査してテキストを変換
ProcessShapesCollection pageObj.Shapes, convertedCount, lockedCount
Next pageObj

‘ 2. ダブルチェック(残存テキストの検証スキャン)
Dim remainingTextCount As Long
remainingTextCount = CountRemainingTexts(doc)

‘ 最適化の解除
doc.EndCommandGroup
Optimization = False
ActiveWindow.Refresh

‘ 3. 結果のレポート
Dim reportMsg As String
reportMsg = “【処理が完了しました】” & vbCrLf & vbCrLf & _
“・カーブに変換したテキスト: ” & convertedCount & ” 件” & vbCrLf

If lockedCount > 0 Then
reportMsg = reportMsg & “・ロックされていたためスキップ: ” & lockedCount & ” 件” & vbCrLf
End If

reportMsg = reportMsg & “・残存テキスト(未変換フォント): ” & remainingTextCount & ” 件” & vbCrLf & vbCrLf

If remainingTextCount = 0 Then
reportMsg = reportMsg & “🎉 完璧です!すべてのテキストが正常にアウトライン化されました。安全に入稿できます。”
MsgBox reportMsg, vbInformation, “検証合格”
Else
reportMsg = reportMsg & “⚠️ 警告:一部のテキストが変換されずに残っています!” & vbCrLf & _
“ロックされたレイヤーや、シンボル内のテキストを確認してください。”
MsgBox reportMsg, vbExclamation, “検証警告”
End If

Exit Sub

ErrorHandler:
‘ エラー発生時の安全な復旧処理
Optimization = False
doc.EndCommandGroup
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “システムエラー”
End Sub

‘ ==============================================================================
‘ 補助関数:再帰的にシェイプを探索し、テキストをカーブに変換する
‘ ==============================================================================
Private Sub ProcessShapesCollection(ByRef shps As Shapes, ByRef convertedCount As Long, ByRef lockedCount As Long)
Dim shp As Shape
Dim i As Long

‘ コレクションの要素数が変化しても安全なように、後ろからループを回す(重要)
For i = shps.Count To 1 Step -1
Set shp = shps(i)

‘ 1. ロックされているオブジェクトのハンドリング
If shp.Locked Then
‘ ロックされているテキストはカウントのみしてスキップ(または必要に応じてアンロック)
If shp.Type = cdrTextShape Then
lockedCount = lockedCount + 1
End If
GoTo NextShape
End If

‘ 2. テキストシェイプの発見と変換
If shp.Type = cdrTextShape Then
On Error Resume Next ‘ 変換エラー対策
shp.ConvertToCurves
If Err.Number = 0 Then
convertedCount = convertedCount + 1
End If
On Error GoTo 0

‘ 3. グループシェイプの場合は、内部を再帰探索
ElseCustom:
If shp.Type = cdrGroupShape Then
ProcessShapesCollection shp.Shapes, convertedCount, lockedCount

‘ 4. PowerClipコンテナの場合は、マスク内部を再帰探索
ElseIf Not (shp.PowerClip Is Nothing) Then
ProcessShapesCollection shp.PowerClip.Shapes, convertedCount, lockedCount
End If

NextShape:
Next i
End Sub

‘ ==============================================================================
‘ 検証関数:ドキュメント内に残っているテキストの総数をカウントする
‘ ==============================================================================
Private Function CountRemainingTexts(ByVal doc As Document) As Long
Dim pageObj As Page
Dim totalCount As Long
totalCount = 0

For Each pageObj In doc.Pages
totalCount = totalCount + ScanForTextCount(pageObj.Shapes)
Next pageObj

CountRemainingTexts = totalCount
End Function

‘ ==============================================================================
‘ 補助検証関数:再帰的にテキストの存在をカウント
‘ ==============================================================================
Private Function ScanForTextCount(ByRef shps As Shapes) As Long
Dim shp As Shape
Dim count As Long
count = 0

For Each shp In shps
If shp.Type = cdrTextShape Then
count = count + 1
End If

‘ グループ内のスキャン
If shp.Type = cdrGroupShape Then
count = count + ScanForTextCount(shp.Shapes)
‘ PowerClip内のスキャン
ElseIf Not (shp.PowerClip Is Nothing) Then
count = count + ScanForTextCount(shp.PowerClip.Shapes)
End If
Next shp

ScanForTextCount = count
End Function

4. プロが解説!ここが設計の超重要ポイント

このコードには、CorelDRAW VBAで安全かつ高速にバッチ処理を行うための、プロならではのノウハウが凝縮されています。いくつかのポイントを解説します。

① `For i = shps.Count To 1 Step -1`(逆順ループ)の魔術

通常、オブジェクトを処理するときは `For Each` や `1 To Count` でループを回しがちです。しかし、「オブジェクトの性質を変化させる処理(テキストをカーブに変換するなど)」を行う場合、要素数が動的に変化したり、コレクション内のインデックスがずれたりして、処理漏れやエラーの原因になります。
後ろ(`Count`)から逆順に処理していくことで、このインデックスのズレを完全に防ぐことができます。

② `Optimization = True` による超高速化

CorelDRAWは、VBAが図形を操作するたびに画面を再描画しようとします。何百個ものテキストを処理する場合、画面がチカチカして処理速度が著しく低下します。
`Optimization = True` を宣言することで、画面描画を一時的にフリーズさせ、処理速度を数十倍に引き上げることができます。処理が終わったら必ず `False` に戻すのが、プロの作法です。

③ PowerClipの内部まで見逃さない

CorelDRAW特有の機能である「PowerClip」。実態はマスクの中にオブジェクトが内包されている状態です。
コード内の `shp.PowerClip.Shapes` を探索するロジックにより、デザイナーが意図せずマスク内に残してしまったフォントも完璧に検出し、アウトライン化します。

5. 陥りやすいエラーと対策

マクロを実行する上で、以下の点に注意するとさらに安定性が増します。

  • ロックされたレイヤーの存在

オブジェクト自体がロックされていなくても、レイヤー自体がロックされていると変換できません。入稿前には、すべてのレイヤーのロックを解除してから実行することをお勧めします。

  • 段落テキスト(Paragraph Text)の溢れ

長い文章が入った「段落テキスト」をカーブに変換すると、枠からはみ出ていた文字が消えてしまうことがあります。あらかじめ美術用テキスト(Artistic Text)に変換するか、テキスト枠に十分な余裕を持たせておきましょう。

  • シンボル(Symbols)化されたオブジェクト

ドキュメント内で「シンボル」として定義されているテキストは、直接編集ができません。シンボルを一度分解(Revert to Shapes)してから実行する必要があります。

まとめ:自動化で「安心な入稿」を手に入れよう

お疲れ様でした!
今回ご紹介したマクロを使えば、これまで目視と手作業で行っていた「アウトライン漏れの確認」という精神的プレッシャーから解放されます。

「プログラムを組む」ということは、単に作業を楽にするだけでなく、「ヒューマンエラーをゼロにし、成果物の品質を100%に担保する」という素晴らしい価値を持っています。

このマクロをベースに、さらに「変換後に自動で別名保存(PDFやEPS形式にエクスポート)する機能」などを追加していけば、あなただけの最強の「ワンクリック入稿パッケージ作成ツール」が完成します。

一歩ずつ、CorelDRAW VBAの奥深い世界を楽しんで進んでいきましょう。あなたがデザインと開発の両面で活躍されることを、心から応援しています!

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