【テクニカル・上級編】【初心者向け】アクティブページの全ベクターオブジェクトの総数をカウントしメッセージボックスで即座に通知する基本コード – CorelDRAW VBA解析バイブル

スポンサーリンク

CorelDRAW VBAの深淵:ActivePage.Shapesを制する者が自動化を制す

CorelDRAWの自動化において、最も頻繁に行われる操作の一つが「シェイプの総数カウント」だ。だが、この単純なタスク一つを取っても、素人と達人ではコードの「品格」と「堅牢性」が決定的に異なる。

今日は、単にオブジェクトを数えるだけでなく、CorelDRAWのメモリ管理の機微に触れながら、実務レベルで「落ちない」コードの書き方を伝授する。

1. なぜ「単純なカウント」が現場で破綻するのか

多くの初心者は、`ActivePage.Shapes.Count` をそのまま表示して満足する。しかし、ドキュメントが大規模化し、グループ化が多重にネストされた複雑なベクターデータに触れた瞬間、そのコードは脆弱性を露呈する。

シニアエンジニアが意識すべきは以下の3点だ。

  • グループ化の罠: `Shapes.Count` はトップレベルのオブジェクトしか数えない。グループ内のオブジェクトを再帰的に走査する必要があるか、常に意識せよ。
  • メモリの開放: VBAは参照カウンタ方式のメモリ管理を行う。大規模なループ処理でオブジェクトを生成・破棄する際、明示的な `Nothing` の代入を怠れば、CorelDRAWの不安定化(メモリリーク)を招く。
  • コンテキストの保護: `ActivePage` はユーザーの操作に依存する。バックグラウンド処理では必ず `Document` オブジェクトを明示的に指定すべきだ。

2. 実装:堅牢なシェイプカウント・スクリプト

以下は、メモリの安全性を考慮しつつ、拡張性を担保したコードだ。

Option Explicit

‘ ———————————————————
‘ CorelDRAW VBA: アクティブページのシェイプ総数を取得
‘ ———————————————————
Public Sub CountShapesOnActivePage()
Dim doc As Document
Dim page As Page
Dim shpCount As Long

‘ エラーハンドリングの定石:予期せぬ終了を防ぐ
On Error GoTo ErrorHandler

‘ オブジェクトの明示的指定(ActiveDocumentへの依存を避ける)
Set doc = Application.ActiveDocument
Set page = doc.ActivePage

‘ シェイプ数の取得
‘ 注:このコードはトップレベルのオブジェクト数をカウントします
‘ グループ内も含める場合は再帰処理が必要ですが、基本はここからです
shpCount = page.Shapes.Count

MsgBox “現在のアクティブページに存在するシェイプ総数: ” & shpCount & ” 個”, _
vbInformation, “システム通知”

Cleanup:
‘ オブジェクトの明示的開放
Set page = Nothing
Set doc = Nothing
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
Resume Cleanup
End Sub

3. シニアエンジニアへの提言:さらなる高みへ

このコードを起点に、現場で戦うエンジニアは以下の「極限の知見」を追求せよ。

再帰的走査(Recursive Traversal)の重要性

`Shapes.Count` で満足せず、グループ内の全構成要素を数え上げるには、`Shape.Type` プロパティを確認し、`cdrGroupShape` であれば再帰的に関数を呼び出すロジックを組むこと。これができないと、複雑なロゴデータやCAD図面の変換で計算が狂う。

パフォーマンス最適化の極意

数万個のオブジェクトをループで回す際、`Application.Optimization = True` を活用せよ。これを記述することで、画面の再描画(Refresh)を抑制し、処理速度を劇的に向上させることができる。ただし、必ず終了時に `False` に戻すことを忘れてはならない。

システム間連携への備え

もしこのデータをCSVやXMLで外部システムへ渡すなら、`ActivePage.Shapes` をループする際、`Shape.StaticID` を活用せよ。VBA上のインスタンスIDは再起動で変わる可能性があるが、`StaticID` はドキュメント内で永続する。これこそが、レガシーシステムと現代のWeb APIを繋ぐための「確実なキー」となる。

結びに代えて

CorelDRAWのVBAは、単なるスクリプト言語ではない。それは、ドキュメントという名の「メモリ上の構造体」を操るための外科手術メスだ。

初心者は「動くこと」を目標にするが、達人は「後から読み返した時に絶望しないこと」を目標にする。今回紹介したコードは、その土台に過ぎない。この小さなカウントロジックを、君自身の設計思想で拡張し、真の自動化エンジニアへと進化してほしい。

次は、このシェイプの属性を抽出し、JSON形式で外部出力する手法について深掘りしよう。期待して待っていてくれ。

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