ExcelVBAを使ってセルや範囲を操作するとき、最もよく使うのがRangeですが、固定的な「Range("A1:B5")」だけでは実務で十分とはいえません。行数や列数が可変のデータを扱う場面では、より柔軟な範囲指定が求められます。
そこで活躍するのが RangeとCellsの組み合わせ です。これを使えば「開始位置と終了位置を変数で動的に指定する」「データ量に応じて範囲を拡張する」といった高度な処理が可能になります。
この記事では「vba Range(Cells 組み合わせ)」をテーマに、基本的な仕組みから実務で役立つ応用サンプルまでを徹底解説します。読了後には、柔軟な範囲指定を自在に操れるようになるはずです。
目次
- ✅ RangeとCellsを組み合わせる基本
- ・Cellsの基本構文
- ・Rangeと組み合わせる基本形
- ✅ 固定範囲と動的範囲の違い
- ・固定範囲
- ・動的範囲(Range+Cells)
- ✅ 実務で使えるRange(Cells)の活用例
- ・最終行まで範囲を指定する
- ・変数で範囲を切り替える
- ・表全体を対象にする
- ✅ Range(Cells)とOffset・Resizeの組み合わせ
- ・Offsetで相対範囲を指定
- ・Resizeで範囲を拡張
- ✅ 実務的な応用サンプル
- ・条件一致行を抽出
- ・複数列をまとめてコピー
- ・検索結果の範囲を取得
- ✅ Range(Cells)利用時の注意点
- ✅ RangeとCellsの組み合わせを使いこなすメリット
- ■ まとめ:RangeとCellsの組み合わせで柔軟な範囲指定を実現しよう
✅ RangeとCellsを組み合わせる基本
・Cellsの基本構文
Cells(行番号, 列番号)
行番号と列番号でセルを指定する構文です。
例:
Cells(3, 2).Value = "B3セル"
・Rangeと組み合わせる基本形
Range(Cells(開始行, 開始列), Cells(終了行, 終了列))
2つのCellsを使い、範囲を動的に指定します。
例:
Range(Cells(2, 1), Cells(5, 3)).Select
A2からC5までの範囲を選択します。
参考:【VBA】変数を使ってセル範囲を指定する方法|柔軟な範囲操作の基本と応用
✅ 固定範囲と動的範囲の違い
・固定範囲
Range("A2:C5").Select
直接アドレスを記載する方法。分かりやすい反面、柔軟性が低い。
・動的範囲(Range+Cells)
Dim r1 As Long, r2 As Long
r1 = 2
r2 = 10
Range(Cells(r1, 1), Cells(r2, 3)).Select
A2からC10までを変数で指定。データ量が変化しても対応可能。
✅ 実務で使えるRange(Cells)の活用例
・最終行まで範囲を指定する
Sub SelectToLastRow()
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
Range(Cells(2, 1), Cells(lastRow, 3)).Select
End Sub
A列の最終行を自動検出し、A2からC列の最終行までを選択。
・変数で範囲を切り替える
Sub DynamicRange()
Dim startRow As Long, endRow As Long
startRow = 5
endRow = 15
Range(Cells(startRow, 2), Cells(endRow, 4)).Interior.Color = vbYellow
End Sub
B5からD15までを黄色に塗りつぶし。
・表全体を対象にする
Sub TableProcess()
Dim lastRow As Long, lastCol As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
Range(Cells(1, 1), Cells(lastRow, lastCol)).Borders.LineStyle = xlContinuous
End Sub
表全体に罫線を自動で引く。
✅ Range(Cells)とOffset・Resizeの組み合わせ
・Offsetで相対範囲を指定
Range(Cells(2, 2), Cells(5, 4)).Offset(1, 1).Select
指定範囲から1行下・1列右にシフトした範囲を選択。
・Resizeで範囲を拡張
Range(Cells(2, 2), Cells(2, 2)).Resize(5, 3).Select
B2を基点に5行×3列の範囲を指定。
✅ 実務的な応用サンプル
・条件一致行を抽出
Sub ExtractRows()
Dim lastRow As Long, i As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
If Cells(i, 2).Value = "完了" Then
Range(Cells(i, 1), Cells(i, 5)).Copy Sheets("結果").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0)
End If
Next i
End Sub
B列が「完了」の行を別シートにコピー。
参考:【VBA】If文を使って次の処理へ進む方法|条件分岐・スキップ・中断の実例解説
・複数列をまとめてコピー
Sub CopyColumns()
Range(Cells(1, 1), Cells(100, 1)).Copy Destination:=Range("E1")
Range(Cells(1, 3), Cells(100, 3)).Copy Destination:=Range("F1")
End Sub
A列とC列をE列・F列にコピー。
・検索結果の範囲を取得
Sub FindAndHighlight()
Dim f As Range
Set f = Range(Cells(1, 1), Cells(100, 1)).Find("重要")
If Not f Is Nothing Then
f.Interior.Color = vbRed
End If
End Sub
検索で一致したセルを赤色に。
✅ Range(Cells)利用時の注意点
- Setの使い忘れ
Range型変数に代入するときは必ずSetを使用。
参考:【VBA】SetとDimの違いを使い方と一緒にわかりやすく比較 - ワークシートの明示指定
複数シートを扱う場合は、必ずシートを明示しないと誤動作の原因になる。
参考:【VBA】ワークシートクラスのActivateメソッドが失敗しました:原因・対策Worksheets("データ").Range(Cells(2, 1), Cells(10, 3))→ 実際には
Cellsも同じシートに属させる必要あり。Worksheets("データ").Range(Worksheets("データ").Cells(2, 1), Worksheets("データ").Cells(10, 3)) - 範囲外エラー
データが存在しない場合、End(xlUp)やEnd(xlToLeft)が予期せぬセルを返すことがある。
✅ RangeとCellsの組み合わせを使いこなすメリット
- データ量に応じて範囲を動的に指定できる。
- コードの汎用性が高まり、再利用しやすい。
- 表全体や条件一致範囲を自動的に扱えるため、業務効率化に直結。
- OffsetやResizeと併用することで、さらに柔軟な範囲操作が可能。
■ まとめ:RangeとCellsの組み合わせで柔軟な範囲指定を実現しよう
- RangeとCellsを組み合わせると、開始セルと終了セルを動的に指定できる。
- 最終行・最終列の自動取得や表全体の操作に不可欠。
- Offset・Resizeと併用すれば、相対的かつ柔軟な範囲操作が可能。
- 実務では「条件一致行の抽出」「検索結果の処理」「表全体への罫線設定」など幅広い場面で活躍。
- ワークシートの明示や範囲外エラーへの対策を忘れずに行う。
ExcelVBAでRangeとCellsを組み合わせた範囲指定をマスターすれば、どんな規模のデータでも効率的に扱えるようになります。実務効率化の第一歩として、ぜひ積極的に活用してみてください。