初心者向けに丁寧に噛み砕いて、実際に動くExcel VBA の配列(Array)の例をステップごとに説明します。実例コードと出力イメージ、よくあるミス対策、練習問題(解答付き)まで用意します。手を動かしながら読むと理解が速いです。
配列って何?
配列は「同じ種類の値をまとめて格納する箱の集合」です。
普通に Dim a As String と1つずつ宣言する代わりに、配列なら Dim a(4) As String と書いて a(0)〜a(4) の5個をまとめて持てます。
ポイント:VBA の配列は 0 から数える(
Dim x(4)は要素 0,1,2,3,4 の計5個)。
例 1 — 固定長配列(配列の宣言と代入)
Sub Example1_FixedArray()
Dim pref(2) As String ' 0〜2 の3要素
pref(0) = "東京"
pref(1) = "大阪"
pref(2) = "福岡"
MsgBox pref(1) ' → "大阪"
End Sub
VB説明:pref に3つの都道府県を入れて、インデックス 1 を取り出しています。
例 2 — ループで配列を処理(よく使うパターン)
配列はループと相性が良いです。全要素を順番に処理できます。
Sub Example2_LoopArray()
Dim numbers(4) As Integer
Dim i As Integer
For i = 0 To 4
numbers(i) = (i + 1) * 10 ' 10,20,30,40,50
Next i
' 配列の中身を表示
For i = 0 To 4
Debug.Print "numbers(" & i & ") = " & numbers(i)
Next i
End Sub
VB出力(イミディエイトウィンドウ):
numbers(0) = 10
numbers(1) = 20
...
例 3 — 動的配列(要素数を実行時に決める)
最初に要素数がわからないときは ReDim を使います。
Sub Example3_DynamicArray()
Dim arr() As String ' サイズ未指定の動的配列
Dim n As Integer, i As Integer
n = InputBox("何個の名前を登録しますか?", "個数入力", 3)
ReDim arr(n - 1) ' 0〜n-1 の配列を確保
For i = 0 To n - 1
arr(i) = InputBox("名前を入力してください(" & (i + 1) & ")")
Next i
' 確認
For i = 0 To UBound(arr)
Debug.Print arr(i)
Next i
End Sub
VBポイント:ReDim で配列の大きさを後から指定できます。UBound は配列の最大インデックスを返します(LBound は最小インデックス、通常 0)。
例 4 — ReDim Preserve(既存データを残してサイズ変更)
ReDim でサイズを変えると中身が消えることがあります。消さずに拡張するには Preserve を使います(1次元配列のみ、2次元では注意)。
Sub Example4_ReDimPreserve()
Dim a() As Integer
Dim i As Integer
ReDim a(0)
a(0) = 100
' もっと要素が必要になった → Preserve で拡張
ReDim Preserve a(2) ' 0〜2 に拡張(既存の a(0) は残る)
a(1) = 200
a(2) = 300
For i = 0 To UBound(a)
Debug.Print a(i)
Next i
End Sub
VB例 5 — 2次元配列(表のように使う)
行列(表)データを扱うときに便利です。
Sub Example5_2DArray()
Dim table(1, 2) As String ' 2行 × 3列(0〜1, 0〜2)
table(0, 0) = "A"
table(0, 1) = "B"
table(0, 2) = "C"
table(1, 0) = "D"
table(1, 1) = "E"
table(1, 2) = "F"
Debug.Print table(1, 2) ' → "F"
End Sub
VB注意:ReDim Preserve で 2次元配列のサイズを変更する場合、保てるのは最後の次元だけです(混乱しやすい点)。
例 6 — ワークシート範囲を配列で読み書き(高速)
シートから大量データを読み書きする場合、セルを1つずつ触るより配列に読み込んで処理→一括で書き戻す方が速いです。
Sub Example6_RangeToArray()
Dim data As Variant
Dim i As Long
' A1:A5 を配列として読み込む(Variant に 2次元配列で入る)
data = ThisWorkbook.Sheets("Sheet1").Range("A1:A5").Value
' 読み込まれた data は data(1,1)〜data(5,1)
For i = 1 To UBound(data, 1)
Debug.Print data(i, 1)
Next i
' 変更して書き戻す(例:全てに "-done" を付ける)
For i = 1 To UBound(data, 1)
data(i, 1) = data(i, 1) & "-done"
Next i
ThisWorkbook.Sheets("Sheet1").Range("A1:A5").Value = data
End Sub
VB重要:Range から読み込むと 1始まり(1〜N)の2次元配列になります。LBound(data,1) や UBound(data,1) を使して安全にループしましょう。
よくある間違いと対策
- 0始まりを忘れる:
Dim arr(5)は6個。混乱したらLBound/UBoundを使う。 - ReDim でデータが消える:サイズ変更すると中身が消える。消さずに拡張するには
ReDim Preserve。 - Range → 配列 のときのインデックス:Range で読み込んだ配列は通常
data(1,1)始まり(1ベース)。注意! - 2次元の ReDim Preserve の制限:最後の次元だけ保持可能。設計で注意。
ミニアプリ例:配列を使った「存在チェック(リストに値があるか)」
Sub MiniApp_CheckInList()
Dim fruits() As String
fruits = Array("りんご", "みかん", "バナナ", "ぶどう") ' 簡単に配列作成
Dim target As String
target = InputBox("探したい果物を入力してください")
Dim found As Boolean
found = False
Dim i As Integer
For i = LBound(fruits) To UBound(fruits)
If fruits(i) = target Then
found = True
Exit For
End If
Next i
If found Then
MsgBox target & " はリストにあります。"
Else
MsgBox target & " はリストにありません。"
End If
End Sub
VBポイント:Array(...) を使うと簡単に配列を作れます(戻り値は Variant 型の配列)。ループで比較して見つかったら Exit For で早めに抜けるのが効率的。
練習問題(短め・解答付き)
Dim x(3) As Integerにx(0)=1, x(1)=2, x(2)=3, x(3)=4をセットし、合計を出すコードを書け。
解答(要点):For i = 0 To 3: sum = sum + x(i): Next iのようにループで合算。ReDim a(0)→a(0)=5→ さらにaをReDim Preserve a(3)で拡張してa(1)=6, a(2)=7, a(3)=8を入れたときa(0)の値は何か?
解答:5(Preserve により保持される)。- シートの
B1:B4を読み込んで、最大値をMsgBoxで表示するコードを書け(ヒント:Range→Variant→配列、UBound使用)。
解答(要点):
Dim v As Variant, i As Long, mx As Double
v = Range("B1:B4").Value
mx = v(1,1)
For i = 1 To UBound(v,1)
If v(i,1) > mx Then mx = v(i,1)
Next i
MsgBox mx
VB一歩進んだコツ(覚えておくと便利)
LBound(arr)/UBound(arr)は必ず使えるように。配列の範囲依存のバグを防げます。- 大きなデータをセルに書き戻すときは、配列で処理してから一括書き戻し → 高速化。
- 多次元データを扱うなら最初に「行/列どっちを最初の次元にするか」を設計しておくとコードが読みやすい。
