【VBA関係】VBAでテーブルを操作するにはListObject?構造化参照??|ポテの学習メモ #006
アフィリエイト広告を利用しています。

VBAでテーブルを扱うには、「ListObject」を使う方法と、「構造化参照」を使う方法がある。
Contents
ListObjectを使う方法
基本構文
Dim tbl As ListObject
Set tbl = Worksheet.ListObjects("テーブル名")
特徴
- テーブル全体、特定の列、行、セルを直接操作可能。
- テーブル全体の構造を把握して操作するのに向いている。
例
Sub WorkWithListObject()
Dim ws As Worksheet
Dim tbl As ListObject
' シートとテーブルの参照を設定
Set ws = ThisWorkbook.Sheets("Sheet1")
Set tbl = ws.ListObjects("Table1")
' データ範囲にアクセス
Debug.Print "データ範囲: " & tbl.DataBodyRange.Address
' 新しい行を追加
tbl.ListRows.Add
' 特定のセルを操作
tbl.DataBodyRange(1, 1).Value = "更新された値"
End Sub
主なプロパティ
項目名 | 説明 |
---|---|
DataBodyRange | データ部分の範囲(ヘッダーと集計行を除く) |
HeaderRowRange | ヘッダー部分の範囲 |
Range | テーブル全体の範囲(ヘッダー、データ、集計行を含む) |
ListRows | 行のコレクション |
ListColumns | 列のコレクション |
構造化参照を使う方法
構造化参照とは、Excelのテーブル(ListObject)のデータを、セルの位置ではなくテーブル名や列名を使って参照する方法。この仕組みにより、数式が分かりやすくなり、どのデータを指しているのかが一目で理解できるようになる。
基本構文
Range("テーブル名[特殊項目指定子][列指定子]")
特徴
- 「特殊項目指定子」や「列指定子」を使って、テーブル内の特定部分を参照。
- 簡潔な記述が可能。
例
Sub UseStructuredReferences()
Dim ws As Worksheet
Dim rng As Range
' テーブル全体を参照
Set rng = ws.Range("Table1[#All]")
Debug.Print "テーブル全体: " & rng.Address
' 特定の列を参照
Set rng = ws.Range("Table1[列名]")
Debug.Print "列「列名": " & rng.Address
' データ部分を参照
Set rng = ws.Range("Table1[#Data]")
Debug.Print "データ部分: " & rng.Address
End Sub
特殊項目指定子の一覧
指定子 | 説明 |
---|---|
#All | テーブル全体(ヘッダー行、データ部分、集計行を含む)。 |
#Headers | ヘッダー行のみ。 |
#Data | データ部分のみ(ヘッダー行と集計行を除く)。 |
#Totals | 集計行のみ。 |
操作方法:「ListObject 」vs 「構造化参照」
取得
' ListObject
Dim rng As Range
Set rng = tbl.DataBodyRange ' データの部分
' 構造化参照:
Dim rng As Range
Set rng = ws.Range("Table1[#Data]") ' データの部分
追加
' ListObject:
tbl.ListRows.Add ' 新しい行を追加
' 構造化参照:
サポートされていない
参照
' ListObject:
Dim value As Variant
value = tbl.DataBodyRange(1, 1).Value ' 1行目1列目の値を取得
Debug.Print value
' 構造化参照:
Dim value As Variant
value = ws.Range("Table1[列名]")(1, 1).Value ' 列名の最初の値を取得
Debug.Print value
削除
' ListObject:
tbl.ListRows(1).Delete ' 1行目を削除
' 構造化参照:
サポートされていない
ListObjectのプロパティと構造化参照の指定子の対応表
ListObjectプロパティ | 構造化参照指定子 | 説明 |
---|---|---|
Range | #All | テーブル全体(ヘッダー行、データ部分、集計行を含む) |
HeaderRowRange | #Headers | ヘッダー行のみ |
DataBodyRange | #Data | データ部分のみ(ヘッダー行と集計行を除く) |
(直接対応するプロパティなし) | #Totals | 集計行のみ |
ListRows | (対応なし) | 行のコレクション |
ListColumns | (対応なし) | 列のコレクション |
ListObjectと構造化参照の使い分けの例
操作対象 | おすすめ | 理由 |
---|---|---|
テーブル全体や列の操作 | ListObject | 列や行の追加・削除が簡単。 |
動的な列や行のデータ参照 | 構造化参照 (Range) | 可読性が高く、列名を使って直感的に指定可能。 |
特定のセルの操作 | どちらでも可 | 要件に応じて柔軟に選択可能。 |