CorelDRAW VBAを掌握せよ:レイヤー内オブジェクト「完全集計」で防ぐ、納品時の致命的ヒューマンエラー
現場のエンジニア諸君。CorelDRAWでのデータ制作において、「選択漏れ」ほど胃を痛めるミスはない。特に複雑なレイヤー構造を持つデザインデータにおいて、手動でのカウントはもはや「怠慢」であり、プロの仕事ではない。
今回は、CorelDRAWの内部オブジェクトモデルを深く理解し、レイヤー内の全オブジェクトを確実に捕捉して集計する、堅牢なスクリプトを伝授する。これは単なるカウントツールではない。「データ品質を保証するためのゲートキーパー」となるコードだ。
—
1. なぜ「単純なループ」では失敗するのか?
初心者は、`ActiveLayer.Shapes.Count` を見て満足する。だが、CorelDRAWの実務データはそう甘くない。
- グループ化されたオブジェクト: `Shapes` コレクションは「グループ内」のオブジェクトを直接カウントできない場合がある。
- 非表示・ロックされたレイヤー: 意図せず残った「隠しオブジェクト」を見落とす。
- 型判定の甘さ: ビットマップ、テキスト、カーブを混同すれば、出力設定で致命的なバグを招く。
プロの設計は、「再帰的アプローチ」または「効率的なイテレータ」を使い、コンテナの深層まで潜り込むことだ。
—
2. 実装:堅牢なオブジェクト集計スクリプト
このコードは、アクティブレイヤー内の全オブジェクトを走査し、型別に集計する。保守性を高めるため、`Select Case`による型判定を採用している。
‘ ==================================================
‘ CorelDRAW Object Counter – Professional Edition
‘ ————————————————–
‘ @description レイヤー内の全シェイプを再帰的に集計する
‘ @author Expert Engineer
‘ ==================================================
Sub ReportLayerObjectCount()
Dim lyr As Layer
Dim shp As Shape
Dim countCurve As Long, countBitmap As Long, countText As Long, countGroup As Long
Set lyr = ActiveLayer
‘ 集計処理の開始
ProcessShapes lyr.Shapes, countCurve, countBitmap, countText, countGroup
‘ レポート出力
Dim msg As String
msg = “— オブジェクト集計レポート —” & vbCrLf & _
“カーブ / ベクター: ” & countCurve & vbCrLf & _
“ビットマップ: ” & countBitmap & vbCrLf & _
“テキスト: ” & countText & vbCrLf & _
“グループ: ” & countGroup & vbCrLf & _
“——————————”
Debug.Print msg
MsgBox msg, vbInformation, “集計完了”
End Sub
‘ 再帰的に形状を掘り下げるプロシージャ
Private Sub ProcessShapes(shapes As Shapes, ByRef cCurve As Long, ByRef cBitmap As Long, ByRef cText As Long, ByRef cGroup As Long)
Dim shp As Shape
For Each shp In shapes
Select Case shp.Type
Case cdrCurveShape, cdrRectangleShape, cdrEllipseShape
cCurve = cCurve + 1
Case cdrBitmapShape
cBitmap = cBitmap + 1
Case cdrTextShape
cText = cText + 1
Case cdrGroupShape
cGroup = cGroup + 1
‘ グループ内を再帰的に探索(ここが重要)
ProcessShapes shp.Shapes, cCurve, cBitmap, cText, cGroup
End Select
Next shp
End Sub
—
3. 実務で「負けない」ための設計指針
このコードをそのまま使うだけでなく、以下の「現場の鉄則」を頭に叩き込んでおいてほしい。
① インデックスは常に「上から下」あるいは「コレクション単位」で
オブジェクトの削除や変更を伴う処理を行う場合、`For i = 1 To Shapes.Count` とすると、インデックスがずれてバグの温床になる。常に `For Each` を使い、オブジェクトの参照を直接保持するのがCorelDRAW VBAの正解だ。
② データベース・外部ファイル連携の注意点
集計結果をExcel等へ出力したい場合、`CreateObject(“Excel.Application”)` を使うことになるが、COM参照の解放(Set Nothing)を忘れるな。 CorelDRAWがバックグラウンドでゾンビプロセスとして残り、メモリを食いつぶす原因になる。
③ 保守性の極意
このスクリプトを「定型業務」に組み込むなら、`ProcessShapes` は別モジュール(Library.bas)に切り出すべきだ。プロジェクトが大きくなればなるほど、判定ロジックは一元管理されている必要がある。
—
結論:自動化は「品質」への投資である
今回紹介したコードは、あくまで「入り口」だ。これを起点に、「特定のレイヤー名以外を警告する」「埋め込まれたビットマップの解像度をチェックする」といったロジックを追加していけば、君の部署から「納品ミス」は根絶されるだろう。
技術とは、単にコードを書くことではない。「ミスが起きる構造そのものを破壊すること」だ。
このスクリプトを自分の武器にし、CorelDRAWの自動化領域を支配してほしい。質問があれば、いつでもコードで語り合おう。
