本記事には広告(PR)が含まれます。
くわしくは プライバシーポリシー をご確認ください。
VBAでマクロを書き始めた頃、「セルを操作したいのに思った通りに動かない」「Rangeってよく見るけど、いまいち違いがわからない」と感じたことはありませんか?
セルを指定する方法にはいくつか種類があり、Range や Cells、さらには Range型の変数 など、似たような書き方がいくつも登場します。
最初は少しややこしく感じますが、ポイントを押さえれば難しくありません。
この記事では、「Range型」とは何か、そしてセルを扱う3つの方法の違いと使い分け方を、マクロ初心者にもわかりやすく解説していきます。
後半では、Range型を活用してマクロを効率よく書くテクニックも紹介します。
Range型とは?VBAでの基本的な役割と特徴を理解しよう
Range型とは?セルを扱うための「オブジェクト型」
Excel VBAでは、シート上のセルやセル範囲を操作するために「Range(レンジ)」というオブジェクトが用意されています。
このRangeを使うことで、特定のセルに値を入力したり、背景色を変更したり、データをまとめてコピーしたりと、さまざまな操作が可能になります。
たとえば、次のように書くとA1セルに「こんにちは」と表示されます。
Sub RangeTest1()
Range("A1").Value = "こんにちは"
End Sub

この Range("A1") の部分が「セルA1」を示す指定方法です。
ここで「Range型」というのは、このRangeオブジェクトを入れるための変数の型のことです。
イメージとしては、「セル(または範囲)」という中身を入れておく箱が Range型の変数 です。
この箱を使うことで、後から別のセルを代入したり、範囲を広げたりといった柔軟な操作ができるようになります。
セルを扱う3つの方法と使い分け
VBAでは、セルを指定して操作する方法がいくつかあります。
ここでは、初心者の方がよく目にする3種類を比較してみましょう。
A:文字列+Range指定(初心者向け)

Sub RangeTest2()
Dim MyCell As String
MyCell = "A2"
Range(MyCell).Value = 1
End Sub
特徴:
セル番地を文字列で指定できるため、初心者でも理解しやすい方法です。
ただし変数は String型 のため、セル操作には毎回 Range() が必要です。
向いている場面:
・最初の練習段階
・特定のセルを操作する簡単なマクロ
B:Cells(行, 列) 指定(繰り返し処理向き)

Sub CellsTest1()
Dim MyRow As Long
MyRow = 2
Cells(MyRow, 1).Value = 1
End Sub
特徴:
行番号・列番号で指定できるため、For文などの繰り返し処理に便利です。
列が数値指定のため、動的に範囲を変える処理に向いています。
向いている場面:
・ループ処理を使うとき
・データ量が可変の表を扱うとき
C:Range型の変数を使う(実務向き)

