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

【VBA】セル範囲を変数に代入する方法|Rangeと配列の違い

Excel VBAでデータ処理をしていると、「セル範囲を変数に入れて扱いたい」と思う場面は非常に多くあります。

例えば、

  • 一覧表をまとめて取得したい
  • 取得した範囲を繰り返し使いたい
  • 別シートへ転記したい
  • 大量データを高速処理したい

といったケースです。

ただし、VBAでは「セル範囲そのもの」を変数に入れる方法と、「セル範囲の値」を変数に入れる方法があります。
この違いを理解していないと、エラーや処理速度低下の原因になります。

この記事では、VBAでセル範囲を変数に代入する基本から、Range型と配列の違い、実務で使いやすい設計まで解説します。

✅ VBAでセル範囲を変数に代入する基本

セル範囲を変数に代入すると、コードの可読性や保守性を高めやすくなります。
特に実務では、同じセル範囲を何度も直接書くより、変数化した方が修正しやすくなります。
また、Range型なのか値なのかを意識せずに書くと、「Setが必要です」などのエラーが発生しやすいです。
ここを最初に整理しておくと、後から複雑なマクロを書くときにも理解しやすくなります。
さらに、ActiveSheet依存を避けることで、別シート誤操作の防止にもつながります。
まずは、セル範囲そのものを変数へ代入する基本から確認しましょう。

・Range型の変数へセル範囲を代入する

Sub AssignRangeToVariable()

    Dim targetWorksheet As Worksheet
    Dim targetRange As Range

    Set targetWorksheet = ThisWorkbook.Worksheets("Sheet1")

    ' セル範囲そのものを変数へ代入
    Set targetRange = targetWorksheet.Range("A1:C10")

    targetRange.Interior.Color = RGB(221, 235, 247)

End Sub

このコードでは、A1:C10 のセル範囲そのものを targetRange に代入しています。

・なぜSetを使うのか

Rangeは「オブジェクト」なので、代入時に Set が必要です。

Set targetRange = targetWorksheet.Range("A1:C10")

一方で、セルの値を変数へ入れる場合は Set を使いません。

cellValue = targetWorksheet.Range("A1").Value

この違いは非常に重要です。

Range変数を扱うときに最も混乱しやすいのが、「なぜSetが必要なのか」という部分です。
特にVBAでは、通常の値変数とオブジェクト変数で代入方法が異なるため、理解が曖昧なままコードを書くとエラーや誤動作につながりやすくなります。

実務では、Range・Worksheet・Workbookなどのオブジェクト操作が非常に多いため、「Setをどの場面で使うのか」を整理して理解しておくことが重要です。

【VBA】Setのわかりやすい活用方法と活用場面|オブジェクト変数を正しく扱う実務設計


✅ VBAでセル範囲の値を変数に代入する方法

実務では、セル範囲そのものより、「セル範囲の値」をまとめて取得したいケースも多くあります。
特に一覧表データをループ処理する場合、セルを1つずつ読むより、配列へ一括取得した方が高速です。
大量データを扱うマクロでは、この考え方が処理速度に大きく影響します。
また、シートアクセス回数を減らせるため、実務では非常によく使われます。
ただし、取得後は2次元配列として扱われるため、セル番地感覚とは少し違う点に注意が必要です。
ここでは、値をまとめて変数へ取得する方法を確認します。

・セル範囲の値をVariant型へ入れる

Sub AssignRangeValuesToVariable()

    Dim targetWorksheet As Worksheet
    Dim rangeValues As Variant

    Set targetWorksheet = ThisWorkbook.Worksheets("Sheet1")

    ' セル範囲の値をまとめて取得
    rangeValues = targetWorksheet.Range("A1:C10").Value

    MsgBox rangeValues(1, 1)

End Sub

複数セルを取得すると、rangeValues は2次元配列として扱われます。

・配列として扱うイメージ

配列指定対応セル
rangeValues(1,1)A1
rangeValues(1,2)B1
rangeValues(2,1)A2

・なぜ配列化すると高速なのか

セルを1つずつ読むと、Excelシートへ何度もアクセスします。

一方で、

rangeValues = Range("A1:C10000").Value

のように一括取得すると、シートアクセスを減らせるため、大量データでも高速化しやすくなります。

大量データを扱うVBAでは、「セルを1つずつ読む」のか、「先に配列へまとめて取得する」のかで、処理速度が大きく変わることがあります。
特に数千〜数万行のデータを扱う実務では、シートアクセス回数を減らす設計が非常に重要です。
また、単純に高速化するだけでなく、「後から条件追加しやすいコード構成」にすることで、保守性も大きく向上します。
セル範囲を配列へ格納する実践的な考え方や、実務向けの高速化設計を詳しく確認したい方は、こちらの記事も参考にしてみてください。

