ExcelVBAでセルやセル範囲を操作するときに欠かせないのが「Range型」です。VBAを学び始めた方がよくつまずくのが、「Range型変数をどう宣言するのか」「宣言しないとどうなるのか」という点です。
たとえば「セルA1を参照する」「データ範囲を変数に格納してコピーする」といった操作は、Range型の正しい宣言方法を理解していれば簡単に書けます。しかし理解が曖昧なまま使うと、「Setを忘れてエラーになる」「Variant型に頼ってしまい処理が遅くなる」といったトラブルにつながります。
この記事では「vba range型 宣言」をテーマに、基本的なRange型変数の宣言方法から、プロパティやメソッドと組み合わせた使い方、実務的な応用例までを徹底解説します。
目次
- ✅ Range型変数の基本と宣言方法
- ・Range型とは?
- ・Range型変数にセルを代入する
- ・範囲を代入する
- ✅ 宣言しない場合との違い
- ・Variant型に自動設定される
- ・Option Explicitの利用推奨
- ✅ Range型変数の主な活用方法
- ・セルの値を取得・設定
- ・セル位置を取得
- ・範囲を動的に切り替える
- ・複数範囲をまとめて扱う
- ✅ Range型宣言と他の指定方法の違い
- ・Cellsとの比較
- ・Rows・Columnsとの比較
- ✅ 実務で使えるRange型活用サンプル
- ・最終行まで範囲指定
- ・条件一致セルを強調表示
- ・複数範囲をループ処理
- ・検索結果を変数に格納
- ✅ Range型宣言でよくあるトラブルと対処法
- ・Setを忘れてエラー
- ・Nothingの判定を忘れる
- ・型の不一致
- ✅ Range型を使いこなすメリット
- ■ まとめ:Range型を宣言して安定したコードを書こう
✅ Range型変数の基本と宣言方法
・Range型とは?
Range型はExcelのセルやセル範囲を表すオブジェクト型です。
数値はIntegerやLong、文字列はStringで宣言しますが、セルを保持する場合はRangeを使います。
Dim rng As Range
このように宣言したrngは、Rangeオブジェクト(セルや範囲)を代入できる変数です。
参考:【VBA】変数を使ってセル範囲を指定する方法|柔軟な範囲操作の基本と応用
・Range型変数にセルを代入する
Range型の変数にはSetを使ってセルや範囲を代入します。
Dim rng As Range
Set rng = Range("A1") ' A1セルを参照
MsgBox rng.Value
数値や文字列の代入とは異なり、オブジェクト型は必ずSetを伴うのがポイントです。
・範囲を代入する
複数セルもそのまま代入可能です。
Dim rng As Range
Set rng = Range("A1:B5")
rng.Interior.Color = vbYellow
参考:【VBA】背景色の一覧と設定方法:Interiorオブジェクトの使用方法✅ 宣言しない場合との違い
・Variant型に自動設定される
VBAでは宣言を省略して変数を使うと、自動的にVariant型となります。
Sub NoDeclaration()
x = Range("A1")
MsgBox x
End Sub
この場合でも動作はしますが、Variantはメモリ消費が大きく、実行速度も低下します。
参考:【VBA】変数一覧と確認方法まとめ|型・宣言・一覧出力まで徹底解説
・Option Explicitの利用推奨
モジュール冒頭に Option Explicit を記載すれば、必ず変数宣言が必要になります。
これによりスペルミスや型の不一致を防ぎ、コードの安定性が向上します。
Option Explicit
Sub Sample()
Dim rng As Range
Set rng = Range("A1")
MsgBox rng.Value
End Sub
参考:【VBA】変数に値が代入されない原因と対処法|よくあるミスとデバッグ方法を徹底解説✅ Range型変数の主な活用方法
・セルの値を取得・設定
Dim rng As Range
Set rng = Range("B2")
rng.Value = "テスト"
MsgBox rng.Value
参考:【VBA】変数にセルの値を代入する方法|基本構文から実務活用まで徹底解説・セル位置を取得
MsgBox rng.Address ' → $B$2
MsgBox rng.Row ' → 2
MsgBox rng.Column ' → 2
参考:【VBA】検索してセル位置を取得する方法|Find・InStr・ループを徹底活用・範囲を動的に切り替える
Dim r As Long
Dim rng As Range
r = 10
Set rng = Range("A" & r)
rng.Value = "10行目のセル"
参考:【VBA】Endメソッド:最終行と最終列数・複数範囲をまとめて扱う
Dim rng As Range
Set rng = Range("A1, C1, E1")
rng.Interior.Color = vbGreen
✅ Range型宣言と他の指定方法の違い
・Cellsとの比較
Set rng = Cells(3, 2) ' B3セル
Cellsは行・列番号でセルを指定するのに便利です。
Rangeと組み合わせて柔軟に使い分けましょう。
・Rows・Columnsとの比較
Set rng = Rows(5) ' 5行目全体
Set rng = Columns(3) ' 3列目全体
行や列全体を操作したい場合はこれらの指定が適しています。
✅ 実務で使えるRange型活用サンプル
・最終行まで範囲指定
Sub GetLastRow()
Dim lastRow As Long
Dim rng As Range
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
Set rng = Range("A1:A" & lastRow)
rng.Copy Destination:=Sheets("結果").Range("B1")
End Sub
参考:【VBA】最終行番号を取得する方法・条件一致セルを強調表示
Sub HighlightMatches()
Dim c As Range
For Each c In Range("B2:B100")
If c.Value = "完了" Then
c.Interior.Color = vbYellow
End If
Next c
End Sub
参考:【VBA】条件に一致するセルを複数取得する方法|Find・For Each・SpecialCells・複数範囲をループ処理
Sub LoopRange()
Dim rng As Range, c As Range
Set rng = Range("A1:A10,C1:C10")
For Each c In rng
c.Value = "対象"
Next c
End Sub
・検索結果を変数に格納
Sub FindExample()
Dim f As Range
Set f = Range("A1:A100").Find("重要")
If Not f Is Nothing Then
MsgBox "見つかったセル:" & f.Address
End If
End Sub
参考:【VBA】文字列を検索してセルの位置を取得する方法|Find・InStr・ループを使った実務例✅ Range型宣言でよくあるトラブルと対処法
・Setを忘れてエラー
Dim rng As Range
rng = Range("A1") ' ← エラー
→ 正しくは Set rng = Range("A1")。
参考:【VBA】SetとDimの違いを使い方と一緒にわかりやすく比較
・Nothingの判定を忘れる
検索などで一致がなければNothingになるため、判定処理を入れる。
If rng Is Nothing Then
MsgBox "一致するセルはありません"
End If
・型の不一致
Range型変数に文字列や数値を直接代入しようとするとエラーになります。
→ 必ずセルや範囲をオブジェクトとして代入する。
✅ Range型を使いこなすメリット
- 処理の柔軟性向上:範囲を動的に切り替えられる。
- 可読性アップ:セル指定が明確になり、コードが分かりやすい。
- エラー回避:Option Explicitと併用すればトラブルを未然に防げる。
- 再利用性:一度代入したRange変数を繰り返し処理に活用できる。
■ まとめ:Range型を宣言して安定したコードを書こう
- Range型はセルやセル範囲を表すオブジェクト型。
- 宣言するときは
Dim rng As Rangeと書き、代入時は必ずSetを使う。 Value、Address、Row、Columnなどのプロパティでセル情報を取得できる。- 最終行処理や検索結果の保持など、実務での応用範囲は広い。
- Set忘れやNothing判定不足に注意すれば、安定したコードが書ける。
ExcelVBAでRange型を正しく宣言できるようになれば、セル操作の幅が一気に広がります。実務での効率化にも直結するため、ぜひ本記事を参考にしてRange型を自在に活用してください。