【VBA関係】VBAでテーブルを操作するにはListObject?構造化参照??|ポテの学習メモ #006

アフィリエイト広告を利用しています。
アイキャッチ画像

VBAでテーブルを扱うには、「ListObject」を使う方法と、「構造化参照」を使う方法がある。

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)可読性が高く、列名を使って直感的に指定可能。
特定のセルの操作どちらでも可要件に応じて柔軟に選択可能。

コメントを残す

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