CorelDRAW VBAの「裏側」を操る:画面描画を封印して全ページ一括置換を爆速化する技術
こんにちは。CorelDRAWの自動化の世界へようこそ。
マクロの記録機能で生成されたコードを見て、「なぜこんなに遅いのか?」「なぜ画面がチカチカするのか?」と疑問に思ったことはありませんか?それは、CorelDRAWが「人間が見るための描画処理」を律儀に実行しているからです。
プロのエンジニアは、マクロに「画面を見るな、ただ仕事だけをしろ」と命令します。今回は、CorelDRAW VBAの真髄である「Optimization(最適化)」を駆使し、全ページのテキストを一括置換する、現場必須のテクニックを伝授します。
—
1. なぜ「Optimization」が最強なのか?
CorelDRAW VBAにおいて、最もリソースを食うのは「画面の再描画」です。ページを切り替えるたびに画面を更新していては、数ページなら良くても、数十ページあるドキュメントでは日が暮れてしまいます。
そこで登場するのが `Optimization` プロパティです。これを使うことで、CorelDRAWの脳内(メモリ内)だけで処理を完結させ、最後に一度だけ画面を更新するという「バックグラウンド処理」が可能になります。
鉄壁の定型文(これを覚えればOK)
‘ 処理開始時の儀式
Optimization = True
EventsEnabled = False ‘ イベント発生を停止(誤作動防止)
‘ — ここに爆速処理を書く —
‘ 処理終了時の儀式
Optimization = False
ActiveWindow.Refresh ‘ 最後に手動で画面を更新
EventsEnabled = True
このブロックで囲むだけで、あなたのマクロは数倍〜数十倍の速度で走るようになります。
—
2. 実践:非アクティブページを一括走査してテキスト置換
では、実際に「全ページのテキストを検索し、特定の文字列に置換する」スクリプトを見てみましょう。
Sub BatchReplaceText()
Dim p As Page
Dim s As Shape
Dim targetText As String, replaceText As String
targetText = “旧ロゴ” ‘ 検索したい文字
replaceText = “新ロゴ” ‘ 置換したい文字
‘ — 爆速化の魔法 —
Optimization = True
EventsEnabled = False
‘ 全ページをループ
For Each p In ActiveDocument.Pages
‘ 各ページのすべてのオブジェクトを走査
For Each s In p.FindShapes(Type:=cdrTextShape)
‘ テキスト形状であれば内容を置換
If InStr(s.Text.Story.Text, targetText) > 0 Then
s.Text.Story.Text = Replace(s.Text.Story.Text, targetText, replaceText)
End If
Next s
Next p
‘ — 魔法を解く —
Optimization = False
ActiveWindow.Refresh
EventsEnabled = True
MsgBox “全ページの置換が完了しました!”, vbInformation
End Sub
コードの解説
- `p.FindShapes(Type:=cdrTextShape)`: これが重要です。ページ内の全オブジェクトを一つ一つ調べるのではなく、`FindShapes`メソッドで「テキストだけに絞り込んで」抽出します。これで無駄な計算が激減します。
- `s.Text.Story`: CorelDRAWのテキストは「ストーリー」という概念で管理されています。テキストボックス内の文章を丸ごと取得して、VBA標準の`Replace`関数で書き換えるのが最も効率的です。
—
3. 陥りやすい罠と解決策
初学者が必ず突き当たる壁が2つあります。ここをクリアすれば、あなたはもう中級者です。
罠①:グループ化されたテキストが見つからない
`FindShapes`はデフォルトでは「現在の階層」しか見ません。グループ化された中のテキストまで探したい場合は、以下のように引数を追加します。
‘ Deep:=True を指定すると、グループの奥深くまで探しに行く
For Each s In p.FindShapes(Type:=cdrTextShape, Deep:=True)
罠②:エラーハンドリングがない
もしドキュメントに「ロックされたレイヤー」や「保護されたテキスト」が含まれていると、マクロが途中で停止します。コードの冒頭に `On Error Resume Next` を入れて、失敗したオブジェクトをスキップさせる(あるいはログを出す)設計にしましょう。
—
4. エンジニアからのアドバイス:自動化の極意
今回紹介した「画面描画を抑制する」という考え方は、CorelDRAW VBAにおける「作法」です。
1. まずは「動く」ものを作る。
2. 次に「Optimization」で速度を上げる。
3. 最後に「エラーハンドリング」で堅牢にする。
このステップを踏めば、あなたのマクロは同僚が驚くような「プロのツール」に進化します。まずはこのコードをコピーして、手元のドキュメントで実験してみてください。
「画面が動かないのに、終わった時には全てが変わっている」。この瞬間の快感こそが、自動化エンジニアの特権です。ぜひ、あなたの仕事をもっと自由なものにしてください!
