こんにちは!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の奥深い世界を楽しんで進んでいきましょう。あなたがデザインと開発の両面で活躍されることを、心から応援しています!
