VBAテクニック集 VBA一覧 ブラウザ・外部連携 ブラウザ操作

【VBA】Range(Cells)の組み合わせ|柔軟な範囲指定で業務効率化を実現する方法

ExcelVBAを使ってセルや範囲を操作するとき、最もよく使うのがRangeですが、固定的な「Range("A1:B5")」だけでは実務で十分とはいえません。行数や列数が可変のデータを扱う場面では、より柔軟な範囲指定が求められます。

そこで活躍するのが RangeCellsの組み合わせ です。これを使えば「開始位置と終了位置を変数で動的に指定する」「データ量に応じて範囲を拡張する」といった高度な処理が可能になります。

この記事では「vba 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までを変数で指定。データ量が変化しても対応可能。

参考:【VBA】範囲指定を最終行まで:指定する方法


✅ 実務で使える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列の最終行までを選択。

参考:【VBA】最終行:取得できない


・変数で範囲を切り替える

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

表全体に罫線を自動で引く。

参考:【VBA】Endメソッド:最終行と最終列数


✅ Range(Cells)とOffset・Resizeの組み合わせ

・Offsetで相対範囲を指定

Range(Cells(2, 2), Cells(5, 4)).Offset(1, 1).Select

指定範囲から1行下・1列右にシフトした範囲を選択。

参考:【VBA】範囲指定の使い方:Offsetプロパティ


・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)利用時の注意点

  1. Setの使い忘れ
    Range型変数に代入するときは必ずSetを使用。
    参考:【VBA】SetとDimの違いを使い方と一緒にわかりやすく比較
  2. ワークシートの明示指定
    複数シートを扱う場合は、必ずシートを明示しないと誤動作の原因になる。
    参考:【VBA】ワークシートクラスのActivateメソッドが失敗しました:原因・対策

    Worksheets("データ").Range(Cells(2, 1), Cells(10, 3))
    

    → 実際には Cells も同じシートに属させる必要あり。

    Worksheets("データ").Range(Worksheets("データ").Cells(2, 1), Worksheets("データ").Cells(10, 3))
    
  3. 範囲外エラー
    データが存在しない場合、End(xlUp)End(xlToLeft)が予期せぬセルを返すことがある。

✅ RangeとCellsの組み合わせを使いこなすメリット

  • データ量に応じて範囲を動的に指定できる。
  • コードの汎用性が高まり、再利用しやすい。
  • 表全体や条件一致範囲を自動的に扱えるため、業務効率化に直結。
  • OffsetやResizeと併用することで、さらに柔軟な範囲操作が可能。

■ まとめ:RangeとCellsの組み合わせで柔軟な範囲指定を実現しよう

  • RangeとCellsを組み合わせると、開始セルと終了セルを動的に指定できる。
  • 最終行・最終列の自動取得や表全体の操作に不可欠。
  • Offset・Resizeと併用すれば、相対的かつ柔軟な範囲操作が可能。
  • 実務では「条件一致行の抽出」「検索結果の処理」「表全体への罫線設定」など幅広い場面で活躍。
  • ワークシートの明示や範囲外エラーへの対策を忘れずに行う。

ExcelVBAでRangeとCellsを組み合わせた範囲指定をマスターすれば、どんな規模のデータでも効率的に扱えるようになります。実務効率化の第一歩として、ぜひ積極的に活用してみてください。

    -VBAテクニック集, VBA一覧, ブラウザ・外部連携, ブラウザ操作