
VBAを使ったマクロを学習し始めたんだけど、配列がイマイチ理解できない…。
初心者でもわかるように教えて!

なるほど…。
配列は初心者がつまずく関門の一つです。
考え方によっては、すんなり理解できますよ!
では今回は、「VBAマクロの配列の構造や使い方」について、
VBAマクロ歴3年の私が、できるだけわかりやすく解説します。
※わかりやすさを重視しております。厳密には解釈が異なる場合があります。ご了承ください。
VBAの配列とは?
「配列」は、変数が集まったようなものです。
「下駄箱」や「アパート」などを思い浮かべていただけるとわかりやすいかと思います。

下駄箱の1足1足が変数、アパートの1部屋1部屋が変数というような感じです。
変数は1つの値しか保持できませんが、配列にすることによって複数の値を管理することができます。

配列の概要がわかったところで、配列の使い方を解説いたします。
配列の使い方
では早速、簡単なコードから見ていきましょう。
Sub 配列()
Dim getabako(2) As Integer
getabako(0) = 1
getabako(1) = 2
getabako(2) = 3
Range("A1").Value = getabako(0)
Range("A2").Value = getabako(1)
Range("A3").Value = getabako(2)
End Sub
上記コードで解説するのは、配列の基礎である以下の3つです。
- 配列の宣言
- 配列に値を代入
- 配列から値を出力
1つ1つ解説いたします。
配列の宣言
Dim getabako(2) As Integer
上記コードにて、配列の宣言を行っております。
変数の宣言と同じで、型名を指定します。
変数については、下記記事をご参考ください。
「getabako」というのが配列名です。
今回は「getabako」にしましたが、「hairetsu」でも「test」でも何でも構いません。
しかしながら、変数と同じで付けられない名前があるので注意しましょう。
詳しくは変数の記事をご参考ください。
Dim getabako(2) As Integer
配列名の後ろに()があります。
これは要素といって、配列の数を()の中に指定します。
下駄箱やアパートの部屋数だと思ってください。
今回は「2」となっているので、3つの要素を管理することができます。
【注意点】
(2)となっているので2つの要素だと思ってしまいがちですが、違います。
配列は1から数えるのではなく、0から数えます。
すなわち、「0・1・2」の3つの要素となるわけです。
わかりにくいですが、非常に重要ですので、これだけでも覚えておいてください。
今回は3つの要素を管理する配列を宣言しました。
3足入る下駄箱を用意したり、3部屋あるアパートを建てたと思ってください。

次に、宣言した配列に値を代入しましょう。
【一度宣言した配列の要素数は変更できない】
Dim getabako(2) As Integer
上記のように3つの要素を管理する配列を宣言しました。
この要素数は途中で変更することができません。
たとえば、3→5に増やしたり、9→4に減らしたりすることはできないということです。
要素数を変更できる配列も存在します(「いろいろな配列」を参照)
配列に値を代入
getabako(0) = 1
getabako(1) = 2
getabako(2) = 3
上記コードにて、配列に値を代入しております。
変数に値を代入する場合は、「getabako = 1」となりますが、
配列の場合は「getabako(0) = 1」というふうに「(要素の番号)」を指定します。

【範囲外の要素は操作できない】
もちろん、宣言した範囲を超える要素を操作することはできません。
※今回の場合、宣言したのがgetabako(2)までなので、getabako(3)に値を代入することはできない
文字列型の配列を宣言していれば、文字を代入することが可能です。
Dim getabako(2) As String
getabako(0) = "一"
getabako(1) = "二"
getabako(2) = "三"
配列から値を出力
Range("A1").Value = getabako(0)
Range("A2").Value = getabako(1)
Range("A3").Value = getabako(2)
上記コードにて、配列から値を出力しております。
「getabako」の0番目の値(さきほど代入した1)をA1セルに書き込みするといった具合で、それぞれのセルに出力しています。
実行結果が下図です。

