スポンサーリンク

【VBA】テーブルのヘッダーとデータ行の扱いの違い|ListObjectを正しく使い分ける方法

この記事では、テーブル操作を理解するうえで非常に重要なポイントである、「ヘッダー行」と「データ行」の扱いの違い を詳しく解説します。

Excelのテーブルは、通常のセル範囲と違い ヘッダー(列名を持つ行) と データ部分(実際のデータが入る行) を明確に区別して管理しています。これを理解せずにコードを書くと、「ヘッダーまで処理してしまった」「行数が合わない」といったトラブルにつながります。


スポンサーリンク

1. ヘッダー行とは?

テーブルの最上段にある「列名」が入っている行を ヘッダー行 と呼びます。

例(売上表)

商品名単価数量売上
りんご1003300
バナナ1202240

この表では、1行目(「商品名」「単価」「数量」「売上」)がヘッダー行です。

VBAで取得する場合は HeaderRowRange を使います。

Sub GetHeaderRange()
    Dim lo As ListObject
    Set lo = ThisWorkbook.Sheets("Sheet1").ListObjects("売上表")
    
    Debug.Print lo.HeaderRowRange.Address 'ヘッダー行の範囲
End Sub

👉 例えば $A$1:$D$1 のような範囲が返されます。


スポンサーリンク

2. データ行とは?

ヘッダー以降の部分、つまり実際のデータが入力されている行が データ行(Data Body Range) です。

VBAでは DataBodyRange を使って取得します。

Sub GetDataRange()
    Dim lo As ListObject
    Set lo = ThisWorkbook.Sheets("Sheet1").ListObjects("売上表")
    
    Debug.Print lo.DataBodyRange.Address 'データ部分の範囲
End Sub

例えば $A$2:$D$6 のように、ヘッダーを除いた範囲が返ります。

👉 注意点:
もしテーブルにデータが1件もない場合、DataBodyRange は Nothing になります。このため、必ず「存在チェック」をしてから使うのが安全です。


スポンサーリンク

3. ヘッダーとデータ行を混同すると起きる問題

  • 行数を数えるときにズレる
    • lo.Range.Rows.Count はヘッダー行も含む
    • lo.ListRows.Count はデータ行のみ
  • データ処理時にヘッダーまで変更してしまう
    • ループ処理で lo.Range を使うとヘッダーまで対象になる
    • データだけを扱いたいなら lo.DataBodyRange を指定する必要がある

👉 実務では「データだけ処理したい」ことがほとんどなので、DataBodyRange を使う習慣を持つのがおすすめです。


スポンサーリンク

4. 合計行(TotalsRow)の扱い

テーブルには「合計行」を表示する機能があります。
これもヘッダー・データとは別に管理されています。

取得する場合は TotalsRowRange を使います。

Debug.Print lo.TotalsRowRange.Address '合計行の範囲

もし合計行が設定されていない場合は、Nothing になります。


5. 実務での使い分けまとめ

種類VBAプロパティ含まれる内容
ヘッダー行HeaderRowRange列名が入った最上段の行
データ行DataBodyRange実際のデータ部分のみ
合計行TotalsRowRange集計用の最下段(オプション)
全体Rangeヘッダー~データ~合計行を含む全範囲

6. まとめ

  • ヘッダー行 → 列名を管理する部分(HeaderRowRange
  • データ行 → 実際のデータ部分(DataBodyRange
  • 合計行 → 必要に応じて追加される集計部分(TotalsRowRange
  • 混同するとズレが発生するため注意!

テーブルを扱うときは、必ず「今対象にしているのはヘッダーか?データか?合計か?」を意識してコードを書くことが、バグ防止につながります。

コメント

タイトルとURLをコピーしました