こんにちは!CorelDRAWの自動化(VBA)の世界へようこそ。
「何百ページもあるカタログのフォントを、一瞬で別のフォントに差し替えたい…」
「文字サイズや色を、特定のルールで一括変更できたらどれほど楽か…」
そんなふうに思ったことはありませんか?
マクロの記録から一歩踏み出し、自分でコードを書き始めると、CorelDRAWは「ただのドローソフト」から「超高速な自動レイアウトマシン」へと変貌します。
しかし、いざVBAで大量のテキストを処理しようとすると、「処理が重くてCorelDRAWがフリーズする」「画面がチカチカして進まない」という壁にぶつかりがちです。
安心してください。この記事を読めば、CorelDRAWの裏側(オブジェクトモデル)の仕組みを理解し、数百個のテキストフレームをわずか数秒で処理するプロのテクニックが身につきます。「ここをクリアすれば、CorelDRAW VBAの基本はバッチリですよ」というポイントを、優しく丁寧に解説していきますね。
—
1. CorelDRAWの「オブジェクト階層」を理解しよう
コードを書く前に、まずはCorelDRAWがドキュメントをどう見ているか(オブジェクトモデル)を整理しましょう。ここが頭に入っていると、コードの迷子がなくなります。
CorelDRAWの階層構造は、まるでおもちゃの「マトリョーシカ」のようになっています。
[Application] (CorelDRAW本体)
└ [Document] (開いているファイル)
└ [Page] (ページ)
└ [Layer] (レイヤー)
└ [Shape] (文字、四角、丸などのオブジェクト)
└ [Text] (テキスト情報)
私たちが文字を変更したいとき、「アプリケーションの中の、このドキュメントの、このページの、このレイヤーにある、テキスト型のシェイプ(Shape)」と、順番に掘り下げて指定していく必要があります。
—
2. なぜ遅い?パフォーマンスを蝕む「3つの原因」
マクロの記録で作成したコードが遅い理由は、VBAが処理を実行するたびに、CorelDRAWが真面目に以下の処理を行っているからです。
1. 画面の再描画(Redraw): 1文字変わるたびに、画面をきれいに描き直す。
2. アンドゥ(元に戻す)情報の記録: 1回変更するたびに、「元に戻す」履歴に保存する。
3. イベントの監視: 「オブジェクトが変更された」という通知をソフト内で毎回やり取りする。
オブジェクトが10個なら気になりませんが、500個、1000個となると、この「真面目な処理」のせいでパソコンが悲鳴を上げます。
これを防ぐために、プロは「マクロの開始時にこれらを一時停止し、終わったら再開する」という魔法のラッパー(包み紙)を使います。
—
3. 超高速化を実現する「魔法の3点セット」
高速化のためのコードパターンは、以下の3つです。
- `Application.Optimization = True` (画面描画をフリーズさせて超高速化!)
- `ActiveDocument.BeginCommandGroup` (大量の処理を「1回のアンドゥ」にまとめる)
- `Application.EventsEnabled = False` (余計なイベント通知をカット)
これらを組み合わせた、実用的なテンプレートコードを見てみましょう。
—
4. 【実践コード】高速テキスト走査&フォント一括置換
このコードは、ドキュメント内のすべてのテキストオブジェクト(アーティスティックテキスト、段落テキストの両方)を自動で検出し、指定したフォント、サイズ、色に一瞬で書き換えるプロ仕様のコードです。
今回は、CorelDRAW独自の超高速検索エンジン「CQL(Corel Query Language)」を使用して、ネストされたグループの中まで一網打尽にします。
Sub FastFontReplacer()
‘ =================================================================
‘ 定義部:操作対象のフォント名やサイズ、色をここで設定します
‘ =================================================================
Const TARGET_FONT As String = “MS UI Gothic” ‘ 置換対象のフォント(空文字なら全フォント対象)
Const NEW_FONT As String = “Arial” ‘ 新しいフォント名
Const NEW_SIZE As Double = 12# ‘ 新しいサイズ(ポイント)
Dim doc As Document
Set doc = ActiveDocument
‘ ドキュメントが開かれていない場合は処理を中断します
If doc Is Nothing Then
MsgBox “ドキュメントが開かれていません。”, vbExclamation
Exit Sub
End If
‘ =================================================================
‘ 高速化の儀式:CorelDRAWの「重い処理」を一時的にオフにします
‘ =================================================================
On Error GoTo ErrorHandler ‘ 途中でエラーが起きても設定を元に戻すための保険
Application.Optimization = True ‘ 1. 画面の再描画を停止
Application.EventsEnabled = False ‘ 2. イベント監視を停止
doc.BeginCommandGroup “Fast Font Replace” ‘ 3. アンドゥ履歴を1つに統合
‘ =================================================================
‘ 本処理:CQL(検索クエリ)を使ってテキストシェイプを一括取得
‘ =================================================================
Dim textShapes As ShapeRange
Dim sh As Shape
Dim count As Long
count = 0
‘ ドキュメント全体の「テキストシェイプ」だけを、グループ関係なく一括抽出します
‘ ※これがマクロ記録にはできないプロの超高速アプローチです!
Set textShapes = doc.ActivePage.FindShapes(Query:=”@type = ‘text'”)
‘ 抽出したテキストオブジェクトを1つずつループ処理
For Each sh In textShapes
‘ 特定のフォントだけを狙い撃ちするか、あるいはすべてのテキストを対象にするか
If TARGET_FONT = “” Or sh.Text.Story.Font = TARGET_FONT Then
‘ — スタイルの適用 —
With sh.Text.Story
.Font = NEW_FONT ‘ フォントの変更
.Size = NEW_SIZE ‘ サイズの変更
End With
‘ — 色の適用(例:鮮やかな青色 [CMYK: 100, 80, 0, 0] に変更) —
sh.Fill.ApplyUniformFill CreateCMYKColor(100, 80, 0, 0)
count = count + 1
End If
Next sh
‘ =================================================================
‘ 後片付け:一時停止していた機能をすべて元に戻します
‘ =================================================================
CleanUp:
doc.EndCommandGroup ‘ アンドゥグループを閉じる
Application.EventsEnabled = True ‘ イベント監視を再開
Application.Optimization = False ‘ 画面の再描画を再開して結果を反映
Application.Refresh ‘ 画面を最新状態に更新
MsgBox count & ” 個のテキストオブジェクトを更新しました!”, vbInformation, “処理完了”
Exit Sub
ErrorHandler:
‘ 万が一エラーが発生しても、画面がフリーズしたままにならないように救済します
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “エラー”
Resume CleanUp
End Sub
—
5. コードの解説:初心者脱却のためのポイント
このコードには、ただ動くだけでなく「プロの現場」で耐えうる工夫がいくつか施されています。
① `doc.ActivePage.FindShapes(Query:=”@type = ‘text'”)`
これが今回の最大の心臓部です。
普通にコードを書くと、`For Each Layer In Page…` や `For Each Shape In Layer…` と何重ものループ(再帰処理)を書く必要があります。しかも、オブジェクトがグループ化されていると、通常のループでは中身をすり抜けてしまいます。
しかし、CorelDRAWに備わっている CQL(Corel Query Language) を使うと、「グループの中に隠れているテキストも、レイヤーが分かれているテキストも、すべてまとめて一瞬で引っ張り出す」ことができます。
② `sh.Text.Story`
CorelDRAWのテキストオブジェクトは、`Story` というオブジェクトの下にフォント名(`Font`)やサイズ(`Size`)の情報を持っています。
`sh.Font = …` と直接書くことはできないため、必ず `sh.Text.Story` を経由する、と覚えておきましょう!
③ `On Error GoTo ErrorHandler`(エラー処理)
`Application.Optimization = True` を実行すると、CorelDRAWの画面更新が止まります。もしこの後にコードでエラーが起きてプログラムが途中で強制終了してしまうと、「CorelDRAWがフリーズして一切操作を受け付けない(ように見える)」という恐ろしい状態になってしまいます。
これを防ぐため、エラーが起きても必ず `CleanUp` 処理へジャンプし、画面更新を再開(`Optimization = False`)させる構造にしています。
—
6. 陥りやすいエラーと対策
エラー1: 「Object invalid(オブジェクトが無効です)」
大量のオブジェクトを処理している最中にオブジェクトを削除したり、ページの切り替えを行うと発生します。
- 対策: 今回紹介した `FindShapes` で取得した `ShapeRange` は、メモリ上に固定されたスナップショットのようなものです。ループの途中でオブジェクトの構造を劇的に変化(グループ解除や削除など)させない限り、このエラーは回避できます。
エラー2: 段落テキストの枠からはみ出す(溢れ)
フォントサイズを大きくした結果、テキストフレーム(段落テキスト)から文字がはみ出してしまうことがあります。
- 対策: `sh.Text.Type = cdrParagraphText`(段落テキスト)の場合のみ、フレームサイズを自動調整するコード(`sh.Text.Frame.FitTextToFrame` など)を追加するとスマートです。
—
まとめ
お疲れ様でした!
今回ご紹介したテクニックは、CorelDRAW VBAのパフォーマンスを劇的に引き上げる最も重要な基礎であり、極意でもあります。
- オブジェクトの階層構造を意識する
- CQL (`FindShapes`) を使ってスマートに狙い撃ちする
- Optimization などの高速化スイッチで処理時間を1/10にする
この3つのポイントをマスターすれば、CorelDRAW VBAの基本はバッチリです。
手作業で何十分もかけていた作業が、ボタンひとつで数秒で終わる快感を、ぜひあなたの環境でも体験してみてください。
「こんな処理も自動化してみたい」「ここがうまく動かない」などがあれば、いつでも先輩に聞いてくださいね。ハッピーコーディング!
