CorelDRAW VBAの「神」への入り口:特定カラーのオブジェクトを一瞬で捕獲するスマートピッカーの極意
こんにちは。CorelDRAWの自動化の世界へようこそ。
マクロの記録ボタンを押して、生成されたコードの羅列に絶望したことはありませんか?「これ、修正するたびに動かなくなるな……」と。その通りです。記録されたコードは「結果」をなぞっているだけで、あなたの意図を汲み取ってはくれません。
今日、あなたが手に入れるのは、「ドキュメント内の特定の色を持つオブジェクトだけを、脳の拡張機能のように正確に選別し、グループ化する」という自動化の第一歩です。
これをマスターすれば、数百のオブジェクトが入り乱れるチラシの修正も、一瞬のコーヒータイムに変わります。さあ、CorelDRAWの内部構造を覗きに行きましょう。
—
1. 自動化の前に知っておくべき「オブジェクトの階層」
CorelDRAW VBAにおいて、全ての図形は`Shape`オブジェクトとして存在します。
私たちは、ページ内にある全ての`Shape`を一つずつ「この色は指定の色か?」とチェックしていく作業をプログラムに代行させます。
ここで重要なのは、「どうやって色を比較するか」です。CMYKの値を厳密に比較するために、私たちは`UniformFill`プロパティに注目します。
—
2. 実践:スマートピッカー・スクリプト
以下のコードは、現在選択している色(または指定した色)と同じ塗り(Fill)を持つオブジェクトを自動的に検索し、それらを一つのグループにまとめるツールです。
Sub SmartColorPickerAndGroup()
‘ 変数の宣言:メモリ効率を意識して型を明示します
Dim s As Shape
Dim sr As ShapeRange
Dim targetColor As Color
‘ 検索対象の色を設定(例:C=0, M=100, Y=100, K=0 の赤)
Set targetColor = CreateCMYKColor(0, 100, 100, 0)
‘ 選択範囲を格納するShapeRangeを初期化
Set sr = ActivePage.Shapes.All.Shapes.CreateShapeRange
‘ 全てのオブジェクトを走査(ここが自動化の心臓部)
For Each s In ActivePage.Shapes
‘ 塗りつぶしタイプが単色(Uniform)であるかを確認
If s.Fill.Type = cdrUniformFill Then
‘ 色が一致するか判定(微細な誤差を許容しない厳密比較)
If s.Fill.UniformColor.IsSame(targetColor) Then
‘ 一致したオブジェクトをShapeRangeに追加
sr.Add s
End If
End If
Next s
‘ 結果報告とグループ化
If sr.Count > 0 Then
sr.Group
MsgBox sr.Count & “個のオブジェクトをグループ化しました。”, vbInformation
Else
MsgBox “対象の色は見つかりませんでした。”, vbExclamation
End If
End Sub
—
3. コードの解説:なぜこの書き方が「プロ」なのか
① `ShapeRange` という概念
初心者が陥りやすいのが、「見つかるたびにグループ化する」という間違いです。これでは処理が重くなり、失敗の元です。
プロはまず`ShapeRange`という「入れ物」を用意し、そこに該当オブジェクトを蓄積してから、最後に一括で`Group`メソッドを実行します。これが計算資源を節約するコツです。
② `IsSame` メソッドの信頼性
色の比較に `s.Fill.UniformColor.CMYKC = targetColor.CMYKC` のように値を一つずつ比較する人がいますが、これはやめましょう。CorelDRAWには `IsSame` というメソッドが用意されています。これは、カラープロファイルや微妙な色空間の違いまで考慮した、CorelDRAW専用の強力な比較ツールです。これを使わない手はありません。
③ `cdrUniformFill` のチェック
シェイプには「塗りなし」や「グラデーション」もあります。いきなり `s.Fill.UniformColor` にアクセスしようとすると、グラデーションのシェイプで「エラー(実行時エラー 91)」が発生し、プログラムが止まります。
`If s.Fill.Type = cdrUniformFill Then` と記述することで、「単色塗りではないオブジェクト」を事前に除外する安全装置を組み込んでいます。
—
4. 陥りやすい罠と対策
- 「グループの中のグループ」が見つからない!
上記のコードは `ActivePage.Shapes` を見ていますが、これはページ直下のオブジェクトしか見ません。もしグループの中に目的の色がある場合、再帰的な処理(自分自身を呼び出す関数)が必要になります。まずはこのコードで「階層の基本」を掴んでください。
- 「色味」の誤差
印刷現場では微妙な色の違いが問題になります。もし「ほぼ同じ色」を探したい場合は、`IsSame` ではなく、CMYKの各数値を `Abs(c1 – c2) < 0.01` のようにして、許容範囲(閾値)を設けるカスタマイズを行うと、さらに実務的になります。 ---
最後に:自動化は「道具」ではなく「思考」
VBAを覚えることは、単にコードを書くことではありません。「CorelDRAWがどうやって図形を管理しているか」という構造を理解することです。
このスマートピッカーをベースに、次は「特定のレイヤーだけを探す」「特定のサイズ以下のオブジェクトを削除する」など、応用は無限に広がります。
まずはこのコードをコピーして、実際に動かしてみてください。うまく動いた瞬間、あなたのデザイン作業時間は、驚くほど短縮されるはずです。
分からないことがあれば、いつでもまた聞きに来てください。あなたのエンジニアリングライフを応援しています!
