【入門編】【初心者向け】指定したレイヤー内に描画されているオブジェクトの総数をカウントしてメッセージで通知するVBA – CorelDRAW VBA解析バイブル

スポンサーリンク
スポンサーリンク

マクロ記録から一歩先へ。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. 「選択」と「所属」を区別する: 自分が数えたいのは「選んでいるもの」か「レイヤーにいるもの」か。

プログラミングは、一歩ずつ「仕組み」を理解していく作業です。今回のように「数える」という小さな成功体験を積み重ねることで、やがて複雑な図面を自動で生成するような、壮大なシステムの構築へと繋がっていきます。

さあ、次は自分のドキュメントで、このコードを試してみてください。応援していますよ!

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