【実務・中級編】【初心者向け】選択した複数のベクターシェイプにランダムなカラーパレットを自動割り当てする遊び心のあるマクロ – CorelDRAW VBA解析バイブル

スポンサーリンク

CorelDRAW VBAを掌握する極限の知見:選択シェイプへのランダムカラーパレット自動割り当てマクロ

開発プロジェクトのリーダーである私から、実務の現場で即使えるCorelDRAW VBAの知見を授けよう。

世の中には「動けばいい」という低劣なコードがあふれている。しかし、CorelDRAWのオブジェクトモデルのライフサイクル、画面描画のコスト、そしてメモリ管理の仕組みを理解していないコードは、複雑なデザインデータを前にした途端にフリーズし、最悪の場合はアプリケーション全体をクラッシュさせる。

今回は、選択した複数のベクターシェイプに対し、定義済みのカラーパレットからランダムな色を高速かつ安全に割り当てるマクロを題材にする。「モックアップ作成の効率化」という一見ライトなテーマだが、プロの現場に耐えうる堅牢性とパフォーマンスを担保したプロダクションコードの書き方を徹底的に叩き込む。

1. なぜ「素通しのコード」は実務で破綻するのか?

初心者が書くコードの典型的な悪手は、これだ。

‘ 【アンチパターン】絶対にやってはいけない例
Dim sh As Shape
For Each sh In ActiveSelection.Shapes
sh.Fill.UniformColor.RGBAssign Rnd() 255, Rnd() 255, Rnd() 255
Next sh

何が問題か?
1. 画面描画の嵐 (Screen Update): ループの回数だけCorelDRAWのビューポートが再描画され、処理が極端に重くなる。
2. エラーハンドリングの欠如: 選択オブジェクトが「テキスト」や「グループ」、あるいは「ビットマップ」だった場合、`.Fill` プロパティの操作で容赦なく実行時エラー(Runtime Error)が発生してマクロが沈没する。
3. 乱数の偏り: `Randomize` を叩いていないため、起動するたびに同じ色配列が生成される。

我々が目指すべきは、「いかなる状況でも安全に完遂し、一瞬で処理を終わらせる」コードだ。

2. 堅牢性とパフォーマンスを極めたプロダクションコード

以下のコードをCorelDRAWのVBAエディタ(Alt + F11)に貼り付けてほしい。実務の現場で求められる「最適化の作法」をすべて盛り込んでいる。

Option Explicit

‘ ==============================================================================
‘ 担当者向けモジュール: 選択シェイプへのパレットカラー・ランダムアサイン
‘ アーキテクト設計思想: 画面描画の抑制、型安全な走査、エラー耐性の強化
‘ ==============================================================================
Sub ApplyRandomPaletteToSelection()

‘ 1. 選択オブジェクトの存在チェック
If ActiveSelection.Shapes.Count = 0 Then
MsgBox “処理対象のシェイプが選択されていません。”, vbExclamation, “CorelDRAW 自動化エンジン”
Exit Sub
End If

‘ 2. パフォーマンス最大化:画面描画とイベントの完全抑制
‘ ※これを怠ると、大量のオブジェクト処理時に描画処理で数倍〜数十倍の時間がかかる
EventsEnabled = False
ActiveDocument.BeginCommandGroup “Random Palette Assignment”

On Error GoTo ErrorHandler ‘ 予期せぬエラー時のクリーンアップ用トラップ

‘ 乱数ジェネレータの初期化(これを忘れてはいけない)
Randomize

‘ 3. カラーパレットの定義(RGBColorの配列として保持)
‘ 実務では、ここを外部CSVやデータベース、JSONからの読み込みに拡張可能
Dim palette(4) As New RGBColor
palette(0).RGBAssign 235, 87, 87 ‘ モダンレッド
palette(1).RGBAssign 45, 212, 191 ‘ ターコイズ
palette(2).RGBAssign 245, 158, 11 ‘ アンバー
palette(3).RGBAssign 129, 140, 248 ‘ インディゴ
palette(4).RGBAssign 244, 114, 182 ‘ ピンク

Dim paletteSize As Integer
paletteSize = 5 ‘ 配列の要素数

‘ 4. オブジェクトの走査と安全なプロパティ操作
Dim sh As Shape
Dim targetShape As Shape
Dim colorIndex As Integer
Dim processedCount As Long
processedCount = 0