Sub RangeTest3()
Dim MyRange As Range
Set MyRange = Range("A2")
MyRange.Value = 1
End Sub
特徴:
Range型 にセル範囲を直接代入でき、以降の操作が簡単になります。
Set が必要(オブジェクト型のため)で、.Value や .Interior.Color などの操作をまとめて行えます。
向いている場面:
・複数セルをまとめて扱いたいとき
・コードを整理して読みやすくしたいとき
使い分けのコツ:
-
A(Range+文字列) は最初の練習にぴったり。
-
B(Cells指定) は繰り返しや動的な範囲操作に強い。
-
C(Range型変数) は本格的なマクロでの定番スタイル。
Range型変数を宣言する方法と基本構文
Range型の変数を使うときは、次のように宣言します。
Sub RangeTest3()
Dim rng As Range
Set rng = Range("A2")
rng.Value = "OK"
End Sub
ここでポイントとなるのが Set です。
Rangeは「オブジェクト型」なので、変数に代入するときは必ず Set を付けます。
これを忘れると、次のようなエラーが出ます。
このエラーは、初心者が最初につまずきやすいポイントです。Set が必要な理由を理解すれば、VBAの「オブジェクト型」の考え方がぐっとわかりやすくなりますよ。
RangeとCellsの違いと使い分け
もう少し詳しく見ると、Range と Cells には以下のような違いがあります。
| 比較項目 | Range | Cells |
|---|---|---|
| 指定方法 | Range("A2") のように文字で指定 |
Cells(2,1) のように行・列番号で指定 |
| わかりやすさ | 見た目に直感的(「A2」がそのまま使える) | 数字で指定するので慣れが必要 |
| 柔軟性 | 固定範囲に向く | ループ処理などで動的に範囲を指定できる |
たとえば、次のような記述はどちらも同じ意味になります。
どちらもA1セルを指定していますが、ループで使うなら Cells が便利です。
逆に固定セルを扱うなら Range("A2") の方が読みやすいですね。
RangeとCellsで「指定の順番」が違うことに注意!
ここまでで「RangeとCellsは似ているようで違う」ということがわかりましたが、
初心者の方がよく混乱するのが、指定する順番の違いです。
| 関数 | 指定の順番 | 記述例 | 意味 |
|---|---|---|---|
| Range | 列 → 行(文字で指定) | Range("A2") |
A列の2行目 |
| Cells | 行 → 列(数値で指定) | Cells(2,1) |
2行目のA列 |
たとえばどちらも「A2セル」を指していますが、
Rangeは「列が先」・Cellsは「行が先」 という順序の違いがあります。
このルールを意識しておくと、
「思っていたセルと違う場所に書き込まれた!」というミスを防げます。
覚え方のコツ:
「Range」は“表を見たまま”のイメージで、「A2」のように列→行の順番で指定します。
「Cells」は“数で座標を指定する”イメージで、行→列の順番で指定します。
つまり、「Rangeは見た目どおり」「Cellsは座標どおり」と覚えると混乱しにくいです。
ここまでのまとめ
-
Range型は、セルや範囲を変数として扱うための型。
-
セル指定の方法は主に3つ(Range文字列/Cells指定/Range型変数)。
-
実務マクロでは、
Setを使ってRange型変数を扱うのが定番。
次の章では、いよいよ「Range型を使いこなす実践テクニック」に入ります。
範囲を動的に指定したり、複数セルをまとめて操作したりと、
少し応用的な使い方を紹介していきます。
Range型を使いこなす実践テクニックとよくある注意点
変数を使ってセル範囲を動的に指定する
マクロを実務で使うようになると、「毎回A1:A10ではなく、データの最終行まで自動で範囲を指定したい」と思うことが増えてきます。
そんなときに便利なのが、「変数を使ってRangeの範囲を動的に設定する方法」です。
たとえば、A列の最終行までを自動で取得して処理したい場合は次のように書けます。

このように "A1:A" & lastRow のように文字列をつなげることで、
データの増減に合わせて範囲を自動で広げることができます。
Range と Cells を組み合わせると、より柔軟に指定できます。この書き方は「A1セル~A列の最終行」を範囲として指定していることになります。
Range型を利用してセル操作をまとめて実行する
Range型を使うと、複数のセルをまとめて扱えるのが大きな魅力です。
たとえば以下のように、一度に値を入れたり、書式を変更したりできます。

このようにRange型変数を使うと、
複数のセルに対して同じ処理を繰り返すコードを、
1行でまとめて書くことができます。
また、セルを1つずつ処理したいときには、For Each 構文が便利です。
Sub Range型活用例2()
Dim rng As Range
Dim cell As Range
Set rng = Worksheets("Sheet1").Range("A1:C3") '← 必ずSetする
For Each cell In rng
If Len(cell.Value) = 0 Then
cell.Value = "(空白)"
End If
Next cell
End Sub
上記のように書けば、指定範囲内の空白セルを自動的に埋めることもできます。For Each で使う cell も、実はRange型の変数なんですよ。

