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

スポンサーリンク

CorelDRAW VBAを掌握せよ:シェイプカウントから始まる「堅牢な自動化」の第一歩

CorelDRAWの自動化の世界へようこそ。
多くの初心者が「とりあえず動くコード」を書いて満足するが、我々エンジニアが目指すのは「止まらない、腐らない、拡張可能なシステム」だ。

今日は、最も基本にして本質的な「アクティブページの全シェイプ数をカウントする」処理を題材に、なぜあなたのコードが遅いのか、なぜバグるのか、そしてどう書くのが正解なのかを伝授する。

なぜ「適当なカウント」が業務を破綻させるのか

初心者が陥る最大の間違いは、オブジェクトのライフサイクルを考慮せず、無秩序に `ActivePage.Shapes.Count` を連発することだ。

CorelDRAWのVBA環境において、`Shapes` コレクションへのアクセスは、実はドキュメントの構造が複雑になればなるほど(特にグループ化やネストされたレイヤーが存在する場合)、パフォーマンス上のボトルネックになる。実務では、単に数えるだけでなく、「グループの内部まで含めるべきか」「ロックされたオブジェクトはどう扱うか」という設計思想が問われるのだ。

プロダクション品質のコード:CountShapesInPage

以下は、保守性を担保した「現場で使える」コードだ。これをベースに、今後のツールを構築してほしい。

Option Explicit

”’

”’ アクティブページの全シェイプをカウントする
”’

Public Sub CountShapesInActivePage()
‘ オブジェクトの参照を厳密に管理する
Dim p As Page
Dim sCount As Long

‘ エラーハンドリングの定石:予期せぬドキュメント未オープン状態への対策
On Error GoTo ErrorHandler

‘ アクティブドキュメントの存在確認
If Documents.Count = 0 Then
MsgBox “ドキュメントが開かれていません。”, vbCritical
Exit Sub
End If

‘ アクティブページを取得(ドキュメントの状態に依存させない)
Set p = ActivePage

‘ シェイプカウントの取得
‘ Shapes.Countは全シェイプを返すが、グループは1つのシェイプとしてカウントされる点に注意
sCount = p.Shapes.Count

‘ 結果の出力
MsgBox “現在のアクティブページには ” & sCount & ” 個のシェイプが存在します。”, vbInformation, “集計結果”

Exit Sub

ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
End Sub

知っておくべき「3つの鉄則」

現場で生き残るために、このコードからさらに一歩進んだ知見を共有しよう。

1. グループの再帰的走査(Recursive Traversal)

上記の `Shapes.Count` はあくまで「最上位階層」のシェイプ数だ。もしグループの中に50個のオブジェクトがあっても、CorelDRAWはそれを「1」と数える。
もし真の全オブジェクト数をカウントしたいなら、`Shape.Type` を判定し、`cdrGroupShape` であれば再帰的に関数を呼び出すロジックが必要になる。これが「真のエンジニア」と「コピペエンジニア」の境界線だ。

2. パフォーマンスの罠:ScreenUpdating

大量のシェイプを操作・走査する場合、画面の再描画を一時停止させるのは常識だ。

Application.Optimization = True
‘ ここに重い処理
Application.Optimization = False
Application.Refresh

これを書かないツールは、実行中にCorelDRAWをフリーズさせ、ユーザーのイライラを誘発する「ゴミ」と化す。

3. データベース連携を見据えた設計

もしこのカウント結果をCSVやDBへ出力したいなら、「計算ロジック」と「出力ロジック」を分けること
カウント処理を `Function` として切り出し、戻り値として `Long` 型を返すように設計しておけば、将来的に「全ページの合計数を出したい」「特定のレイヤーだけ抽出したい」という要望が出た際に、コードを書き直す必要がなくなる。

次なるステップへ

今回のカウント処理は、自動化の「観測」に過ぎない。
次は、この `Shapes` コレクションを `For Each` 文でループさせ、特定の条件(例:特定の色の塗りつぶしを持つシェイプだけを抽出する)でフィルタリングするロジックに挑戦してほしい。

CorelDRAWのAPIは強力だ。だが、その力を引き出すのはエンジニアである君の「設計思想」だ。
分からないことがあれば、またいつでも聞きに来るといい。現場での健闘を祈る。

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