配列の操作

にメンテナンス済み

VBA の配列は、複数の値を 1 つの変数名でまとめて扱うための仕組みです。 同じ種類の値をまとめる型付き配列と、Array 関数で作成する Variant 配列のどちらもよく使われます。

配列を使うと、売上一覧、ファイル名一覧、セル範囲から取得した値などを効率よく処理できます。

このページでは VBA における配列の定義と操作方法について解説します。

配列の定義

Array 関数を使うと、簡単に Variant 配列を作成できます。

配列の定義
Dim fruits As Variant

fruits = Array("apple", "banana", "orange")

上記の例では、fruitsという変数にArray関数を使って"apple", "banana", "orange"という 3 つの要素を持つ配列を代入しています。

Array 関数で作成した配列のインデックスは 0 から始まります。Option Base 1 を指定していても、Array 関数の戻り値は 0 始まりです。

配列の要素の取得
fruits(0) ' => "apple"

配列には文字列だけでなく、数値や真偽値も格納することができます。

配列の定義(数値)
Dim numbers As Variant

numbers = Array(1, 2, 3)

numbers(1) ' => 2

同じ型の値だけを扱う場合は、型付き配列として宣言する方法もあります。

型付き配列の定義
Dim scores(1 To 3) As Long

scores(1) = 80
scores(2) = 95
scores(3) = 72

2 次元配列

配列の要素として、さらに配列を格納することで、2 次元配列を定義することができます。

配列の定義(2次元配列)
Dim matrix As Variant

matrix = Array(Array(1, 2, 3), Array(4, 5, 6), Array(7, 8, 9))

上記の例では、matrixという変数に 3 つの要素を持つ配列を代入しています。それぞれの要素は 3 つの要素を持つ配列です。

2次元配列の要素の取得
matrix(0)(0) ' => 1
matrix(1)(1) ' => 5

配列の操作

配列には、要素の追加、削除などが可能ですが、少し複雑な操作が必要です。

要素の追加

配列に要素を追加するには、ReDimステートメントを使って配列のサイズを変更し、新しい要素を追加します。

要素の追加
ReDim Preserve fruits(3)
fruits(3) = "grape"

ReDimを使用せずに要素を追加することはできません。また、Preserveを付けずにReDimでサイズを変更すると、元の配列のデータは初期化されます。既存データを保持したい場合はReDim Preserveを使います。

なお、2 次元以上の配列でPreserveを使う場合、変更できるのは最後の次元の上限だけです。行数方向を増やしたい場合は、配列の設計を見直すか、別の配列へコピーする必要があります。

要素の削除

配列から要素を削除するには、ReDimステートメントを使って配列のサイズを変更し、削除したい要素を削除します。

要素の削除
ReDim Preserve fruits(2)

特定の位置の要素を削除する必要がある場合は、要素を取り除いた配列を再定義する必要があります。

For Eachステートメントを使った配列の操作

配列の各要素に対して処理を行う場合は、For Eachステートメントを使うと便利です。

ForEachステートメントを使った配列の操作
Dim fruit As Variant

For Each fruit In fruits
  Debug.Print fruit
Next fruit

上記の例では、fruits配列の各要素をfruitという変数に代入して、Debug.Printステートメントで出力しています。

実行すると、以下のように出力されます。

apple
banana
orange

反復の流れをステップごとに追う

以下のビジュアライザでは、配列を For Each で走査する際に各要素がどのように取り出されるかを可視化します。要素を編集したり、インデックスでアクセスする For...Next タブと見比べたりして動作を理解してください。

For Each ... Next(要素列挙ループ): コレクションや配列のすべての要素を順に処理します。インデックスを意識せず書けるのが利点です。

VBA9 lines
1Sub LoopDemo()
2 Dim arr As Variant
3 arr = Array("りんご", "バナナ", "みかん", "ぶどう")
4 
5 Dim item As Variant
6 For Each item In arr
7 Debug.Print item
8 Next item
9End Sub
先頭要素「りんご」を取り出します。
変数反復: 0
  • item"りんご"
  • index1
イミディエイト ウィンドウ0
(出力なし)
速度1 / 13
#VBA