ワークシートの2行目全体を取得する際、
Dim rng単行 As Range Set rng単行 = Worksheets("○○").Rows(2)
このようにRowsプロパティで行全体を取得することができます。
さて、同じ要領で2~10行目を取得したいのですが、
実はこれを数値指定でストレートに取得する機能がVBAにはありません。
「Rowsを使って複数行を数値で指定する方法」をたまに質問いただくのですが、
基本コードと呼べる書き方はありませんので、以下のいずれかの方法で実装します。
- 「2:10」などの行アドレスを文字列結合で作る
- Range(Rows(開始行), Rows(最終行))
- Rows(開始行).Resize(行数)
- セル範囲.EntireRow
- 2,4,6行目など飛び飛びの行を取得する場合
「2:10」などの行アドレスを文字列結合で作る
まずはじめに、Rowsプロパティで2~10行目など複数行を指定する場合は、
Dim rng複数行 As Range Set rng複数行 = Worksheets("○○").Rows("2:10")
このようなセルアドレスによる指定を行うことができます。
しかしこの方法は「"2:10"」が文字列であるため、
「開始行」「最終行」などの変数(数値)を直接渡すことができません。
よって変数内の数値を使ってこの指定を行いたい場合は、
Dim 開始行 As Long: 開始行 = 2 Dim 最終行 As Long: 最終行 = 10 Dim 複数行 As Range Set 複数行 = Worksheets("○○").Rows(開始行 & ":" & 最終行)
このように文字列を結合して「2:10」を作る必要があります。
が、せっかくの「数値」をわざわざ:と結合するのは違和感という方が多いため、
「Rowsを使って複数行を数値で指定する方法」
をよく質問いただくのかなと推測します。
そもそもこの方法は「Columns」には使えないという問題がありますしね。
この方法を用いない場合は、以下の別案を採用してください。
Range(Rows(開始行), Rows(最終行))
セル範囲を指定する際、始点セルと終点セルを使って、
Range(Cells(R1, C1), Cells(R2, C2))
このように指定する方法があります。
これと同様、以下のようにRangeプロパティにRowsを二つ渡すことで、
複数の行をRangeオブジェクトとして取得することができます。
Range(Rows(開始行), Rows(最終行))
親シートを指定する場合は中のRowsどちらも指定する必要があるため、
シートは変数に入れておくのをおすすめします。
Range(Worksheets("○○").Rows(開始行), Worksheets("○○").Rows(最終行))
(実は外のRangeはシート指定が不要です)
開始行と最終行を変数(数値)で持っている場合は、
このコードが一番自然に複数行を取得できるコードです。
まずはこのコードを押さえておきましょう。
Rows(開始行).Resize(行数)
続いてはResizeプロパティを使用する方法です。
Resizeプロパティは「行数・列数を指定してセル範囲を取得するプロパティで、
Range("A1").Resize(3, 3)
このコードで「A1:C3」のセル範囲を取得できます。
Resizeの各引数は省略することができ、
省略時は元のセル範囲の大きさをそのまま用います。
Range("A1:B2").Resize(3) ' A1:B3(行数だけを変更) Range("A1:B2").Resize(, 3) ' A1:C2(列数だけを変更)
この性質を利用し、列数を省略したResizeをRowsから実行することで、
複数行(複数列)を取得することが可能です。
Rows(開始行).Resize(行数) ' 複数行を取得 Columns(開始列).Resize(, 列数) ' 複数列を取得
最終行ではなく行数の方を変数で持っている場合は、
こちらの方法を採用してみてください。
セル範囲.EntireRow
続いてEntireRowプロパティを使用する方法です。
EntireRowプロパティはあるセル範囲を含む行全体を取得するプロパティで、
Range("A2:C10").EntireRow
このコードで2~10行目を取得することができます。
このプロパティは「セル範囲を取得するプロパティ」ととても相性がよく、
例えばオートフィルターの対象行全体を取得する場合は、
Worksheets("○○").AutoFilter.Range.EntireRow
このコードで一発で行全体を取得することができます。
行番号ではなくセル範囲を基準に行全体を持ってくる場合は、
こちらの方法を採用してください。
2,4,6行目など飛び飛びの行を取得する場合
最後に「2,4,6行目」など飛び飛びの行を取得する方法です。
が、こちらを取得するプロパティはVBAにはありませんので、
基本的にはFor文などで愚直に処理を進めることになります。
Dim rng対象行 As Range Dim R As Long For R = 2 To 1000 Step 2 Set rng対象行 = Worksheets("○○").Rows ' ここに対象行への処理を書く Next
Deleteメソッドを一括で実行したいなどの事情で、
飛び飛びの行をいったん一つのRangeオブジェクトにする場合は、
Unionメソッドを利用して対応してください。
Dim rng対象行 As Range Dim R As Long For R = 2 To 1000 Step 2 Set rng対象行 = Worksheets("○○").Rows ' ここに対象行への処理を書く Next
以上で複数行をRangeオブジェクトとして取得する方法の解説を終わります。
これ!という指定方法があるわけではありませんので、
状況に応じて使い分けてください。