【VBA】範囲指定のセルの値を配列に格納する方法|処理速度と保守性を両立する実務設計


✅ Range型と配列を使い分ける考え方

VBAでは、「セル範囲を操作したい」のか、「値だけを処理したい」のかで使い分けることが重要です。
この判断を曖昧にすると、処理速度や保守性が悪化しやすくなります。
例えば、書式変更ならRange型が必要ですが、売上集計なら配列の方が効率的です。
また、Range型は視覚操作に強く、配列は大量データ処理に強い特徴があります。
実務では両方を組み合わせるケースが非常に多いです。
ここでは代表的な使い分けを整理します。

・Range型が向いているケース

  • 色変更
  • コピー
  • 書式設定
  • 行列操作
  • セル位置管理
Set targetRange = Worksheets("Sheet1").Range("A1:C10")
targetRange.Font.Bold = True

・配列が向いているケース

  • 条件判定
  • 空白チェック
  • 集計
  • データ転記
  • 大量ループ
dataValues = Worksheets("Sheet1").Range("A2:C100").Value

・実務では両方を組み合わせる

実務では、

  1. Rangeで範囲を取得
  2. 値を配列へ入れる
  3. 配列内で処理
  4. シートへ戻す

という流れが非常に多いです。


✅ 最終行までの範囲を変数に代入する方法

実務では、固定範囲ではなく「データ件数が変わる表」を扱うケースがほとんどです。
そのため、最終行を取得して動的に範囲を決める設計が重要になります。
固定範囲のままだと、データ追加時に取得漏れが発生しやすいです。
また、不要な空白行まで処理すると、速度低下の原因にもなります。
最終行取得を組み合わせることで、データ増減に強いマクロになります。
ここでは、最終行を取得してRange変数へ代入する方法を確認します。

・最終行までをRange変数へ入れる

Sub AssignDynamicRange()

    Dim targetWorksheet As Worksheet
    Dim lastRow As Long
    Dim dataRange As Range

    Set targetWorksheet = ThisWorkbook.Worksheets("Sheet1")

    lastRow = targetWorksheet.Cells(targetWorksheet.Rows.Count, "A").End(xlUp).Row

    Set dataRange = targetWorksheet.Range("A1:C" & lastRow)

    MsgBox dataRange.Address(False, False)

End Sub

・空データ対策も重要

If lastRow < 2 Then
    MsgBox "データがありません。"
    Exit Sub
End If

実務では、このような安全対策を入れておくとエラー防止につながります。

最終行取得は便利ですが、実務では「途中に空白行が混ざるデータ」を扱うケースも非常に多くあります。
そのため、単純に最終行までループするだけでは、不要な空白行まで処理してしまったり、逆に途中でデータ判定を誤ることがあります。

特にCSV取込データや、手入力が混在する管理表では、「どの条件でループを止めるか」を最初に整理しておくことが、安全なVBA設計につながります。

空白行を考慮したFor文の実務的な設計方法や、途中終了を安全に扱う考え方を詳しく確認したい方は、こちらの記事も参考にしてみてください。

【VBA】For文で空白行まで繰り返す方法|安全な実務設計


✅ セル範囲を変数に代入するときの注意点

セル範囲を変数化する処理は便利ですが、いくつか注意点があります。
特に初心者は、Setの付け忘れや、シート指定省略でトラブルになりやすいです。
また、ActiveSheet依存は実務では非常に危険です。
「自分の環境では動く」のに、他の人の環境では誤動作する原因になります。
さらに、固定範囲指定はデータ件数変化に弱いため注意が必要です。
ここでは最低限押さえておきたい注意点を整理します。

・Range型にはSetが必要

Set dataRange = Worksheets("Sheet1").Range("A1:C10")

・値取得にはSet不要

dataValues = Worksheets("Sheet1").Range("A1:C10").Value

・シート指定を省略しない

NG例:

Set dataRange = Range("A1:C10")

推奨:

Set dataRange = ThisWorkbook.Worksheets("Sheet1").Range("A1:C10")

✅ まとめ:セル範囲の変数化でVBAを保守しやすくしよう

VBAでセル範囲を変数へ代入できるようになると、コードの見通しや保守性が大きく向上します。

  • Range型はセル範囲そのものを扱う
  • 値取得はVariant型へ入れる
  • Range型には Set が必要
  • 配列化すると大量データを高速処理しやすい
  • 最終行取得でデータ増減に対応できる
  • ActiveSheet依存を避ける
  • Range型と配列を目的別に使い分ける

セル範囲の変数化は、VBA自動化の基礎であり、実務でも非常に重要な考え方です。

短く書くことよりも、「後から読める・修正できるコード」を意識しながら、保守しやすいVBAを書いていきましょう。

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