【簡単エクセル/Excel VBA マクロ】テーブル(ListObject)のデータを選択・参照する方法!|ListObject/構造化参照|ワンポイントテクニック #010

アフィリエイト広告を利用しています。
QRコード
【QRコード】PC<-->スマホの切り替えにご利用ください
アイキャッチ画像
運営者・ポテ

いつもありがとうございます。

ノンプログラマー向け「Excel VBA マクロ ワンポイントテクニック解説シリーズ」へようこそ。

本稿では「テーブル(ListObject)のデータの選択・参照方法」を解説いたします。

Information
  • ノンプログラマー
    プログラミングを専門にしていない人たちのことです。
  • VBAとマクロの違い
    VBAは、Visusal Basic for Application の略で、プログラミング言語のことです。マクロは、VBAを使って作成される「機能」のことです。

Excelのテーブルでは、A1形式やCells形式とは異なる、構造化された独自のデータ参照方法が用いられます。この仕組みがテーブルを活用する上でのハードルとなっている側面がありますが、通常の表として扱うよりも、テーブルとして管理することで多くのメリットを得られます。

本稿では、そのテーブル独自のデータの選択・参照方法を解説します。テーブルを自在に扱えるようになれば、あなたのVBAマクロが一段とプロフェッショナルな仕上がりになるでしょう。

VBAを活用して、自分やコミュニティに合ったアプリを作成し、仕事量は半分に、成果は2倍にしていきましょう!初心者の方にも分かりやすく丁寧に解説していきますので、ぜひ最後までご覧ください。

テーブルデータの選択・参照を行う2つの方法

テーブルは、ListObject と呼ばれるExcelのオブジェクトです。これにより、セル範囲をテーブルとして管理し、データの操作や分析を効率化できます。

テーブルのデータを選択・参照する方法には、大きく分けて 「ListObject」 を用いる方法 と「 構造化参照」を用いる方法 の2つがあります。次のセクションでそれぞれの方法を解説していきます。

なお、こちらの記事では、ListObjectと構造化参照の違いをシンプルにまとめています。もしよろしければ、合わせてご活用ください。

Information

構造化参照
Excelのデータ参照のしくみのひとつです。通常のセル参照(Cells(行番号、列番号))とは異なり、「テーブル名」、「特殊項目指定子」、「列指定子」でデータを参照します。

【具体例と解説】テーブルデータを選択・参照する方法

シナリオ

次のデータをテーブルに変換し、各種操作を実行していきます。

この記事で扱うシート

テーブルの作成方法

まず、VBAでテーブル作成する方法から解説します。

VBAでテーブルを作成するコードと、その実行結果は次の通りです。

Sub CreateListObject()


    ' 変数宣言
    Dim ws  As Worksheet    ' ワークシート
    Dim tbl As ListObject   ' テーブル
    Dim rng As Range        ' テーブルのデータ範囲
    
    
    ' ワークシートを取得
    Set ws = ThisWorkbook.Worksheets(1)
    
    ' データ範囲を取得
    Set rng = ws.Range(ws.Cells(1, 1), ws.Cells(11, 5))
    
    ' テーブル(ListObject)を作成
    Set tbl = ws.ListObjects.Add(xlSrcRange, rng, xlYes)
    
    ' デバッグ出力
    Debug.Print tbl.Name    ' テーブル1
    
    
End Sub
コード実行結果
コード実行結果
運営者・ポテ

解説します。

    ' 変数宣言
    Dim ws  As Worksheet    ' ワークシート
    Dim tbl As ListObject   ' テーブル
    Dim rng As Range        ' テーブルのデータ範囲

ここでは、コード内で使用する変数が宣言されています。変数は Dim 変数名 As データ型 の構文で宣言します。これにより、各変数は As 以降で指定したデータ型のデータを格納できるようになります。

なお、各変数のデータ型は下表の通りです。

データ型種類意味
Worksheetオブジェクト型Excelのワークシートを操作するためのデータ型です。
ListObjectオブジェクト型Excelのテーブル(ListObject)を操作するためのデータ型です。
Rangeオブジェクト型Excelシート内のセル範囲を操作するためのデータ型です。
    ' ワークシートを取得
    Set ws = ThisWorkbook.Worksheets(1)

