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