こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステージから抜け出し、「自分の手でドキュメントを完全にコントロールしたい」と願うあなたなら、きっと今日のテーマにワクワクするはずです。
印刷入稿前の現場で、最も恐れられているトラブルは何だと思いますか?
そう、「フォントの文字化け・置き換わり」です。
どれほど完璧なデザインを作っても、印刷所の環境にそのフォントがインストールされていなければ、文字は無残に崩れ去ります。これを防ぐ唯一にして最強の手段が、すべての文字を図形(カーブ)に変換する「アウトライン化(カーブに変換)」です。
今回は、ドキュメント内の全テキストを総スキャンし、一網打尽にカーブ化しながら、万が一処理しきれなかった文字グリカを自動検出してアラートを鳴らす「実務直結のガーディアン・マクロ」をあなたに授けましょう。
ここをクリアすれば、あなたのCorelDRAW VBAスキルは間違いなく中級者の域に達します。さあ、一緒に本質を学んでいきましょう!
—
なぜ「手動」ではなく「VBA」なのか?
「選択して、右クリックして、カーブに変換……これを全ページやればいいのでは?」
そう思ったあなた、ページ数が50ページあるカタログや、複雑なレイヤー構造が入り組んだデータでも同じことが言えますか?
手動作業には以下のリスクが伴います。
- ロックされたレイヤーや非表示レイヤーのテキストを見落とす
- パワーグリップ(コンテナ)の内部に隠れたテキストに気づかない
- 作業者のヒューマンエラーによる入稿事故
VBAを使えば、ドキュメントの隅々までミリ秒単位で巡回し、人間には不可能なスピードと正確性でテキストを追い詰めることができます。プロのエンジニアは、「根性」ではなく「コード」でミスを防ぐのです。
—
1. コアロジックの全体像
今回作成するマクロの全体像は以下の通りです。
1. ドキュメント全体を再帰的にスキャン(通常のシェイプだけでなく、グループやパワーグリップの中も深掘りします)
2. テキストフレームを発見したら即座にカーブ化 (`ConvertToCurves` メソッド)
3. もし何らかの理由でテキストが残ってしまったら、エラーリストとしてキャッチ
4. 処理結果をポップアップで報告
まずは、実際にあなたのCorelDRAWで動かせる実用コードを公開します。VBAエディタ(`Alt + F11`)を開き、標準モジュールに貼り付けてみてください。
—
2. 実装コード:テキスト完全アウトライン化チェッカー
Sub ForceConvertTextToCurvesAndCheck()
Dim doc As Document
Set doc = ActiveDocument
If doc Is Nothing Then
MsgBox “アクティブなドキュメントがありません。”, vbCritical, “エラー”
Exit Sub
End If
‘ 画面描画をロックしてパフォーマンスを爆発的に上げる(プロの基本技)
doc.BeginCommandGroup
Optimization = True
EventsEnabled = False
Dim totalConverted As Long
Dim remainingTextCount As Long
totalConverted = 0
remainingTextCount = 0
On Error GoTo ErrorHandler
‘ ドキュメント内の全シェイプ(ページを跨ぐ、またはアクティブページ)をスキャン
Dim sh As Shape
‘ 今回はアクティブページの全シェイプを対象とします(全ページ展開する場合はActiveDocument.Pagesをループします)
Dim srs As ShapeRange
Set srs = doc.ActivePage.Shapes.FindShapes(Query:=”@type = ‘text:artistic’ or @type = ‘text:paragraph'”)
Dim targetShape As Shape
For Each targetShape In srs
‘ テキストフレームであるか再確認
If targetShape.Type = cdrTextShape Then
On Error Resume Next
‘ テキストをカーブに変換
Dim convertedSh As Shape
Set convertedSh = targetShape.ConvertToCurves
If Err.Number = 0 Then
totalConverted = totalConverted + 1
Else
‘ 変換に失敗した場合のカウント
remainingTextCount = remainingTextCount + 1
End If
On Error GoTo ErrorHandler
End If
Next targetShape
‘ 処理終了のクリーンアップ
Optimization = False
EventsEnabled = True
doc.EndCommandGroup
doc.Window.Refresh
‘ 結果レポートの表示
If remainingTextCount = 0 Then
MsgBox “入稿チェック完了!” & vbCrLf & _
“すべてのテキスト(” & totalConverted & “個)を正常にカーブ化しました。”, _
vbInformation, “完全合格”
Else
MsgBox “【警告】未処理のテキストが ” & remainingTextCount & ” 個検出されました!” & vbCrLf & _
“ロックされたレイヤーや特殊なフォントがないか確認してください。”, _
vbExclamation, “要確認”
End If
Exit Sub
ErrorHandler:
‘ 予期せぬエラー時のフェイルセーフ
Optimization = False
EventsEnabled = True
doc.EndCommandGroup
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “システムエラー”
End Sub
—
3. コードのキモを徹底解説!プロの技術力
このコードには、CorelDRAW VBAを極めた者だけが知る「パフォーマンスと安全性」の知見が詰まっています。いくつか重要なポイントを解説しましょう。
① パフォーマンスの爆速化 (`Optimization = True`)
CorelDRAWは、VBAからシェイプを1つ操作するたびに、画面の再描画(プレビューの更新)を行おうとします。これがマクロを極端に遅くする原因です。
処理の最初に `Optimization = True` と `EventsEnabled = False` を宣言し、処理が終わったら元に戻す。これだけで、数千個のオブジェクトを扱う大規模データでも、一瞬で処理が終わるようになります。
② 強力なクエリ検索 (`FindShapes`)
愚直にすべてのシェイプをひとつずつループして「テキストかどうか?」を判定するのは素人のやり方です。
`doc.ActivePage.Shapes.FindShapes(Query:=”@type = ‘text:artistic’ or @type = ‘text:paragraph'”)`
このようにXPath風のクエリ言語を使うことで、CorelDRAWの内部エンジンに直接「テキストだけ持ってこい」と命令できます。これが圧倒的な処理速度を生み出します。
③ 安全ネットとしてのエラーハンドリング
フォントのライセンス保護や、特殊な効果(ブレンドやエンベロープ等)が適用されているテキストは、まれに `ConvertToCurves` が失敗することがあります。
`On Error Resume Next` と `Err.Number` の監視を挟むことで、1つのテキストでマクロ全体がクラッシュするのを防ぎ、最後に「未処理文字がある」と正確にアラートを上げることが可能です。
—
4. 陥りやすい罠とアドバイス
実際にこのコードを運用し始めると、いくつかの「CorelDRAWの仕様」にぶぶつかります。ここで先回りして解決策をお伝えしておきます。
- 罠1: レイヤーがロックされている
- 対策: ロックされたレイヤー上のテキストは、VBAから変更を加えることができません。スキャン前に必ずすべてのレイヤーのロックを解除する、あるいはエラーとして検知する設計にしています。
- 罠2: シンボルやマスターページにあるテキスト
- 対策: アクティブページだけでなく、全ページのマスターレイヤーやシンボル定義内まで完全に網羅したい場合は、`doc.Pages` や `doc.MasterLayer` を走査するロジックに拡張すると完璧です。
—
まとめ:あなたの武器は、もう「マクロの記録」ではない
お疲れ様でした!今回は、実務で直面する「フォントのアウトライン化と未検出アラート」という、非常に価値の高いテーマを通じて、CorelDRAW VBAの裏側の仕組みを解説しました。
ここをクリアしたあなたなら、単なる「操作の自動化」ではなく、「品質を担保するシステム」を自分で構築できる実力がついています。
現場のデザイナーや印刷オペレーターを文字化けの恐怖から救うヒーローとして、ぜひこのマクロをあなたのワークフローに組み込んでみてください。
それでは、次回の高度なVBA解説でお会いしましょう。あなたの開発ライフが素晴らしいものになりますように!
