マクロ記録から一歩先へ。CorelDRAW VBAで「オブジェクトの数」を自在に操る極意
こんにちは。現場の自動化設計を司るチーフアーキテクトです。
CorelDRAWの「マクロの記録」機能を使って、VBAの世界に足を踏み入れた皆さん、ようこそ。記録されたコードを見て、「なんだか呪文みたいでよくわからないな……」と感じることはありませんか?
実は、マクロの記録は「特定の操作をなぞる」ことには長けていますが、「状況に応じて判断する」ことはできません。例えば、「もしレイヤーの中に図形が5個以上あったら、色を変える」といった、知的な判断をさせるには、コードの「意味」を理解する必要があります。
今日は、その第一歩として、非常に重要かつ強力なテクニックを伝授しましょう。テーマは「指定したレイヤー内のオブジェクト(図形)の数を数える」ことです。
これができるようになると、「図形が一つもないときはエラーにせず、メッセージを出す」といった、プロフェッショナルな自動化プログラムへの扉が開きます。
1. CorelDRAWの「階層構造」を理解しよう
コードを書く前に、CorelDRAWがどのような仕組みでデータを管理しているか、頭の中に「地図」を描いてください。VBAでオブジェクトを操作するとき、この地図(オブジェクトモデル)が分からないと、迷子になってしまいます。
CorelDRAWの世界は、以下のような入れ子構造(階層構造)になっています。
1. Application(CorelDRAWそのもの)
2. Document(開いているファイル)
3. Page(ページ)
4. Layer(レイヤー:図形をまとめる箱)
5. Shape(シェイプ:線、四角、円などの個々の図形)
私たちが今回やりたいのは、「Layer(箱)」の中に「Shape(中身)」がいくつ入っているかを確認することです。
2. 基本のコード:現在選択中のレイヤーを数える
まずは、最もシンプルに「今、自分が作業しているレイヤー」にある図形の数を数えるコードを見てみましょう。
Sub CountShapesInActiveLayer()
' --- 変数の宣言 ---
' Dim は「これからこの名前の変数を使いますよ」という宣言です
Dim shapeCount As Long
' --- メイン処理 ---
' ActiveLayer(現在アクティブなレイヤー)の
' Shapes(図形の集まり)の
' Count(個数)を取得して、変数に代入します
shapeCount = ActiveLayer.Shapes.Count
' --- 結果の通知 ---
' MsgBox は画面に小さなポップアップを表示する命令です
MsgBox "現在のレイヤーには、" & shapeCount & " 個のオブジェクトがあります。", vbInformation, "集計完了"
End Sub
💡 ここがポイント!
- `ActiveLayer`: 「今、ユーザーが触っているレイヤー」を指します。
- `.Shapes`: そのレイヤーの中に含まれるすべての図形をひとまとめにした「コレクション(集合体)」です。
- `.Count`: その集合体に、今いくつ要素が入っているかを数字(整数)で返してくれるプロパティです。
3. 実践編:特定の名前のレイヤーを指定して数える
実際の業務では、「現在選択しているレイヤー」ではなく、「”背景レイヤー”という名前のレイヤー」のように、特定の場所をピンポイントで調べたい場面が多々あります。
ここで、プロのエンジニアが書く「エラーに強いコード」を学びましょう。もし指定した名前のレイヤーが存在しなかったら、プログラムはエラーで止まってしまいます。それを防ぐのが「エラーハンドリング」です。
Sub CountShapesInSpecificLayer()
Dim targetLayerName As String
Dim targetLayer As Layer
Dim shapeCount As Long
' 調べたいレイヤーの名前を指定します
targetLayerName = "Layer 1" ' ←ここを実際のレイヤー名に変えてください
' エラーが発生しても止まらないように準備します
On Error Resume Next
' ドキュメントの中から、指定した名前のレイヤーを探して変数に格納します
Set targetLayer = ActiveDocument.Layers(targetLayerName)
' エラーチェック:もしレイヤーが見つからなかった場合(Err.Numberが0でない場合)
If Err.Number <> 0 Then
MsgBox "エラー: 「" & targetLayerName & "」というレイヤーは見つかりませんでした。", vbCritical, "レイヤー不在"
On Error GoTo 0 ' エラー設定をリセット
Exit Sub ' プログラムを終了します
End If
' エラー設定を通常に戻します
On Error GoTo 0
' レイヤーが見つかったので、その中の図形数を数えます
shapeCount = targetLayer.Shapes.Count
' 結果を表示
MsgBox "レイヤー「" & targetLayerName & "」内の図形数は " & shapeCount & " 個です。", vbInformation, "集計結果"
End Sub
🛠️ プロの視点:なぜ `Set` を使うのか?
コードの中に `Set targetLayer = …` という記述がありますね。
VBAでは、数値や文字などの「単純なデータ」を代入するときはそのまま書き、「レイヤー」や「図形」といった「オブジェクト(複雑な塊)」を代入するときは必ず `Set` を使うというルールがあります。これは、オブジェクトのメモリ上の住所(参照)を教えてあげる作業だからです。
4. 初心者が陥る「カウントの罠」
ここを理解しておけば、あなたはもう初心者卒業です。
罠①:「選択している図形」と「レイヤー内の図形」は違う!
よくある勘違いが、「画面でマウスで選択している図形の数」を数えようとして、`ActiveLayer.Shapes.Count` を使ってしまうことです。
- `ActiveLayer.Shapes.Count` $\rightarrow$ レイヤーにあるすべての図形を数えます。
- `ActiveSelection.Shapes.Count` $\rightarrow$ 今、マウスで選択している図形だけを数えます。
もし「選択しているものだけ数えたい」なら、`ActiveSelection` を使いましょう。
罠②:「グループ化された図形」の数え方
これが最も強力な落とし穴です。
例えば、レイヤーの中に「10個の小さな円」があり、それらを「グループ化」したとします。
このとき、`ActiveLayer.Shapes.Count` はいくつを返すでしょうか?
答えは 「1」 です。
CorelDRAWにとって、グループ化されたオブジェクトは「一つの大きな塊(Groupオブジェクト)」として扱われるからです。もしグループの中身まで細かく数えたい場合は、さらに深い階層(`Group.Shapes.Count`)へと潜っていく命令が必要になります。
まとめ:ここをクリアすれば、基本はバッチリ!
今日学んだことを振り返りましょう。
1. 階層を意識する: レイヤーの中に、図形(Shapes)という集合体がある。
2. `.Count` を活用する: 集合体の数を知る魔法の言葉。
3. エラーに備える: 指定したレイヤーがない場合に備えて、`On Error` を使うのがプロの作法。
4. 「選択」と「所属」を区別する: 自分が数えたいのは「選んでいるもの」か「レイヤーにいるもの」か。
プログラミングは、一歩ずつ「仕組み」を理解していく作業です。今回のように「数える」という小さな成功体験を積み重ねることで、やがて複雑な図面を自動で生成するような、壮大なシステムの構築へと繋がっていきます。
さあ、次は自分のドキュメントで、このコードを試してみてください。応援していますよ!
