CorelDRAW VBAを掌握せよ:デザインの「複雑性」を可視化するノードカウント・エンジンの設計思想
デザイン現場において、「ファイルが重い」「データが壊れやすい」という問題は、多くの場合、無計画に増殖した「ノード(頂点)」に起因する。CorelDRAW VBAを扱う諸君にとって、ノード数を把握することは、単なる統計ではなく「データ品質の門番」を意味する。
今回は、アクティブページ内のパスを走査し、デザインの複雑さを定量化する「ノード監査エンジン」を実装する。単に動くコードを書くのではない。「保守性が高く、メモリを汚染しない」プロフェッショナルな設計を叩き込む。
—
1. なぜ「雑なループ」が死を招くのか
初心者が書きがちなのは、単に `ActivePage.Shapes` を回すだけのコードだ。しかし、CorelDRAWのオブジェクトモデルには以下の落とし穴がある。
- グループ化の罠: `ActivePage.Shapes` はグループ化されたオブジェクト内部まで再帰的に走査しない。
- 非パスオブジェクトの存在: テキストやビットマップに対して `Curve` プロパティを叩けば、VBAは即座にエラー(Runtime Error 91: Object variable not set)を吐いてクラッシュする。
- 反復処理のコスト: 巨大なデータセットに対し、再帰関数を使わず力技で実装すると、メモリリークやスタックオーバーフローのリスクがある。
これらを回避する、堅牢な設計が求められる。
—
2. 実装:プロフェッショナル・ノードカウンタ
以下のコードは、グループ構造を再帰的に探索し、純粋なベクターパスのみを抽出してノードをカウントする。モジュールとしてコピペして即戦力として機能するはずだ。
Option Explicit
‘ メインエントリーポイント
Public Sub AuditDesignComplexity()
Dim totalNodes As Long
Dim shapeCount As Long
‘ 処理開始前の高速化(画面更新停止)
Optimization = True
‘ アクティブページ内の全シェイプを再帰的に走査
Call RecursiveCountNodes(ActivePage.Shapes, totalNodes, shapeCount)
‘ 結果出力
Debug.Print “— デザイン監査レポート —”
Debug.Print “総シェイプ数: ” & shapeCount
Debug.Print “総ノード数: ” & totalNodes
Debug.Print “平均ノード/パス: ” & IIf(shapeCount > 0, totalNodes / shapeCount, 0)
‘ 状態を元に戻す
Optimization = False
ActiveWindow.Refresh
End Sub
‘ 再帰的な走査エンジン
Private Sub RecursiveCountNodes(shapes As Shapes, ByRef totalNodes As Long, ByRef shapeCount As Long)
Dim shp As Shape
For Each shp In shapes
‘ グループの場合は再帰呼び出し
If shp.Type = cdrGroupShape Then
Call RecursiveCountNodes(shp.Shapes, totalNodes, shapeCount)
‘ カーブオブジェクトのみを対象にする(堅牢性チェック)
ElseIf shp.Type = cdrCurveShape Or shp.Type = cdrRectangleShape Or shp.Type = cdrEllipseShape Then
‘ パス変換されていない図形も考慮し、一時的なカーブ情報を取得
Dim curve As curve
Set curve = shp.Curve
If Not curve Is Nothing Then
totalNodes = totalNodes + curve.Nodes.Count
shapeCount = shapeCount + 1
End If
End If
Next shp
End Sub
—
3. コードの解説:ここが「プロ」の境界線
① `Optimization = True` の重要性
CorelDRAW VBAにおいて、画面の再描画を制御するのは絶対的なルールだ。これを怠ると、数千のオブジェクトを走査するたびに画面が更新され、処理時間が数倍から数十倍に跳ね上がる。業務効率化とは、CPUをいかに効率的に回すかという戦いである。
② 再帰構造(Recursive)の採用
`ActivePage.Shapes` だけで満足してはいけない。実務のデータは複雑なグループ階層の中に埋もれている。この再帰関数は、どれだけ深いグループ化が施されていても、漏れなく全てのノードを拾い上げる。
③ 型チェックの厳格化
`If Not curve Is Nothing Then` を忘れてはならない。CorelDRAWでは、シェイプがパス変換されていても、特定の状態(空のグループ等)では参照が取れない場合がある。この一行が、あなたのスクリプトを「おもちゃ」から「ツール」へと昇華させる。
—
4. さらなる高みへ:業務連携のヒント
このツールを単なる「デバッグ用出力」で終わらせてはもったいない。以下の拡張を検討せよ。
- データベース連携: `totalNodes` が閾値(例: 5,000ノード)を超えた場合、ログファイル(CSV)にファイル名とノード数を出力し、重いファイルを自動でリストアップする。
- 警告ダイアログ: 特定の複雑さを超えた瞬間に `MsgBox` で警告を出し、オペレーターにパスの簡素化(Reduce Nodes機能の適用)を促す。
最後に
自動化エンジニアにとって、コードは「書く」ものではなく「育てる」ものだ。ノード数を可視化し、データの健康状態を把握する。この地味な一歩が、将来的なトラブルを未然に防ぐ最強の盾となるだろう。
さあ、君の現場の「肥大化したデータ」を、このコードで解剖してみせろ。