For Each sh In ActiveSelection.Shapes
‘ グループ化されている場合の再帰的処理、または単体シェイプの判定
‘ ここではシンプルかつ堅牢に「塗りが適用できるシェイプ」に限定する
If CanHaveFill(sh) Then
‘ 0 から (paletteSize – 1) の範囲でランダムなインデックスを生成
colorIndex = Int(Rnd paletteSize)

‘ 塗りの適用(Uniform Color)
sh.Fill.ApplyUniformFill palette(colorIndex)

‘ アウトライン(線)の処理:必要に応じて消す、あるいは色を調整
‘ sh.Outline.SetNoOutline ‘ 必要ならコメントアウトを解除

processedCount = processedCount + 1
End If
Next sh

‘ 5. 正常終了処理
ActiveDocument.EndCommandGroup
EventsEnabled = True

‘ 完了フィードバック
MsgBox “処理完了: ” & processedCount & ” 個のシェイプにパレットカラーを割り当てました。”, vbInformation, “成功”
Exit Sub

ErrorHandler:
‘ 6. 障害発生時のフェイルセーフ(最重要)
‘ エラーでマクロが途切れても、画面描画のロックやコマンドグループが解除されないバグを防ぐ
ActiveDocument.AbortCommandGroup
EventsEnabled = True
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “致命的エラー”

End Sub

‘ ==============================================================================
‘ ヘルパー関数: シェイプが塗りを持てる構造か判定する
‘ ==============================================================================
Private Function CanHaveFill(sh As Shape) As Boolean
‘ コネクタやガイド、特定の特殊オブジェクトを除外するためのガード節
Select Case sh.Type
Case cdrRectangleShape, cdrEllipseShape, cdrPolygonShape, _
cdrCurveShape, cdrTextShape, cdrCustomShape
CanHaveFill = True
Case Else
‘ グループシェイプ(.Shapes.Count > 0)の場合は内部を再帰処理すべきだが
‘ 初心者向けとして今回は単体ベクターに絞る
If sh.Type = cdrGroupShape Then
‘ グループ自体の塗りは通常持たないためFalseとする(必要に応じて拡張)
CanHaveFill = False
Else
CanHaveFill = False
End If
End Select
End Function

3. コードの構造的解説:プロが組んだシステムの見所

1. `EventsEnabled = False` による圧倒的な高速化

CorelDRAW VBAにおいて、オブジェクトのプロパティを変更するたびにGUI側が「どう描画し直すべきか」を計算する。これがボトルネックになる。処理の開始時に描画イベントを殺し、一括処理後に復旧させる。この一手間で、数百個のオブジェクトを扱う際の処理速度が劇的に変わる。

2. トランザクション管理 (`BeginCommandGroup` / `AbortCommandGroup`)

CorelDRAWのドキュメント操作は、単なる変数操作ではない。履歴(Undo/Redoスタック)に直結している。エラーが発生した際に `AbortCommandGroup` を呼ばないと、ユーザーのCtrl+Z(元に戻す)の履歴が破壊され、ドキュメントが破損する危険性がある。プロダクションコードでは必須の作法だ。

3. ガード節 (`CanHaveFill`) による型安全性の担保

CorelDRAWの `ActiveSelection.Shapes` には、デザイナーが意図しないオブジェクト(例えばガイドラインやテキストフレームなど)が含まれることがある。これをそのまま `.Fill` 操作するとエラーになる。型を厳密にチェックし、安全なオブジェクトのみを処理の対象とする。

4. 実務・システム連携への発展性

今回はハードコーディングした配列からカラーパレットを読み込んでいるが、実際の業務システム(ERPや商品データベース、あるいはフロントエンドのWebデザインツール)と連携させる場合、この構造をどう拡張すべきか?

  • 外部ファイル連携: `palette` の初期化部分を、JSONファイルやCSVファイルの読み込み処理(FileSystemObjectを使用)に置き換える。これにより、クライアント企業ごとのブランドカラーパレットを動的に切り替えられる。
  • アドイン化: このVBAコードを `.GMS` (Global Macro Storage) 形式としてCorelDRAWのローカル環境に配置し、専用のカスタムリボンUIからワンクリックで呼び出せるようにする。

業務自動化の本質は、「手作業の代替」ではなく「人間のミスが入り込む余地を完全に排除したシステム構築」にある。このコードをベースに、君たちの現場のワークフローを極限まで最適化してほしい。

タイトルとURLをコピーしました