ここでは、現在のワークブックのワークシート(ThisWorkbook.Worksheets(1))を取得し、変数wsに代入しています。これにより、以降のコードで は、ws を通じてワークシートに対する操作を行うことができるようになります。

    ' データ範囲を取得
    Set rng = ws.Range(ws.Cells(1, 1), ws.Cells(11, 5))

ここでは、テーブルとして設定するデータ範囲を取得し、変数rngに代入しています。なお、Setはオブジェクトを変数に代入するためのキーワードです。

    ' テーブル(ListObject)を作成
    Set tbl = ws.ListObjects.Add(xlSrcRange, rng, xlYes)

ここでは、テーブル(ListObject)を作成し、変数tblに代入しています。各引数の意味は下表の通りです。

引数指定するもの設定されている値意味
第1引数データの取得元xlSrcRange指定したセル範囲をテーブルとして追加する
第2引数テーブルのセル範囲rngws.Range(ws.Cells(1, 1), ws.Cells(11, 5)) をテーブルの範囲として指定
第3引数ヘッダーの有無xlYes最初の行をヘッダーとして認識する(xlNo ならヘッダーなし)

なお、第一引数には下表の定数を指定できます。

定数説明
xlSrcRange指定したセル範囲 (Range オブジェクト) をデータソースとする(今回のコードで使用)
xlSrcExternal外部データソース(クエリテーブルなど)をテーブルとして追加する
xlSrcQuery既存のクエリテーブルを元にテーブルを作成する
    ' デバッグ出力
    Debug.Print tbl.Name    ' テーブル1

これは、テーブルが無事に作成されたかを確認するために、テーブルの名前を出力するものです。イミディエイトウィンドウに、テーブル名が出力されます。これは、単なるデバッグ情報の出力ですので、無くても機能にはまったく影響しません。

運営者・ポテ

次のセクションから、テーブルのデータを選択・参照する方法を解説していきます。

テーブル全体を選択する方法

ListObjectで選択する方法

ListObjectでテーブル全体を選択するには、シンプルに.Rangeを用います。

Sub SelectRange()


    ' 変数宣言
    Dim ws  As Worksheet
    Dim tbl As ListObject
    Dim rng As Range
    
    
    ' ワークシートを取得
    Set ws = ThisWorkbook.Worksheets(1)

    ' テーブル(ListObject)を取得
    Set tbl = ws.ListObjects(1)
    
    ' テーブル全体を選択
    tbl.Range.Select
    
    
End Sub
コード実行結果
コード実行結果

見出し行を含むテーブル全体が選択されます。

構造化参照で選択する方法

構造化参照の基本構文は以下の通りです。

Range("テーブル名[[特殊項目指定子],[列指定子]]")

