Excelでデータを入力していると、1行目にヘッダ行があって、実際のデータは2行目からということはよくあると思います。
VBAで何らかの処理を行っている際に、ヘッダ行を含んだRangeは取得済みだけど、ヘッダ行を除いた部分をRangeとして取得したい場合、今までは、最終行を取得して2行目から最終行までと指定していたのですが、別のアプローチがあることに気が付いてしまいました。
2019/5/22 修正
ヘッダ行を含むデータのRangeに対して、
1.ヘッダ行分、下にOffset
2.ヘッダ行分、行数をマイナスResize
でいけるんじゃない?
コメント欄で、jinoji さんからのご指摘にあるように、上記の順番では特定の条件下でエラーになるため、以下のようにするべきでしたので訂正しました。
ヘッダ行を含むデータのRangeに対して、
- ヘッダ行分、行数をマイナスResize
- ヘッダ行分、下に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 の指定を変えれば、列方向でも出来そうだ。