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



いつもありがとうございます。
ノンプログラマー向け「Excel VBA マクロ ワンポイントテクニック解説シリーズ」へようこそ。
本稿では「テーブル(ListObject)のデータの選択・参照方法」を解説いたします。
Excelのテーブルでは、A1形式やCells
形式とは異なる、構造化された独自のデータ参照方法が用いられます。この仕組みがテーブルを活用する上でのハードルとなっている側面がありますが、通常の表として扱うよりも、テーブルとして管理することで多くのメリットを得られます。
本稿では、そのテーブル独自のデータの選択・参照方法を解説します。テーブルを自在に扱えるようになれば、あなたのVBAマクロが一段とプロフェッショナルな仕上がりになるでしょう。
VBAを活用して、自分やコミュニティに合ったアプリを作成し、仕事量は半分に、成果は2倍にしていきましょう!初心者の方にも分かりやすく丁寧に解説していきますので、ぜひ最後までご覧ください。
テーブルデータの選択・参照を行う2つの方法
テーブルは、ListObject と呼ばれるExcelのオブジェクトです。これにより、セル範囲をテーブルとして管理し、データの操作や分析を効率化できます。
テーブルのデータを選択・参照する方法には、大きく分けて 「ListObject」 を用いる方法 と「 構造化参照」を用いる方法 の2つがあります。次のセクションでそれぞれの方法を解説していきます。
なお、こちらの記事では、ListObjectと構造化参照の違いをシンプルにまとめています。もしよろしければ、合わせてご活用ください。
【具体例と解説】テーブルデータを選択・参照する方法
シナリオ
次のデータをテーブルに変換し、各種操作を実行していきます。

テーブルの作成方法
まず、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引数 | テーブルのセル範囲 | rng | ws.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)
)は、見出し行の直下の行になります。見出し行ではありませんので、注意してください。
構造化参照で選択する方法
構造化参照方式では、行を選択するメソッドはサポートされていません。

以上で、テーブルのデータを選択・参照する方法の解説は終了です。ありがとうございました。
テーブルを解除する方法
テーブルを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)のデータを選択・参照する方法」を解説いたしました。
お問い合わせやご要望等ございましたら、「お問い合わせ/ご要望」またはコメントにて、ご連絡いただければ幸いでございます。
皆様の人生がより一層素晴らしいものになるよう、少しでもお役に立てれば幸いでございます。
なお、当サイトでは様々な情報を発信しております。もしよろしければ、トップページもご覧いただけると幸いでございます。
関連記事
本稿と関連の深い記事です。もしよろしければ、合わせてご活用ください。
- 【簡単エクセル/Excel VBA マクロ】Excel VBA マクロの全体像 | みんなの実用学 (jitsuyogaku.com)
- 【簡単エクセル/Excel VBA マクロ】通常使用編目次 | みんなの実用学 (jitsuyogaku.com)
- 【簡単エクセル/Excel VBA マクロ】ワンポイントテクニック編目次 | みんなの実用学 (jitsuyogaku.com)
- 【簡単エクセル/Excel VBA マクロ】アプリ事例編目次 | みんなの実用学 (jitsuyogaku.com)
VBAプログラミングスキルアップのための参考情報
ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。
VBAプログラミングのスキルアップ
学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。
入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるよりは、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。
甲乙つけがたい場合、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。
\チェックしてみよう/
\チェックしてみよう/
\チェックしてみよう/
VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
こちらの記事でも紹介しております。もしよろしければご覧ください。
