空腹おやじのログと備忘録

VBA(主にExcel)でいろいろな実験的な事とか、Linuxのコマンドとか設定とかについて忘れないように、あれこれと・・・

【VBA】任意のRangeの先頭1行を除いたRangeを簡単に取得する

Excelでデータを入力していると、1行目にヘッダ行があって、実際のデータは2行目からということはよくあると思います。
VBAで何らかの処理を行っている際に、ヘッダ行を含んだRangeは取得済みだけど、ヘッダ行を除いた部分をRangeとして取得したい場合、今までは、最終行を取得して2行目から最終行までと指定していたのですが、別のアプローチがあることに気が付いてしまいました。

2019/5/22 修正
ヘッダ行を含むデータのRangeに対して、
1.ヘッダ行分、下にOffset
2.ヘッダ行分、行数をマイナスResize
でいけるんじゃない?

コメント欄で、jinoji さんからのご指摘にあるように、上記の順番では特定の条件下でエラーになるため、以下のようにするべきでしたので訂正しました。

ヘッダ行を含むデータのRangeに対して、

  1. ヘッダ行分、行数をマイナスResize
  2. ヘッダ行分、下にOffset
Public Sub hoge()

    Dim r   As Range

    Set r = Range("A1:B10")

    Debug.Print "Original Range   : " & r.Address(False, False)

'    Debug.Print "ヘッダ行除外 Range : " & r.Offset(1, 0).Resize(r.Rows.Count - 1).Address(False, False)
    Debug.Print "ヘッダ行除外 Range : " & r.Resize(r.Rows.Count - 1).Offset(1, 0).Address(False, False)

End Sub

実行結果

call hoge
Original Range   : A1:B10
ヘッダ行除外 Range : A2:B10

ほら、大丈夫!A1がA2に変わってる。
最終行を取得しなくてもいいし、1行で取得できるし、ちょっとお得な気分。

途中に結合されたセルがあっても大丈夫みたい。
でも、最初のRangeの行数が1だと、実行時エラーになりますからね。

Offset と Resize の指定を変えれば、列方向でも出来そうだ。