和風スパゲティのレシピ

日本語でコーディングするExcelVBA

Rowsプロパティで複数行を指定する

ワークシートの2行目全体を取得する際、

Dim rng単行 As Range
Set rng単行 = Worksheets("○○").Rows(2)

このようにRowsプロパティで行全体を取得することができます。


さて、同じ要領で2~10行目を取得したいのですが、
実はこれを数値指定でストレートに取得する機能がVBAにはありません。


「Rowsを使って複数行を数値で指定する方法」をたまに質問いただくのですが、
基本コードと呼べる書き方はありませんので、以下のいずれかの方法で実装します。

「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オブジェクトとして取得する方法の解説を終わります。

これ!という指定方法があるわけではありませんので、
状況に応じて使い分けてください。