セル範囲を配列に一括代入する

配列にセルの入力内容を一括で代入させるコード

'セルデータの一括取得
Dim セルデータ As Variant
セルデータ = Range("A1:C3")

Excel VBAでセル範囲を配列に一括代入する方法を紹介します。
セルを1つずつループして読み込むよりも高速に処理できるため、大量データの集計や検索に役立ちます。
この記事では、Range.Valueを使った基本的な方法と注意点を解説します。

Variant型の変数にRangeオブジェクトを代入すると、そのセル範囲のデータが2次元配列として一括で格納されます

このとき「Rangeオブジェクトそのもの」が代入されるように感じるかもしれません。
しかし、実際にはLetステートメントが省略されており、省略しない場合は次のように記述します。

Let セルデータ = Range("A1:C3")

このLetステートメントは「値の代入」として認識されるため、セル範囲を指定してもRangeオブジェクトそのものが代入されることはありません。

Rangeオブジェクトを代入する場合には、Setステートメントを使用します。

話を戻すと、このように一括代入を行うことで、セル範囲のデータが2次元配列としてそのまま格納されます。

取得するセル範囲のデータ
取得をおこなうセル範囲

この表のセル範囲のデータを一括で配列に代入します。

取得した配列データ
代入された2次元配列のデータ

こちらは、実際に2次元配列として取得されたデータです。

この配列をそのまま他のセル範囲へ一括出力することも可能です。
ただし、その場合はCopyメソッドを使った方が分かりやすいため、あまり意味はありませんが実現できます。

ここで取得したデータを加工しながら別の2次元配列に格納し、最終的にその加工済み配列をセル範囲へ一括出力することもできます。

この方法を用いることで、セル上で直接加工を行わない分、処理の高速化が図れ、元のセルデータを改変してしまう心配もありません。

なお、この方法で配列へ代入すると、1列や1行のみの範囲指定であっても必ず2次元配列になります。
これはワークシートの仕様が2次元であるためです。もし1次元配列として扱いたい場合は、以下の記事をご参照ください。

VBA配列の注意点:添字と型の扱い

  • 配列の添字は必ず1から始まる
  • セル範囲を代入すると必ず2次元配列になる
  • Variant型でしか代入できない

通常の配列は0から始まりますが、セル範囲を配列に一括代入すると1から始まります。
例えば3行3列の範囲を代入すると「1 to 3, 1 to 3」と定義されます。

どうしても0から始めたい場合は、新たに要素数を定義した動的配列へ代入し直す必要がありますが、その処理は煩雑になるため、要素数を合わせて扱う方が実用的です。

また、セルには数値や文字列など様々な型のデータが格納されるため、Variant型で宣言する必要があります。
この配列代入はVariant型でしか実行できません。
型を限定したい場合は、配列を加工して特定の型を指定した配列へ代入することも可能ですが、実用上の利点はほとんどありません。

この記事のまとめ

  • RangeをVariant型に代入するとセル範囲を一括で配列に格納できる
  • 配列の添字は1から始まるため注意
  • セル範囲を代入すると必ず2次元配列になる
  • Variant型でしか実行できない

セル範囲を配列に一括代入することで、ループ処理よりも高速にデータを扱えます。
大量データの集計や検索に役立つため、VBAで効率的な処理を行いたい場合に覚えておくと便利です。