VBA Range型の使い方まとめ|Range・Cells・Setの違いとエラー対策をやさしく解説

VBA Range型の使い方まとめ|Range・Cells・Setの違いとエラー対策をやさしく解説

本記事には広告(PR)が含まれます。
くわしくは プライバシーポリシー をご確認ください。

VBAでマクロを書き始めた頃、「セルを操作したいのに思った通りに動かない」「Rangeってよく見るけど、いまいち違いがわからない」と感じたことはありませんか?

セルを指定する方法にはいくつか種類があり、RangeCells、さらには Range型の変数 など、似たような書き方がいくつも登場します。
最初は少しややこしく感じますが、ポイントを押さえれば難しくありません。

この記事では、「Range型」とは何か、そしてセルを扱う3つの方法の違いと使い分け方を、マクロ初心者にもわかりやすく解説していきます。
後半では、Range型を活用してマクロを効率よく書くテクニックも紹介します。


Range型とは?VBAでの基本的な役割と特徴を理解しよう

Range型とは?セルを扱うための「オブジェクト型」

Excel VBAでは、シート上のセルやセル範囲を操作するために「Range(レンジ)」というオブジェクトが用意されています。
このRangeを使うことで、特定のセルに値を入力したり、背景色を変更したり、データをまとめてコピーしたりと、さまざまな操作が可能になります。

たとえば、次のように書くとA1セルに「こんにちは」と表示されます。

Sub RangeTest1()
Range("A1").Value = "こんにちは"
End Sub
VBAのRange("A1").ValueでA1セルに「こんにちは」と入力した実行結果
図1:Range(“A1”) の実行結果 — コードを実行するとA1セルに「こんにちは」と表示されます。

この Range("A1") の部分が「セルA1」を示す指定方法です。
ここで「Range型」というのは、このRangeオブジェクトを入れるための変数の型のことです。

イメージとしては、「セル(または範囲)」という中身を入れておく箱が Range型の変数 です。
この箱を使うことで、後から別のセルを代入したり、範囲を広げたりといった柔軟な操作ができるようになります。


セルを扱う3つの方法と使い分け

VBAでは、セルを指定して操作する方法がいくつかあります。                   
ここでは、初心者の方がよく目にする3種類を比較してみましょう。

A:文字列+Range指定(初心者向け)

VBAのRangeに文字列アドレスを渡してA2セルへ1を入力した実行結果
図2:文字列+Range指定の実行結果 — Range(MyCell).Value = 1 により A2セルに「1」が入力されています。
Sub RangeTest2()
Dim MyCell As String
MyCell = "A2"
Range(MyCell).Value = 1
End Sub

特徴:
セル番地を文字列で指定できるため、初心者でも理解しやすい方法です。
ただし変数は String型 のため、セル操作には毎回 Range() が必要です。

向いている場面:
・最初の練習段階
・特定のセルを操作する簡単なマクロ

B:Cells(行, 列) 指定(繰り返し処理向き)

VBAのCells(行,列)指定でA2セルへ1を入力した実行結果
図3:Cells指定の実行結果 — Cells(MyRow, 1).Value = 1 により 行番号・列番号で位置を指定してA2に入力しています。
Sub CellsTest1()
Dim MyRow As Long
MyRow = 2
Cells(MyRow, 1).Value = 1
End Sub

特徴:
行番号・列番号で指定できるため、For文などの繰り返し処理に便利です。
列が数値指定のため、動的に範囲を変える処理に向いています。

向いている場面:
・ループ処理を使うとき
・データ量が可変の表を扱うとき

C:Range型の変数を使う(実務向き)

VBAでRange型変数にSetでA2を代入し値を書き込んだ実行結果
図4:Range型変数の実行結果 — Set MyRange = Range(“A2”) のあと MyRange.Value = 1 でA2に書き込み。
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 を付けます。
これを忘れると、次のようなエラーが出ます。

オブジェクト変数または With ブロック変数が設定されていません。
VBAの実行時エラー91「オブジェクト変数またはWithブロック変数が設定されていません」のダイアログ
図5:Setを付け忘れたときの代表的なエラー — 実行時エラー‘91’「オブジェクト変数またはWithブロック変数が設定されていません。」

このエラーは、初心者が最初につまずきやすいポイントです。
Set が必要な理由を理解すれば、VBAの「オブジェクト型」の考え方がぐっとわかりやすくなりますよ。


RangeとCellsの違いと使い分け

もう少し詳しく見ると、RangeCells には以下のような違いがあります。

