『Excel VBA 表計算とプログラミング学習サイト』では、アフィリエイトプログラムを利用して商品を紹介しています。

【VBA】ListObject

少し間が空きましたけど、データベース研究所の記事です。今回からいよいよ VBA を使ってテーブルデータを制御する方法を解説します。ワークシートのデータをテーブルに変換すると、そのデータ範囲は ListObject オブジェクト として VBA で操作できるようになります。もう少し細かく言うと、作った順番に

ListObjects(1), ListObjects(2), ...

というように自動で分類されます。() の中は自分で名づけたテーブル名で扱うこともできますよ。そうしたことも含めて、これから少しずつ ListObject オブジェクトに慣れていきましょう。

【VBA】テーブルをListObjectとして操作します

今回の記事では「リストの全体・見出し・データの選択」について学びます。次のような氏名と住所のデータを使って解説します。練習してみたい人は持ち帰ってくださいな。もちろんご自身で適当なデータを用意してくださってもかまいません。今回は見出しなどを選択するだけなので、データの中身は何でもいいのです。

氏名 住所
筆 玉枝 東京都目黒区目黒 3-46-11
井方 勝二郎 東京都板橋区赤塚 1-23-10
津高 君章 東京都板橋区若木 2-5-8
女部田 辰之助 東京都葛飾区白鳥 7-4-12
保手 真梨江 東京都荒川区西日暮里 5-33-7

ワークシートは新しいものを用意してください。上のデータを適当な場所にコピーして [ホーム]、[テーブルとして書式設定] を順に選択してテーブルに変換します。そのとき現れるダイアログボックスでは必ず [先頭行をテーブルの見出しとして使用する] チェックボックスを ON にしておいてください。

【VBA】ListObject.Range

まずはテーブル範囲全体を選択する簡単なマクロを書いてみます。

'[VBA] テーブル範囲全体を選択
Sub Select_Table()
  ActiveSheet.ListObjects(1).Range.Select
End Sub

Select_Table() を実行するとテーブル範囲全体が選択されます。
 
ListObjectsリスト全体を選択
 
テーブルの範囲は ListObject オブジェクトでは参照できません。必ず Range プロパティで Range オブジェクトを取得しておきます。

【VBA】ListObject.HeaderRowRange

次はテーブルの見出しの部分を選択してみましょう。ListObject オブジェクトの HeaderRowRange プロパティを使います。

'[VBA] テーブルの見出しを選択
Sub Select_Header()
  ActiveSheet.ListObjects(1).HeaderRowRange.Select
End Sub

Select_Header() を実行すると …
 
ListObjectsリスト見出しを選択
 
このようにテーブルの見出しが選択されます。

【VBA】ListObject.DataBodyRange

応用上は見出しを除いたデータ部分を得るのが最も実用的です。その場合は DataBodyRange プロパティで範囲を得ることになります。

'[VBA] テーブルのデータ部分を選択
Sub Select_Data()
  ActiveSheet.ListObjects(1).DataBodyRange.Select
End Sub

Select_Data() を実行すると …
 
ListObjectsリストのデータ部分を選択
 
ちゃんとデータ部分だけが選択されていますね。次回もまた ListObject オブジェクトについて色々と学びます。それから、「リストオブジェクト・オブジェクト」て音が重なってるけど、これは別に誤字ではありませんよ。念のため。

コメント

  1. あとりえこばと より:

    【AI脚本】テーブルデータの見出しを選択する方法を教わります

    シーン:IT企業の社員のデスク。
     
    登場人物
    新入社員:20代前半の女性社員。VBAを始めたばかり。
    先輩社員:30代後半の男性社員。VBAの経験が豊富。
     
    新入社員:先輩、VBAでテーブルデータの見出しを選択する方法を教えてもらえませんか?
    先輩社員:もちろん。テーブルデータの見出しを選択するには、以下の2つの方法があります。

    1. Rangeオブジェクトを使う方法
     
    新入社員:Rangeオブジェクトを使う方法とは、具体的にどのような方法ですか?
    先輩社員:RangeオブジェクトのHeaderRowRangeプロパティを使う方法です。HeaderRowRangeプロパティは、テーブルの見出し行を範囲として返すプロパティです。
    新入社員:なるほど。では、コードでどのように書けばよいのでしょうか?
    先輩社員:例えば、以下のコードは、テーブルの見出し行を Rangeオブジェクトとして取得するコードです。

    Sub サンプル()
        Dim ws As Worksheet
        Dim tb As ListObject
        Dim rng As Range
    
        Set ws = ThisWorkbook.Sheets("シート1")
        Set tb = ws.ListObjects("テーブル1")
        Set rng = tb.HeaderRowRange
    
        MsgBox rng.Address
    End Sub

    新入社員:コードを実行してみると、見出し行のセル範囲がメッセージボックスに表示されました。
    先輩社員:はい。これで、テーブルデータの見出し行を Rangeオブジェクトとして取得することができます。

    2. ListObjectオブジェクトを使う方法
     
    新入社員:ListObjectオブジェクトを使う方法とは、具体的にどのような方法ですか?
    先輩社員:ListObjectオブジェクトのRangeプロパティを使う方法です。Rangeプロパティは、テーブルの全範囲を取得するプロパティです。
    新入社員:なるほど。では、コードでどのように書けばよいのでしょうか?
    先輩社員:例えば、以下のコードは、テーブルの見出し行を ListObjectオブジェクトの Rangeプロパティとして取得するコードです。

    Sub サンプル()
        Dim ws As Worksheet
        Dim tb As ListObject
    
        Set ws = ThisWorkbook.Sheets("シート1")
        Set tb = ws.ListObjects("テーブル1")
    
        MsgBox tb.Range(1).Address
    End Sub

    新入社員:コードを実行してみると、見出し行のセル範囲がメッセージボックスに表示されました。
    先輩社員:はい。これで、テーブルデータの見出し行を ListObjectオブジェクトの Rangeプロパティとして取得することができます。
    新入社員:ありがとうございます。先輩の説明で、テーブルデータの見出しを選択する方法がよくわかりました。
    先輩社員:どういたしまして。何かわからないことがあれば、いつでも聞いてください。
     
    (新入社員がコードを試しながら、先輩社員からアドバイスを受ける。)

    【解説】この脚本では、IT企業の新入社員が、VBAでテーブルデータの見出しを選択する方法を先輩社員から教わっています。RangeオブジェクトのHeaderRowRangeプロパティを使う方法は、テーブルの見出し行を Rangeオブジェクトとして取得する方法です。ListObjectオブジェクトのRangeプロパティを使う方法は、テーブルの全範囲を取得する ListObjectオブジェクトの Rangeプロパティから、見出し行を取得する方法です。どちらの方法も、テーブルデータの見出し行を取得することができます。どちらの方法を使うかは、コードの書きやすさや、取得したい範囲によって判断するとよいでしょう。