cell も Range型の変数として1つずつセルを処理しています。
配列とRange型の組み合わせで処理を高速化(応用)
少し上級になりますが、Range型は配列と組み合わせることで、大量のデータを高速に処理できます。

この方法では、1,000回セルを読み書きする代わりに、
1回の読み込み・1回の書き込みで完結するため、処理が格段に速くなります。
初心者の段階では無理に使わなくても大丈夫ですが、
「Range型は配列とも相性がいい」と覚えておくと、後で必ず役立ちます。
初心者がつまずきやすいRange型のエラーと対処法
Range型を使い始めると、次のようなエラーに出会うことがあります。
オブジェクト変数またはWithブロック変数が設定されていません

原因:Set を付け忘れている
対処法:オブジェクト型には必ず Set を付ける
シート指定の抜けによる「対象が見つからない」エラー
原因:アクティブシート以外を操作しようとしている
対処法:シート名を明示して指定する
Set rng = Worksheets("Sheet1").Range("A1")
変数の初期化忘れ
原因:範囲を設定しないまま使っている
Dim rng As Range
rng.Value = "テスト" ' ← まだ何も代入していない!
対処法:先に Set で範囲を設定してから操作する
Dim rng As Range
Set rng = Range("A1")
rng.Value = "テスト" ' セル"A1"に"テスト"と入力
このようなエラーは「Range型=オブジェクト」という意識を持つことで防げます。
慣れるまでは、**「Rangeを変数に入れるときはSetを忘れずに」**を合言葉にしましょう。
まとめ
Range型は、Excel VBAでセルや範囲を自在に扱うための基本的な型です。
最初は Set の扱いやエラーで戸惑うこともありますが、
一度仕組みを理解してしまえば、コードの見通しが一気によくなります。
-
Range型を使うと複数セルをまとめて操作できる
-
RangeとCellsを組み合わせると範囲を柔軟に指定できる -
Setを忘れずに!
少しずつ使いながら慣れていくと、「マクロの記録」だけではできなかった
自由なセル操作や自動化が、どんどん身につきますよ。
Range型を理解すればマクロの自由度が一気に上がる!
Range型は、Excel VBAでセルや範囲を自在に扱うための基本かつ最重要の型です。
最初は「Setを付け忘れてエラーになる」「Cellsとの違いがわかりにくい」と感じるかもしれませんが、
1つずつ理解すれば確実にステップアップできます。
この記事で紹介したポイントをもう一度整理してみましょう
この記事のまとめ
-
Range型とは?
→ セルや範囲を入れて操作できる「オブジェクト型」の変数。 -
セルの扱い方は3種類!
→ ① Range+文字列(初心者向け)
② Cells(行,列)指定(ループ処理向け)
③ Range型変数(実務・応用向け) -
Range型の強み
→ 一度範囲を変数に代入すれば、.Valueや.Fontなどのプロパティを何度でも使える。
→ 複数セルをまとめて操作でき、コードがすっきり整理される。 -
エラー防止のコツ
→Setを忘れない!
→ シート名を明示して指定する!
Range型を使いこなせるようになると、
マクロの記録では難しかった 柔軟な範囲操作や効率的な自動処理 が書けるようになります。
「マクロで表をまとめて書式変更したい」「行数が変わるデータを自動処理したい」
そんなときこそ、今回学んだRange型が大活躍します。
Range型は「マクロの世界でセルを動かす手」とも言えます。
少しずつコードを書いていくうちに、「あ、Rangeをこう使えばいいのか!」と感覚的にわかってきます。
焦らず、自分のペースで練習してみてくださいね
関連記事
Excelマクロをもっと理解したい方には、次の記事もおすすめです
※外部リンク※
※参考書籍 (PR)※
※本ボックスにはアフィリエイトリンク(PR)が含まれます。
くわしくは プあmバシーポリシー へ。