比較項目 Range Cells
指定方法 Range("A2") のように文字で指定 Cells(2,1) のように行・列番号で指定
わかりやすさ 見た目に直感的(「A2」がそのまま使える) 数字で指定するので慣れが必要
柔軟性 固定範囲に向く ループ処理などで動的に範囲を指定できる

たとえば、次のような記述はどちらも同じ意味になります。

Range("A2").Value = "Hello"
Cells(2, 1).Value = "Hello"

どちらも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列の最終行までを自動で取得して処理したい場合は次のように書けます。

Sub Cells活用例()
Dim lastRow As Long
Dim rng As Range' 最終行を取得
lastRow = Cells(Rows.Count, 1).End(xlUp).Row' A1~最終行までを範囲として指定
Set rng = Range("A1:A" & lastRow)' 範囲全体を黄色に塗る
rng.Interior.Color = vbYellow
End Sub
VBAでA列の最終行までを自動取得して黄色に塗るCells活用例の実行結果
図6:CellsとRangeを組み合わせた活用例 — A列の最終行まで自動で取得し、範囲全体を黄色で塗りつぶしています。

このように "A1:A" & lastRow のように文字列をつなげることで、
データの増減に合わせて範囲を自動で広げることができます。

ポイント
RangeCells を組み合わせると、より柔軟に指定できます。
Set rng = Range(Cells(1, 1), Cells(lastRow, 1))

この書き方は「A1セル~A列の最終行」を範囲として指定していることになります。


Range型を利用してセル操作をまとめて実行する

Range型を使うと、複数のセルをまとめて扱えるのが大きな魅力です。
たとえば以下のように、一度に値を入れたり、書式を変更したりできます。

Sub Range型活用例1()
Dim rng As Range
Set rng = Range("A1:C3")' 値を一括で入力
rng.Value = "〇"' 背景色を変更
rng.Interior.Color = RGB(255, 230, 200)' 文字を太字に
rng.Font.Bold = True
End Sub
VBAでRange("A1:C3")を指定して複数セルに○を入力し背景を変更した実行結果
図7:Range型の活用例 — A1:C3の範囲をまとめて操作し、○を入力・背景色を変更・文字を太字にしています。

このように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型の変数なんですよ。

VBAのFor Each構文でRange("A1:C3")内の空白セルに「(空白)」を自動入力した実行結果
図8:For Each構文を使ったRange型の活用例 — 指定範囲内の空白セルに自動で「(空白)」と入力しています。
cell も Range型の変数として1つずつセルを処理しています。

配列とRange型の組み合わせで処理を高速化(応用)

少し上級になりますが、Range型は配列と組み合わせることで、大量のデータを高速に処理できます。

Sub Range型活用例3配列との連携()
 Dim arr As Variant
 Dim rng As RangeSet rng = Range("A1:A1000")' Rangeから配列へ読み込み
 arr = rng.Value' 配列内のデータを処理
 Dim i As Long
 For i = 1 To UBound(arr)
  arr(i, 1) = arr(i, 1) & "★"
 Next i

 ' 配列を一括でシートに戻す
 rng.Value = arr
End Sub
VBAでRange("A1:A1000")を配列に読み込み各値に★を追加し一括で書き戻した実行結果
図9:Range型と配列を組み合わせた高速処理の例 — A1:A1000のデータを配列に読み込み、「★」を追加して一括で書き戻しています。

この方法では、1,000回セルを読み書きする代わりに、
1回の読み込み・1回の書き込みで完結するため、処理が格段に速くなります。

初心者の段階では無理に使わなくても大丈夫ですが、
「Range型は配列とも相性がいい」と覚えておくと、後で必ず役立ちます。


初心者がつまずきやすいRange型のエラーと対処法

Range型を使い始めると、次のようなエラーに出会うことがあります。

 オブジェクト変数またはWithブロック変数が設定されていません

原因:Set を付け忘れている

Dim rng As Range
rng = Range("A1") ' ← ここでエラー

対処法:オブジェクト型には必ず Set を付ける

Dim rng As Range
Set rng = Range("A1")

 シート指定の抜けによる「対象が見つからない」エラー

原因:アクティブシート以外を操作しようとしている

Set rng = Range("A1") ' ← 他のシートを操作中だと誤動作

対処法:シート名を明示して指定する

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型を使うと複数セルをまとめて操作できる

  • RangeCells を組み合わせると範囲を柔軟に指定できる

  • 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バシーポリシー へ。