【実務・中級編】【初心者向け】アクティブページ内にあるすべてのパスの総ノード数を算出し、デザインの複雑さを簡易評価するスクリプト – CorelDRAW VBA解析バイブル

スポンサーリンク

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機能の適用)を促す。

最後に

自動化エンジニアにとって、コードは「書く」ものではなく「育てる」ものだ。ノード数を可視化し、データの健康状態を把握する。この地味な一歩が、将来的なトラブルを未然に防ぐ最強の盾となるだろう。

さあ、君の現場の「肥大化したデータ」を、このコードで解剖してみせろ。

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