こんにちは!CorelDRAW VBAの世界へようこそ。
普段の業務で「何十個もの図形の塗りつぶし色や線の太さを、ひとつずつ手作業で変更するのが大変…」と感じたことはありませんか?
「マクロの記録」を使えば一瞬で自動化できる…と思いきや、記録されたコードを見ると `For Each` ループが大量に並んでいたり、処理のたびに画面がチラついて時間がかかったりしますよね。
今回は、CorelDRAW VBAの真骨頂である`ActiveSelectionRange`(選択範囲オブジェクト)を使って、「ループ処理なし」で選択した複数の図形のプロパティ(塗りつぶし・輪郭)を一瞬で一括置換する極意を解説します!
ここをクリアすれば、CorelDRAW VBAの基本とオブジェクトモデルの扱いはバッチリですよ。一緒に一歩先のスッキリとした洗練されたコードを目指しましょう!
—
1. 「マクロの記録」からの脱却:なぜ ActiveSelectionRange なのか?
初心者の方が最初に突き当たる壁、それが「ループ処理の罠」です。
一般的なVBAの発想だと、「選択された図形を1つずつ取り出して、色を変えて、次の図形へ…」というコードを書きがちです。
‘ [初心者が書きがちなパターン]1つずつループで処理する
Dim s As Shape
For Each s In ActiveSelection.Shapes
s.Fill.ApplyUniformFill CreateRGBColor(255, 0, 0)
Next s
もちろんこれでも動きますが、選択している図形が数千個に及ぶと、画面の再描画やオブジェクトへの個別アクセスが負荷となり、フリーズしたかのように重くなってしまいます。
そこで登場するのが、CorelDRAWが誇る強力なオブジェクト `ActiveSelectionRange`( ShapeRange ) です。
ActiveSelectionRange(ShapeRange)の凄さとは?
`ShapeRange` は、複数のシェイプ(図形)を「1つのまとまり(コレクション)」として直接操作できる特殊なオブジェクトです。
イメージとしては、図形を1つずつ手作業で塗るのではなく、「バケツのペンキを選択中の全図形へ一気に流し込む」ような感覚です。ループ処理を書く必要すらありません。
—
2. [実践]複数選択図形の一括プロパティ置換マクロ
まずは、そのままコピー&ペーストして使える実践コードをご覧ください。
ユーザーがCorelDRAW上で選択しているすべての図形に対して、塗りつぶしカラー(シアン) と 輪郭線の太さ・色 を一瞬で変更する決定版コードです。
Option Explicit
”’
”’
Sub BatchChangeSelectionProperties()
‘ 予想外のエラーが発生した際に安全に処理を抜けるためのエラーハンドリング
On Error GoTo ErrorHandler
‘ 1. ドキュメントが開かれているか安全チェック
If ActiveDocument Is Nothing Then
MsgBox “ドキュメントが開かれていません。ファイルを開いてから実行してください。”, vbExclamation, “実行エラー”
Exit Sub
End If
‘ 2. 現在の選択範囲を ShapeRange として取得
Dim targetRange As ShapeRange
Set targetRange = ActiveSelectionRange
‘ 3. ガード節:何も選択されていない場合は処理を中断
If targetRange.Count = 0 Then
MsgBox “オブジェクトが選択されていません。” & vbCrLf & _
“変更したい図形を選択してからもう一度実行してください。”, vbInformation, “案内”
Exit Sub
End If
‘ 4. 【高速化のキモ】画面の再描画を一時停止 & Undo(元に戻す)履歴を1つに統合
Optimization.Begin
ActiveDocument.BeginCommandGroup “プロパティ一括置換”
‘ ————————————————————-
‘ 5. ループ処理不要! ActiveSelectionRange への直接操作
‘ ————————————————————-
‘ (A) 塗りつぶしを一括変更(例:美しいシアンブルー)
targetRange.ApplyUniformFill CreateRGBColor(0, 162, 232)
‘ (B) 輪郭線の一括変更(太さ:2.0pt / 色:ダークグレー)
‘ Outline.SetProperties を使うことで、太さや色を一括で適用可能
targetRange.Outline.SetProperties _
LineWidth:=2.0, _
Color:=CreateRGBColor(50, 50, 50)
‘ ————————————————————-
‘ 6. 処理完了:描画の再開と画面のリフレッシュ
ActiveDocument.EndCommandGroup
Optimization.End
ActiveWindow.Refresh
Exit Sub
ErrorHandler:
‘ エラーが起きても必ずOptimizationを解除して画面描画を復帰させる
Optimization.End
MsgBox “処理中にエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
—
3. コードの徹底解剖:プロが使う「3つの高速化・安全化テクニック」
上記のコードには、ただ動くだけではない「プロの自動化設計」が詰まっています。ポイントを3つに分けて噛み砕いて解説しますね。
① `ShapeRange` への直接プロパティ適用
最大のポイントはここです。
targetRange.ApplyUniformFill CreateRGBColor(0, 162, 232)
targetRange.Outline.SetProperties LineWidth:=2.0, Color:=…
`ActiveSelectionRange` で取得した `targetRange` に対して、直接 `.ApplyUniformFill` や `.Outline.SetProperties` を呼び出しています。
CorelDRAWの内部エンジンが全図形へ一括適用処理を行ってくれるため、VBA側で `For Each` ループを回すよりも圧倒的に高速に動作します。
② `Optimization.Begin` による画面描画の停止
CorelDRAW VBAで最も高速化に寄与するのが `Optimization` オブジェクトです。
Optimization.Begin
‘ ~ 重い処理 ~
Optimization.End
これを入れることで、マクロの実行中にCorelDRAWが画面を1回1回描き直すのを防ぎます。処理速度が数十倍跳ね上がることも珍しくありません。
> 先輩エンジニアからのアドバイス:
> `Optimization.Begin` を呼んだら、エラーが起きても必ず `Optimization.End` で解除するようにエラーハンドリング(`On Error GoTo`)を組むのが鉄則です!解除し忘れると画面が更新されなくなってしまいます。
③ Undo(元に戻す)のグループ化
`ActiveDocument.BeginCommandGroup` を使うことで、マクロが行った複数の変更作業を「Ctrl + Z(元に戻す)」1回で元に戻せるようにまとめられます。ユーザーに優しいマクロを作るための大切な気配りですね。
—
4. 初心者がハマりがちな罠と対処法
開発中に「あれ?動かないぞ?」となったときは、以下のポイントをチェックしてみてください。
罠1:何も選択していないとエラーになる
図形を1つも選択していない状態で `ActiveSelectionRange` を操作しようとすると、参照エラーが発生します。
これを防ぐのが、コード内にある「ガード節」です。
If targetRange.Count = 0 Then
MsgBox “オブジェクトが選択されていません。”
Exit Sub
End If
処理の最初に `targetRange.Count` を確認する癖をつけておきましょう!
罠2:グループ化されたオブジェクト内の色の扱い
グループ化された図形を選択した場合でも、`ActiveSelectionRange` はグループ全体を1つのレンジとして保持し、中の子要素へもプロパティ変更を波及させてくれます。
ただし、「特定の子要素だけ色を変えたい」という場合は、一度 `.UngroupAll` するか、グループ内部を再帰的に検索するロジックが必要になります。
—
まとめ:CorelDRAW VBAの基本はこれでバッチリ!
今回は、`ActiveSelectionRange` オブジェクトを活用した「ループなしの一括プロパティ変更テクニック」をご紹介しました。
学びのポイントを復習しましょう!
1. 複数選択の操作は `ActiveSelectionRange`(`ShapeRange`)を使う
2. ループを回さず、Rangeオブジェクトに対して直接メソッドを適用する
3. `Optimization.Begin` で画面描画を止めて爆速化する
4. ガード節を入れて「未選択エラー」を防ぐ
これらの概念は、塗りつぶしや輪郭線の変更だけでなく、図形の移動、拡大縮小、回転、整列など、すべての操作に応用が効きます。
ここをクリアできれば、CorelDRAW VBAの基本構造はしっかりマスターできた証拠です!自信を持って、さらに高度な自動化ツール作りに挑戦してみてくださいね。応援しています!
