VBAで自動化 VBA一覧 セル・値の取得と貼り付け 取得

【VBA】変数を使ってセル範囲を指定する方法|柔軟な範囲操作の基本と応用

Excel VBAを使って作業を自動化していく中で、セルの範囲を指定する処理は非常に頻繁に登場します。しかし、固定値での範囲指定では対応できない場面も多く、柔軟な対応をするためには変数を使った範囲指定が欠かせません。この記事では、セル範囲を変数で扱う基本的な方法から、動的に行数や列数を変える実用的な応用例まで、VBA初心者にもわかりやすく解説します。VBAによる自動化の幅を広げたい方や、繰り返し処理の精度を高めたい方に特におすすめの内容です。


セル範囲の指定に変数を使う意味

Excel VBAでは、セルを直接"Range("A1:B3")"のように記述することで範囲を指定できますが、これでは範囲が固定されてしまい、シート構成やデータ量の変化に対応できません。

たとえば、次のような課題に直面することがあります。

  • データ件数が毎日変わるため、最終行までの範囲を処理したい

  • 位置がずれる可能性があるため、セルの位置を数値で指定したい

  • ループ処理の中で、セルの位置を都度更新したい

こうした場面で、変数を使って範囲を指定することで、より柔軟で再利用可能なマクロが書けるようになります。

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


基本:変数でセル番地を文字列として指定する

まずは、最も基本的な方法です。セルの番地を文字列で組み立て、それをRangeオブジェクトに渡します。

Sub Sample1()
    Dim startCell As String
    Dim endCell As String

    startCell = "A1"
    endCell = "C10"

    Range(startCell & ":" & endCell).Select
End Sub

このコードでは、セル番地を変数に代入し、文字列の結合で範囲を指定しています。単純なケースではこの方法が最も直感的です。


行番号や列番号を数値で扱いたい場合

行や列を変数で操作する場合、Cells(row, column)を使うと便利です。

Sub Sample2()
    Dim startRow As Long, endRow As Long
    Dim startCol As Long, endCol As Long

    startRow = 2
    endRow = 20
    startCol = 1 ' A列
    endCol = 3 ' C列

    Range(Cells(startRow, startCol), Cells(endRow, endCol)).Select
End Sub

この方法では、セル位置を数値で制御できるため、ループ処理や最終行取得と組み合わせやすくなります。


応用:最終行を変数で取得して範囲指定

実務では、データの終了位置が不定であることが多いため、最終行を取得して範囲に変数で反映する例はよく使われます。

【VBA】最終行番号を取得する方法

Sub Sample3()
    Dim lastRow As Long

    ' A列の最終行を取得
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    Range("A1:B" & lastRow).Select
End Sub

ここでは、A列の最終行を変数lastRowに格納し、その変数を範囲指定に使用しています。これで、データ量が変動しても常に正しい範囲が取得できます。


応用:ループ処理で変数を使ったセル指定

ループで1行ずつ処理する際にも、変数を使った範囲指定は役立ちます。

Sub Sample4()
    Dim i As Long
    Dim lastRow As Long

    lastRow = Cells(Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow
        ' A列とB列の値を足してC列に出力
        Cells(i, 3).Value = Cells(i, 1).Value + Cells(i, 2).Value
    Next i
End Sub

このように、行を表す変数iを使ってセルを指定すれば、行数の変動に強い処理が可能になります。

【VBA】セルの値を変数に格納:ループ処理


列の位置を変数にする:列名ではなく列番号で指定

列を動的に指定したい場合、列番号を変数で扱い、CellsRangeで使用します。

Sub Sample5()
    Dim colStart As Long
    colStart = 2 ' B列

    Range(Cells(1, colStart), Cells(10, colStart + 2)).Interior.Color = RGB(200, 200, 255)
End Sub

上記の例では、B列からD列の1~10行を塗りつぶす処理を行っています。列の位置を変えるだけで処理対象が変わるので、メンテナンス性が高まります。


範囲をRangeオブジェクトとして変数に代入

セル範囲そのものをRangeオブジェクトとして変数に代入し、後から使い回すことも可能です。

Sub Sample6()
    Dim rng As Range
    Set rng = Range("A1:B10")

    rng.Font.Bold = True
    rng.Interior.Color = RGB(255, 255, 200)
End Sub

さらに応用して、以下のようにCellsを使って動的に範囲を設定することも可能です。

Sub Sample7()
    Dim rng As Range
    Dim startRow As Long, endRow As Long

    startRow = 2
    endRow = Cells(Rows.Count, 1).End(xlUp).Row

    Set rng = Range(Cells(startRow, 1), Cells(endRow, 3))

    rng.Borders.LineStyle = xlContinuous
End Sub

変数でシートを切り替える方法と組み合わせる

変数でシートを指定することで、複数のシートに対して柔軟な処理が可能になります。

Sub Sample8()
    Dim ws As Worksheet
    Dim rng As Range

    Set ws = Worksheets("売上データ")
    Set rng = ws.Range("A1:D10")

    rng.Font.Color = RGB(0, 0, 255)
End Sub

このように、ワークシートとセル範囲の両方を変数で操作することで、再利用性の高いマクロを作成できます。


まとめ:変数を使ったセル範囲指定でVBAをもっと柔軟に

変数を活用したセル範囲の指定は、VBAマクロの柔軟性を大きく向上させます。特に以下のような状況で非常に有効です。

  • データ量や位置が日々変わる場合

  • 汎用的なマクロを作成したい場合

  • メンテナンス性を意識したスクリプトが必要な場合

今回紹介したRange("A1:B10")形式、Cells(row, col)形式、Range(Cells(), Cells())形式、そしてRangeオブジェクトへの代入といった方法を理解すれば、より複雑で実用的な処理にも対応できます。マクロ作成の幅を広げたい方は、ぜひ実際に手を動かして試してみてください。

-VBAで自動化, VBA一覧, セル・値の取得と貼り付け, 取得