こんにちは!CorelDRAW VBAの世界へようこそ。
マクロの記録ボタンを押して「なんだか動いたけれど、中身がさっぱりわからない……」と悩んでいませんか?あるいは、画面上でバラバラに選択した複数の図形の色を、コードで一括してスマートに変えたいと思ったことはありませんか?
ここをクリアすれば、CorelDRAW VBAの基本はバッチリですよ。
今回は、実務で最も頻繁に遭遇する「複数選択された図形のプロパティ一括置換」をテーマに、CorelDRAWの心臓部であるオブジェクトモデルの本質を、優しく、そして徹底的に解説していきます。
—
1. なぜ「マクロの記録」だけでは実務を突破できないのか?
CorelDRAWの「マクロの記録」は便利な機能ですが、出力されるコードを見てみると、こんな風になっていませんか?
‘ マクロの記録が吐き出すコードの例
ActiveDocument.ActivePage.Layers.Item(“レイヤー 1”).Shapes.Item(1).Fill.UniformColor.CmykAssign 0, 100, 100, 0
これでは、「何番目の、どのレイヤーにある、どのシェイプ」という固定された情報に依存してしまい、図形を移動させたり選択を変えたりするだけでエラーを起こしてしまいます。私たちが本当にやりたいのは、「今、自分が画面上でマウスで選んでいる複数の図形たち(ActiveSelectionRange)」に対して、一網打尽に処理を行うことです。
CorelDRAW VBAを掌握するためには、「アプリケーションからドキュメント、ページ、そして選択範囲へ」というオブジェクトの階層構造(ツリー構造)を正しく理解する必要があります。
—
2. CorelDRAWオブジェクトモデルのピラミッド
CorelDRAWを操作するVBAの世界は、以下のようなピラミッド構造になっています。
Application (CorelDRAW本体)
┗ Document (開いているファイル)
┗ Page (アクティブなページ)
┗ Layer (レイヤー)
┗ Shape / ShapeRange (図形・選択範囲)
私たちが今回フォーカスする `ActiveSelectionRange` は、ユーザーが画面上で選択している複数の図形を「ひとまとめの束(コレクション)」として一瞬で掴み取る、非常に強力なオブジェクトです。これを使えば、面倒なループ処理を書かなくても、選択された図形群へダイレクトにアプローチできるようになります。
—
3. 【実務即戦力】選択図形の塗り・輪郭一括置換マクロ
それでは、現場でそのままコピー&ペーストして使える実用コードを公開します。
このコードは、現在選択している複数のシェイプに対して、「塗りを鮮やかな赤(CMYK)」へ変更し、「輪郭線を太さ2mmの黒」へ一瞬で書き換えるマクロです。
Sub ReplaceSelectedShapesProperties()
‘ =====================================================================
‘ テーマ: 選択図形の塗りつぶし・輪郭線の一括置換マクロ
‘ 開発者視点のポイント: 画面更新を止める(Optimization)ことで爆速化を実現
‘ =====================================================================
Dim sr As ShapeRange
Dim s As Shape
Dim cFill As New Color
Dim cOutline As New Color
‘ 1. エラーハンドリングの準備(何も選択されていない場合の対策)
If ActiveSelection.Shapes.Count = 0 Then
MsgBox “図形が選択されていません。処理を中断します。”, vbExclamation, “CorelDRAW VBA”
Exit Sub
fi
‘ 2. 描画の最適化(ここをTrueにすると、画面のチラつきが消え処理速度が劇的に向上します)
EventsEnabled = False
ActiveDocument.BeginCommandGroup “図形プロパティの一括置換”
On Error GoTo ErrorHandler ‘ 予期せぬエラー時に描画を戻すための安全装置
‘ 3. 現在選択されている図形を「ShapeRange」として取得
Set sr = ActiveSelectionRange
‘ 4. 新しいカラーの定義 (CMYK: シアン、マゼンタ、イエロー、ブラック)
‘ 塗りつぶし用:鮮やかな赤 (C=0, M=100, Y=100, K=0)
cFill.SetCMYK 0, 100, 100, 0
‘ 輪郭線用:リッチブラック (C=0, M=0, Y=0, K=100)
cOutline.SetCMYK 0, 0, 0, 100
‘ 5. 選択範囲(ShapeRange)をループして、1つずつプロパティを書き換える
For Each s In sr
‘ コネクタやガイド線など、塗りを持てない特殊シェイプのエラーを防ぐ判定
If s.Type <> cdrGuidelineShape Then
‘ 塗りの適用(単色塗りに設定してからカラーを代入)
s.Fill.ApplyUniformFill cFill
‘ 輪郭線の適用
s.Outline.Color = cOutline
s.Outline.Width = Millimetres(.2) ‘ 輪郭線の幅を0.2mmに設定
End If
Next s
ErrorHandler:
‘ 6. 終了処理(必ず描画フラグとコマンドグループを元に戻す)
ActiveDocument.EndCommandGroup
EventsEnabled = True
If Err.Number <> 0 Then
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
Else
‘ 爽快感を演出する完了メッセージ
‘ StatusBar “処理が完了しました。”
End If
End Sub
—
4. コードの深掘り解説:プロの技が光る3つのポイント
ただ動くだけのコードで満足していませんか? ここで紹介したコードには、プロのエンジニアが現場で必ず組み込む「3つの知見」が隠されています。
① `EventsEnabled = False` による爆速化
VBAで数千個、あるいは複雑なパスを持つ図形を一つずつループ処理すると、CorelDRAWがその都度画面の再描画(プレビューの更新)を行おうとするため、動作が猛烈に重くなります。処理の冒頭で `EventsEnabled = False`(画面更新の抑制)を宣言し、最後に `True` に戻すことで、目にも留まらぬスピード(爆速)で処理を完了させることができます。
② `BeginCommandGroup` で「元に戻す(Ctrl + Z)」を1回にまとめる
ループの中で何十個もの図形を書き換えたとき、普通にコードを書くと「Ctrl + Z」を押したときに1図形分しか戻りません。これではユーザーにとって使い勝手が最悪です。`ActiveDocument.BeginCommandGroup` と `EndCommandGroup` で挟むことにより、マクロで行った一連の変更を「1つの操作」として履歴に登録し、Ctrl + Z 一発で元の状態に完全復元できるようになります。
③ 特殊シェイプに対するガード処理 (`s.Type`)
CorelDRAW上には、通常の四角形や円だけでなく、「ガイド線」や「グループ化されたオブジェクト」など、特殊な性質を持つ図形が存在します。これらに対して無理やり `Fill` プロパティを操作しようとすると、容赦なく実行時エラー(Type mismatchなど)が発生します。`s.Type <> cdrGuidelineShape` のような条件分岐を挟むことで、実務で耐えうる「落ちない堅牢なマクロ」が完成します。
—
5. おわりに:ここからあなたの自動化エンジニア人生が始まる
お疲れ様でした!今回は `ActiveSelectionRange` を起点としたオブジェクトの操作と、実務で必須となるパフォーマンス最適化のテクニックを解説しました。
「画面上で選んだものに対して、プログラムが意図通りに一瞬で仕事をしてくれる」――この爽快感を味わってしまったら、もう手作業には戻れなくなるはずです。
ここをクリアしたあなたなら、次は「特定のレイヤーにある特定のカラーの図形だけを全選択して処理する」といった、さらに高度な条件分岐や関数化にもスムーズに進めるはずです。
CorelDRAW VBAの奥深い世界を、自分の手でどんどん開拓していってください。あなたのエンジニアライフを応援しています!
