この記事では、テーブル操作を理解するうえで非常に重要なポイントである、「ヘッダー行」と「データ行」の扱いの違い を詳しく解説します。
Excelのテーブルは、通常のセル範囲と違い ヘッダー(列名を持つ行) と データ部分(実際のデータが入る行) を明確に区別して管理しています。これを理解せずにコードを書くと、「ヘッダーまで処理してしまった」「行数が合わない」といったトラブルにつながります。
1. ヘッダー行とは?
テーブルの最上段にある「列名」が入っている行を ヘッダー行 と呼びます。
例(売上表)
商品名 | 単価 | 数量 | 売上 |
---|---|---|---|
りんご | 100 | 3 | 300 |
バナナ | 120 | 2 | 240 |
この表では、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
) - 混同するとズレが発生するため注意!
テーブルを扱うときは、必ず「今対象にしているのはヘッダーか?データか?合計か?」を意識してコードを書くことが、バグ防止につながります。
コメント