構造化参照でテーブル全体を選択するには、特殊項目指定子に[#All]を指定します。列指定子は、省略してかまいません。

Sub SelectAll()

    
    ' 変数宣言
    Dim ws  As Worksheet
    Dim tbl As ListObject
    Dim rng As Range
    
    
    ' ワークシートを取得
    Set ws = ThisWorkbook.Worksheets(1)

    ' テーブル(ListObject)を取得
    Set tbl = ws.ListObjects(1)
    
    ' テーブル名を変更
    tbl.Name = "Table1"
    
    ' 構造化参照方式でテーブル全体を選択
    Range("Table1[#All]").Select


End Sub

なお、構造化参照では、ListObjectのように、テーブルのインデックス番号でテーブルを指定することができません。テーブルの名称で指定する必要があります。そのため、例示したコードでは、確実にテーブルの名称でテーブルを指定することができるように、テーブルの名称を"Table1"に変更するコードを含めています。

見出し行を選択する方法

ListObjectで選択する方法

ListObjectで見出し行を選択するには、.HeaderRowRangeを使います。

Sub SelectHeaderRowRange()


    ' 変数宣言
    Dim ws  As Worksheet
    Dim tbl As ListObject
    Dim rng As Range
    
    
    ' ワークシートを取得
    Set ws = ThisWorkbook.Worksheets(1)

    ' テーブル(ListObject)を取得
    Set tbl = ws.ListObjects(1)
    
    ' 見出し行を選択
    tbl.HeaderRowRange.Select
    
    
End Sub
コード実行結果
コード実行結果

構造化参照で選択する方法

構造化参照で見出し行を選択するには、[#Headers]を使います。

Sub SelectHeaders()

    
    ' 変数宣言
    Dim ws  As Worksheet
    Dim tbl As ListObject
    Dim rng As Range
    
    
    ' ワークシートを取得
    Set ws = ThisWorkbook.Worksheets(1)

    ' テーブル(ListObject)を取得
    Set tbl = ws.ListObjects(1)
    
    ' テーブル名を変更
    tbl.Name = "Table1"
    
    ' 構造化参照方式で見出し行を選択
    Range("Table1[#Headers]").Select


End Sub

データ領域を選択する方法

ListObjectで選択する方法

ListObjectでデータ領域を選択するには、.DataBodyRangeを使います。

Sub SelectDataBodyRange()


    ' 変数宣言
    Dim ws  As Worksheet
    Dim tbl As ListObject
    Dim rng As Range
    
    
    ' ワークシートを取得
    Set ws = ThisWorkbook.Worksheets(1)

    ' テーブル(ListObject)を取得
    Set tbl = ws.ListObjects(1)
    
    ' データ領域を選択
    tbl.DataBodyRange.Select
    
    
End Sub
コード実行結果
コード実行結果

構造化参照で選択する方法

構造化参照でデータ領域を選択するには、[#Data]を使います。

Sub SelectData()

    
    ' 変数宣言
    Dim ws  As Worksheet
    Dim tbl As ListObject
    Dim rng As Range
    
    
    ' ワークシートを取得
    Set ws = ThisWorkbook.Worksheets(1)

    ' テーブル(ListObject)を取得
    Set tbl = ws.ListObjects(1)
    
    ' テーブル名を変更
    tbl.Name = "Table1"
    
    ' 構造化参照方式でデータ領域を選択
    Range("Table1[#Data]").Select


End Sub

列全体を選択する方法

ListObjectで選択する方法

ListObhectで列を選択するには、「列インデックス」で選択する方法と「列名」で選択する方法の2つの方法があります。

列インデックスで列を選択する方法

ListObjectの列インデックスで列を選択するには、.ListColumns(列番号)のように列を指定します。

Sub SelectColumnsByIndex()


    ' 変数宣言
    Dim ws  As Worksheet
    Dim tbl As ListObject
    Dim rng As Range
    
    
    ' ワークシートを取得
    Set ws = ThisWorkbook.Worksheets(1)

    ' テーブル(ListObject)を取得
    Set tbl = ws.ListObjects(1)
    
    ' 列インデックスで列を選択
    tbl.ListColumns(5).Range.Select
    
    
End Sub
列名で列を選択する方法

ListObjectの列名で列を選択するには、.ListColumns("列名")のように列を指定します。

Sub SelectColumnsByName()


    ' 変数宣言
    Dim ws  As Worksheet
    Dim tbl As ListObject
    Dim rng As Range
    
    
    ' ワークシートを取得
    Set ws = ThisWorkbook.Worksheets(1)

    ' テーブル(ListObject)を取得
    Set tbl = ws.ListObjects(1)
    
    ' 列インデックスで列を選択
    tbl.ListColumns("販売金額").Range.Select

    
End Sub
コード実行結果

列インデックス、列名、どちらの方法でも同じ結果が返ってきます。

コード実行結果
コード実行結果

構造化参照で選択する方法

構造化参照では、列名での指定しかサポートされていません。構造化参照で列を選択するには、[列名]のように列を指定します。特殊項目指定子と違い、文字列の前に"#"はつきませんので注意してください。

Sub SelectColumnsByRange()

    
    ' 変数宣言
    Dim ws  As Worksheet
    Dim tbl As ListObject
    Dim rng As Range
    
    
    ' ワークシートを取得
    Set ws = ThisWorkbook.Worksheets(1)

    ' テーブル(ListObject)を取得
    Set tbl = ws.ListObjects(1)
    
    ' テーブル名を変更
    tbl.Name = "Table1"
    
    ' 構造化参照方式でデータ領域を選択
    Range("Table1[[#All],[販売金額]]").Select
   

End Sub

列のデータ領域だけを選択する方法

ListObjectで選択する方法

ListObjectで列の「データ領域」だけ選択するには、tbl.ListColumns(5).DataBodyRange.Selectのように、間に.DataBodyRangeを入れます。

Sub SelectColumnsDataBody()


    ' 変数宣言
    Dim ws  As Worksheet
    Dim tbl As ListObject
    Dim rng As Range
    
    
    ' ワークシートを取得
    Set ws = ThisWorkbook.Worksheets(1)

    ' テーブル(ListObject)を取得
    Set tbl = ws.ListObjects(1)
    
    ' 列を選択(データ領域のみ)
    tbl.ListColumns(5).DataBodyRange.Select
    
    
End Sub
コード実行結果
コード実行結果

構造化参照で選択する方法

構造化参照方式で列のデータ領域だけ選択するには、Range("Table1[[#Data],[販売金額]]").Selectのように、特殊項目指定子に[#Data]を指定します。

Sub SelectColumnsByData()

    
    ' 変数宣言
    Dim ws  As Worksheet
    Dim tbl As ListObject
    Dim rng As Range
    
    
    ' ワークシートを取得
    Set ws = ThisWorkbook.Worksheets(1)

    ' テーブル(ListObject)を取得
    Set tbl = ws.ListObjects(1)
    
    ' テーブル名を変更
    tbl.Name = "Table1"
    
    ' 構造化参照方式で列のデータ領域を選択
    Range("Table1[[#Data],[販売金額]]").Select


End Sub

行を選択する方法

ListObjectで選択する方法

行を選択するには、ListRows(行番号)を使います。

Sub SelectRows()

    ' 変数宣言
    Dim ws  As Worksheet
    Dim tbl As ListObject
    Dim rng As Range
    
    
    ' ワークシートを取得
    Set ws = ThisWorkbook.Worksheets(1)

    ' テーブル(ListObject)を取得
    Set tbl = ws.ListObjects(1)
    
    ' 行を選択
    tbl.ListRows(1).Range.Select


End Sub
コード実行結果
コード実行結果

なお、コード実行結果から分かるように、テーブルの1行目(ListRows(1))は、見出し行の直下の行になります。見出し行ではありませんので、注意してください。

Warning

ListRows(1)は、見出し行ではなく、DataBodyRangeの1行目を指す。

構造化参照で選択する方法

構造化参照方式では、行を選択するメソッドはサポートされていません。

運営者・ポテ

以上で、テーブルのデータを選択・参照する方法の解説は終了です。ありがとうございました。

テーブルを解除する方法

テーブルをListObjectではなく、通常のデータに戻すことも可能です。

テーブルを通常データ構造に戻すコードと、その実行結果を示します。

Sub ConvertTabletoRange()

    
    ' 変数宣言
    Dim ws  As Worksheet
    Dim tbl As ListObject
    Dim rng As Range
    
    
    ' ワークシートを取得
    Set ws = ThisWorkbook.Worksheets(1)

    ' テーブル(ListObject)を取得
    Set tbl = ws.ListObjects(1)
    
    ' データ範囲を取得
    Set rng = tbl.Range
    Debug.Print rng.Address
    
    ' テーブル(listObject)解除
    tbl.Unlist
    
    ' 書式をもとに戻す
    rng.ClearFormats
    rng.Columns(1).NumberFormatLocal = "yyyy/mm"
    rng.Columns(4).NumberFormat = "#,##0_ "
    rng.Columns(5).NumberFormat = "#,##0_ "


End Sub
テーブル
コード実行前
通常の表
コード実行後

元に戻りました。なお、25~27行目は書式設定です。24行目ですべての書式をクリアしているため、日付型、数値型などの書式もクリアされるため、改めて書式を設定しています。

運営者・ポテ

以上で、テーブルを解除する方法の解説は終了です。ありがとうございました。

おわりに

運営者・ポテ

ご覧いただきありがとうございました。

今回の記事では、「テーブル(ListObject)のデータを選択・参照する方法」を解説いたしました。

お問い合わせやご要望等ございましたら、「お問い合わせ/ご要望」またはコメントにて、ご連絡いただければ幸いでございます。

皆様の人生がより一層素晴らしいものになるよう、少しでもお役に立てれば幸いでございます。

なお、当サイトでは様々な情報を発信しております。もしよろしければ、トップページもご覧いただけると幸いでございます。


関連記事

本稿と関連の深い記事です。もしよろしければ、合わせてご活用ください。

VBAプログラミングスキルアップのための参考情報

ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。

VBAプログラミングのスキルアップ

学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。



入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるよりは、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。

甲乙つけがたい場合、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。

\チェックしてみよう/

\チェックしてみよう/

\チェックしてみよう/


VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。



プログラミングの一般教養

「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。


こちらの記事でも紹介しております。もしよろしければご覧ください。

QRコード
【QRコード】PC<-->スマホの切り替えにご利用ください

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です