1. はじめに
Excel VBAにおいて、ListObject
は「Excelのテーブル(リスト形式のデータ)」を表すオブジェクトです。Worksheet
オブジェクトのサブコレクションであるListObjects
は、そのシート上に存在するすべてのテーブルを管理し、個々のListObject
にアクセスできます。
テーブル機能はExcelのデータ管理で非常に重要で、フィルタリングや並べ替え、構造化参照などの強力な機能を持ちます。
VBAからListObject
を操作することで、これらの機能を自動化・拡張できます。
2. ListObjectとは何か?
- Excelの「テーブル」(Excel2007以降で導入された機能)をVBAで扱うためのオブジェクト。
- 1つのテーブルは
ListObject
オブジェクトで表現される。 - テーブルは見た目だけでなく、行・列の追加、フィルタ、集計など多彩な機能が備わっている。
3. Worksheet.ListObjectsコレクション
Worksheet
に存在するすべてのテーブルを格納するコレクション。ListObjects.Count
でテーブル数を取得可能。- インデックス番号または名前で個別の
ListObject
を取得できる。
例:テーブル数を取得して名前を列挙する
Sub ListObjects一覧表示()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim lo As ListObject
Dim i As Long
Debug.Print "テーブル数:" & ws.ListObjects.Count
For i = 1 To ws.ListObjects.Count
Debug.Print "テーブル名:" & ws.ListObjects(i).Name
Next i
End Sub
4. ListObjectの主要プロパティ
プロパティ | 説明 |
---|---|
Name | テーブル名(ユニーク) |
Range | テーブル全体のセル範囲(ヘッダー+データ) |
DataBodyRange | データ部分(ヘッダーを除く範囲)のセル範囲 |
HeaderRowRange | ヘッダー行のセル範囲 |
TotalsRowRange | 集計行のセル範囲(有効な場合) |
ShowTotals | 集計行の表示/非表示(Boolean) |
TableStyle | テーブルのスタイル名(例:”TableStyleMedium9″) |
ListColumns | 列のコレクション |
ListRows | 行のコレクション |
AutoFilter | テーブルのオートフィルタオブジェクト |
5. ListObjectの主なメソッド
メソッド | 説明 |
---|---|
Add | 新しいテーブルを作成(ListObjects.Add はWorksheet のメソッド) |
Delete | テーブルを削除(テーブルとしての形式を解除) |
Resize | テーブルの範囲を拡張・縮小 |
Refresh | 外部データソースのテーブル更新 |
Unlist | テーブルを解除(ただの範囲に戻す) |
6. テーブルの新規作成
Worksheet.ListObjects.Add
メソッドを使って新しいテーブルを作成できます。
例:セル範囲をテーブル化
Sub 新規テーブル作成()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim tbl As ListObject
Set tbl = ws.ListObjects.Add(xlSrcRange, ws.Range("A1:D10"), , xlYes)
tbl.Name = "MyTable"
tbl.TableStyle = "TableStyleMedium9"
End Sub
xlSrcRange
は範囲指定によるテーブル作成。- 最後の引数
xlYes
は「範囲の最初の行をヘッダーとして使う」ことを意味します。
7. テーブルの行・列操作
7-1. 行の追加
Sub テーブルに行追加()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim tbl As ListObject
Set tbl = ws.ListObjects("MyTable")
tbl.ListRows.Add
tbl.ListRows(tbl.ListRows.Count).Range(1, 1).Value = "新規データ"
End Sub
ListRows.Add
で末尾に新しい行を追加。- 追加した行のセルに値を入力できる。
7-2. 列の追加
Sub テーブルに列追加()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim tbl As ListObject
Set tbl = ws.ListObjects("MyTable")
tbl.ListColumns.Add
tbl.ListColumns(tbl.ListColumns.Count).Name = "新規列"
End Sub
8. フィルター操作
テーブルは自動的にオートフィルタが設定されており、VBAでフィルターを操作可能。
Sub フィルター適用例()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim tbl As ListObject
Set tbl = ws.ListObjects("MyTable")
' 1列目で「東京都」だけ表示
tbl.Range.AutoFilter Field:=1, Criteria1:="東京都"
End Sub
9. テーブルのスタイル変更
Sub スタイル変更()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
Dim tbl As ListObject
Set tbl = ws.ListObjects("MyTable")
tbl.TableStyle = "TableStyleLight11"
End Sub
- Excel標準のテーブルスタイル名を設定することで見た目を変更できる。
10. その他便利なポイント
10-1. DataBodyRangeの扱い
- 空のテーブルの場合、
DataBodyRange
はNothing
になることがあるため、扱う際には存在チェックを入れるのが安全。
If Not tbl.DataBodyRange Is Nothing Then
MsgBox "データ行数: " & tbl.DataBodyRange.Rows.Count
Else
MsgBox "データ行がありません"
End If
10-2. TotalsRowの活用
- 集計行を表示して合計や平均などを自動計算可能。
tbl.ShowTotals = True
tbl.ListColumns(2).TotalsCalculation = xlTotalsCalculationSum
11. サンプルコードまとめ
Sub ListObject操作まとめ()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sheet1")
' 新規テーブル作成
Dim tbl As ListObject
Set tbl = ws.ListObjects.Add(xlSrcRange, ws.Range("A1:C5"), , xlYes)
tbl.Name = "SampleTable"
tbl.TableStyle = "TableStyleMedium2"
' 行追加
tbl.ListRows.Add
tbl.ListRows(tbl.ListRows.Count).Range(1, 1).Value = "追加行"
' フィルター設定
tbl.Range.AutoFilter Field:=1, Criteria1:="特定の値"
' 集計行表示
tbl.ShowTotals = True
tbl.ListColumns(2).TotalsCalculation = xlTotalsCalculationAverage
End Sub
12. まとめ
項目 | 内容 |
---|---|
ListObject | Excelのテーブルを表すオブジェクト |
Worksheet.ListObjects | シート上のテーブルコレクション |
主な機能 | テーブル作成、行列追加、フィルター設定、集計表示、スタイル変更 |
使いどころ | データベース的なデータ管理、自動集計、ユーザー入力補助 |
注意点 | DataBodyRange の存在チェック、名前の重複に注意 |