CorelDRAW VBAを掌握せよ:選択シェイプを一撃で制する「属性一括適用」の極意
現場で数千のオブジェクトを相手にしているとき、「手動でプロパティを変える」という行為は、エンジニアとしての敗北を意味する。
CorelDRAW VBAの初心者層が陥りがちなのは、「オブジェクトを一つずつ選択してループさせる」という極めて非効率で脆弱なアプローチだ。VBAは単なるマクロ言語ではない。CorelDRAWの内部エンジンと直接対話する強力な武器だ。
今回は、選択した複数のシェイプに対して「線幅」と「塗りつぶし」を一括適用する、プロダクションレベルのコードを伝授する。なぜこの書き方が正解なのか、その設計思想まで深く理解してほしい。
—
1. 非効率なコード vs 堅牢なコード
初心者は往々にして、`ActiveSelection`のプロパティを直接操作しがちだ。しかし、選択オブジェクトの中に「グループ」や「ビットマップ」が混在していた場合、コードは即座にエラー(Runtime Error)を吐き、システムは停止する。
真のアーキテクトが意識すべきは「型と状態のチェック」だ。
単に値を代入するのではなく、適用可能なオブジェクトか否かを判定し、さらにUndo(取り消し)履歴を一つのトランザクションとしてまとめること。これが業務ツールとしての最低限の品格だ。
—
2. 実務で使える「属性一括適用」のプロダクションコード
以下のコードは、単に動くだけではない。保守性を考慮し、エラー発生を未然に防ぐ構造体を持っている。
Option Explicit
‘ @description 選択中の全オブジェクトに線幅と塗りつぶしを一括適用する
Public Sub BatchApplyProperties()
Dim sr As ShapeRange
Dim shp As Shape
‘ 1. エラーハンドリングの導入(必須)
On Error GoTo ErrorHandler
‘ 2. 選択オブジェクトの取得
Set sr = ActiveSelectionRange
‘ 3. 選択がない場合のガード節
If sr.Count = 0 Then
MsgBox “対象となるシェイプを選択してください。”, vbExclamation
Exit Sub
End If
‘ 4. Undoの開始(一括処理として履歴をまとめる)
Optimization = True
ActiveDocument.BeginCommandGroup “Batch Property Apply”
‘ 5. ループ処理
For Each shp In sr
‘ シェイプが塗りや線を持てるタイプか判定(堅牢性の担保)
If Not shp.Type = cdrBitmapShape Then
‘ 塗りつぶし(赤)
shp.Fill.UniformColor.CMYKAssign 0, 100, 100, 0
‘ 線幅(0.5mm)
shp.Outline.SetProperties 0.5, cdrMillimeter
shp.Outline.Color.CMYKAssign 0, 0, 0, 100
End If
Next shp
‘ 6. 終了処理
ActiveDocument.EndCommandGroup
Optimization = False
ActiveWindow.Refresh
Exit Sub
ErrorHandler:
Optimization = False
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub
—
3. なぜこの設計が必要なのか?
① `Optimization` プロパティの活用
`Optimization = True` を設定することで、コード実行中の画面再描画を停止させる。これを行わないと、シェイプの数だけ画面がちらつき、処理速度が劇的に低下する。大規模データ処理における必須のテクニックだ。
② `BeginCommandGroup` によるUndoの制御
このコマンドを忘れると、100個のオブジェクトを変更した後に「元に戻す(Ctrl+Z)」を100回押す羽目になる。ユーザーの体験価値を損なわないための設計だ。
③ `ShapeRange` の柔軟な利用
`ActiveSelection` ではなく `ActiveSelectionRange` を使う。これにより、選択されているオブジェクトがグループ化されていようが、バラバラであろうが、`For Each` ループで安全に巡回できる。
—
4. さらなる高みへ:ファイル・DB連携の注意点
もし、このマクロを「外部データベース(CSVやExcel)から属性値を読み込んで適用する」というフェーズに移行させるなら、以下の点に注意せよ。
- 型変換の厳密化: CSVの文字列をそのまま数値として代入するな。必ず `Val()` や `CDbl()` で明示的に変換せよ。
- パスの正規化: ファイル読み込み時に `ActiveDocument.FilePath` を起点とした相対パス運用を徹底すること。ハードコーディングされた絶対パスは、共有環境で必ず崩壊する。
最後に:ツールは「思考の速度」を奪うな
マクロを組む目的は、作業を終わらせることではない。「思考のリソースをクリエイティブなデザイン判断に集中させること」だ。
このコードをそのまま使うのも良いが、自分の現場に合わせてカスタマイズし、さらに洗練させてほしい。CorelDRAWのVBAは、使いこなせば最強のパートナーになる。次回の記事では、オブジェクトの「名前」をキーにして、複雑なレイヤー構造を動的に制御する方法を解説する。
準備はいいか? 現場のコードを、君の手で進化させろ。