For文でもっと簡潔に
Sub 配列()
Dim getabako(2) As Integer
getabako(0) = 1
getabako(1) = 2
getabako(2) = 3
Range("A1").Value = getabako(0)
Range("A2").Value = getabako(1)
Range("A3").Value = getabako(2)
End Sub
For文を使うことで、上記コードをもっと簡潔にすることができます。
下記がFor文を使って書き換えたコードです。
Sub 配列()
Dim getabako(2) As Integer
For i = 0 To 2
getabako(i) = i + 1
Range("A"&getabako(i)) = getabako(i)
Next i
End Sub
簡単に解説すると以下の流れになっています。
【1周目】
i = 0
getabako(0) に1(0+1)を代入
A1セル(A&1)に1を書き込み
【2週目】
i = 1
getabako(1) に2(1+1)を代入
A2セル(A&2)に2を書き込み
【3週目】
i = 2
getabako(2) に3(2+1)を代入
A3セル(A&3)に3を書き込み
For文の使い方については、下記記事をご参考ください。
これで配列の基礎は終わりです。
- 配列は変数の集まり(下駄箱のようなもの)
- 配列は(要素番号)で管理する
- 配列の要素番号は0から始まる
以上が重要ですので、配列を扱う際は思い出してください。。
ここからは、いろいろな配列を紹介いたします。
いろいろな配列
初心者でも扱いやすい配列を2つ紹介いたします。
前項では、宣言と同時に要素数も指定する配列を紹介いたしました。
これを「固定配列」といいます。
Dim getabako(2) As Integer '固定配列
この固定配列は、途中で要素数を変更することができません。
しかしながら、次に紹介する「動的配列」は途中で要素数の変更が可能です。
動的配列
動的配列の宣言は以下のとおりです。
Dim getabako() As Integer '動的配列
要素数を宣言しないのが動的配列の特徴です。
しかしながら、この状態では配列を操作することはできません。
要素数が決まってないからです。
何足入るかわからない下駄箱や、何部屋かわからないアパートみたいに、得体のしれない配列は操作できないのです。
要素数を決定するため、下記のように記述しましょう。
Dim getabako() As Integer '動的配列
ReDim getabako(2) As Integer '動的配列の要素数を決定
これで固定配列と同様に操作することができます。
途中で要素数を変更したくなった場合も、同じように記述してください。
ReDim getabako(9) As Integer '動的配列の要素数を変更
これで要素数を増やしたり、減らしたりすることができます。
【注意点】
要素数を減らすこともできますが、無くなった番号の要素に入っていた値は削除されてしまいます。
※(2)→(1)に変更すると、(2)に入っていた値は消える

【「ReDim」の使い過ぎに注意】
要素数を変更できる「ReDim」ですが、使いすぎてしまうと現在の要素数がわからなくなるため注意しましょう。
また「ReDim」を使いすぎることで、メモリの断片化を引き起こす可能性もあります。
多次元配列(二次元配列)
ここまで紹介した配列は「一次元配列」と言って、縦1列の下駄箱のようなものですね。

今回紹介するのは多次元配列です。
(二次元配列・三次元配列など)
たとえば二次元配列は、縦横ある下駄箱や、2階建てのアパートを想像していただくとわかりやすいかと思います。

- 一次元:縦か横のみ
- 二次元:縦×横
多次元配列を活用することで、エクセルの表のように値を管理することができます。

では、二次元配列の宣言方法を見ていきましょう。
Dim getabako(2, 1) As String '縦3、横2の二次元配列を宣言
図で表すと、下図のような感じでしょうか。

値の代入と出力は下記のように行います。
getabako(0, 0) = "名前"
getabako(1, 0) = "佐藤"
getabako(2, 0) = "田中"
getabako(0, 1) = "学年"
getabako(1, 1) = "1年"
getabako(2, 1) = "1年"
Range("A1").Value = getabako(0, 0)
Range("A2").Value = getabako(1, 0)
Range("A3").Value = getabako(2, 0)
Range("B1").Value = getabako(0, 1)
Range("B2").Value = getabako(1, 1)
Range("B3").Value = getabako(2, 1)


要素数を増やすことで、さまざまな表を作ることができます。試してみてください。
最後に
VBAの配列について解説いたしました。
当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!