Excel VBAの配列を初心者向けにやさしく解説
配列は「同じ種類のデータを、ひとつの名前でまとめて管理するための並びの箱」です。バラバラの変数をたくさん作る代わりに、配列ならひとつの名前で順番に扱えます。最初は概念だけ掴めればOK。手を動かす例題で「わかった」に変えていきましょう。
配列のイメージ
- イメージ:
長いロッカーのようなもの。各ロッカーに番号(インデックス)が付いていて、同じ型のデータを順番にしまいます。 - インデックス(番号):
VBAでは基本「0からスタート」。Dim a(4) As Integerは 0~4 の5つの箱(合計5個)です。 - 何がうれしい?
- まとめて処理: ループと相性がいい。全要素を一気にチェック・計算できる。
- 見通しが良くなる: 変数を100個作るより、配列でスッキリ。
- 変更に強い: 要素数が変わっても、ループの回数を変えるだけで対応しやすい。
配列の基本操作
宣言(箱を用意する)
' 5つの整数を入れる配列(0~4)
Dim nums(4) As Integer
' 3つの文字列(0~2)
Dim names(2) As String
VB代入(箱に入れる)
nums(0) = 10
nums(1) = 20
nums(2) = 35
names(0) = "東京"
names(1) = "大阪"
names(2) = "福岡"
VB取り出し(箱から出す)
Debug.Print nums(2) ' 35 が表示される
Debug.Print names(1) ' 大阪 が表示される
VBループでまとめて処理
Dim i As Integer
For i = 0 To 4
Debug.Print nums(i)
Next i
VBよくあるつまずきポイント
- インデックスは0から:
5個ほしいなら(4)まで。Dim a(5)は6個になってしまう。 - 型は揃える:
As Stringの配列に数値を入れると自動変換されることもあるけど、基本は型を合わせる。 - 範囲外アクセスに注意:
Dim a(2)に対してa(3)はエラー。ループは必ず宣言した範囲内で。
例題1:3つの点数の平均を求める
やりたいこと
テスト点数が3つある。配列に入れて平均を計算して表示する。
Sub AverageScore()
Dim scores(2) As Integer ' 0,1,2 の3つ
Dim i As Integer
Dim sum As Integer
Dim avg As Double
' 点数を格納
scores(0) = 80
scores(1) = 92
scores(2) = 75
' 合計を計算
For i = 0 To 2
sum = sum + scores(i)
Next i
avg = sum / 3
MsgBox "平均点は " & avg
End Sub
VB- ポイント:
- ループで合計を出す。
- 平均は合計 ÷ 個数。
Integerの割り算は小数が消えるので、結果用はDoubleが安心。
例題2:文字列の検索(一致するか調べる)
やりたいこと
入力された都市名が配列に含まれているか調べる。
Sub FindCity()
Dim cities(4) As String
Dim src As String
Dim i As Integer
Dim found As Boolean
' 候補をセット
cities(0) = "東京"
cities(1) = "大阪"
cities(2) = "名古屋"
cities(3) = "福岡"
cities(4) = "札幌"
src = InputBox("都市名を入力してください")
For i = 0 To 4
If src = cities(i) Then
found = True
Exit For
End If
Next i
If found Then
MsgBox "見つかりました: " & src
Else
MsgBox "見つかりませんでした"
End If
End Sub
VB- ポイント:
Exit Forで早めにループ終了。Booleanで見つかったかどうかを記録すると分かりやすい。
例題3:合計・最大値・最小値を一度に取る
Sub Stats()
Dim nums(5) As Integer ' 6個(0~5)
Dim i As Integer
Dim sum As Long
Dim maxVal As Integer
Dim minVal As Integer
' データ
nums(0) = 12
nums(1) = 7
nums(2) = 34
nums(3) = 18
nums(4) = 21
nums(5) = 9
' 初期値
maxVal = nums(0)
minVal = nums(0)
For i = 0 To 5
sum = sum + nums(i)
If nums(i) > maxVal Then
maxVal = nums(i)
End If
If nums(i) < minVal Then
minVal = nums(i)
End If
Next i
MsgBox "合計:" & sum & vbCrLf & "最大:" & maxVal & vbCrLf & "最小:" & minVal
End Sub
VB- ポイント:
- 最大・最小の初期値は「最初の要素」。
- 1回のループで複数の集計を同時にできる。
動的配列(あとから大きさを決める)
データ数が実行時に決まる場合、動的配列が便利です。
Sub DynamicArray()
Dim n As Integer
Dim nums() As Integer ' カッコ内なし → 動的
n = CInt(InputBox("要素数を入力してください"))
ReDim nums(n - 1) ' 0~(n-1) に確保
Dim i As Integer
For i = 0 To n - 1
nums(i) = i * 10
Next i
MsgBox "最後の要素は " & nums(n - 1)
End Sub
VB- ポイント:
ReDimでサイズを確保。- 再度サイズ変更したい時は
ReDim Preserveを使うと中身を保持したまま伸ばせる(縮めると切り捨てに注意)。
ReDim Preserve nums(n + 4) ' 要素数を増やす(既存データ保持)
VB2次元配列(表みたいに行と列)
行×列の表データを扱うときに使います。
Sub TwoDimArray()
' 行: 0~2、列: 0~1 → 3行×2列
Dim scores(2, 1) As Integer
scores(0, 0) = 80: scores(0, 1) = 90
scores(1, 0) = 75: scores(1, 1) = 88
scores(2, 0) = 92: scores(2, 1) = 85
Dim r As Integer, c As Integer
For r = 0 To 2
For c = 0 To 1
Debug.Print "行" & r & " 列" & c & " = " & scores(r, c)
Next c
Next r
End Sub
VB- ポイント:
- 括弧内は
(行, 列)の順。 - ループは二重に回す。
- 括弧内は
実践ミニ課題
- 課題1:
5人分の名前を配列に入れて、入力した文字列が含まれているかを判定する。見つかったら「〇〇さんは登録済み」、なければ「未登録」。 - 課題2:
10個の整数を配列に入れて、偶数だけ合計を出す(ループ内で偶数判定)。 - 課題3(チャレンジ):
2次元配列で3×3の表を作り、各行の合計を表示する。
解答例と解説
課題1:名前検索(登録済みか判定)
解答例
Sub CheckName()
Dim names(4) As String
Dim src As String
Dim i As Integer
Dim found As Boolean
' 名前を配列にセット
names(0) = "佐藤"
names(1) = "鈴木"
names(2) = "田中"
names(3) = "高橋"
names(4) = "伊藤"
' 入力を受け取る
src = InputBox("名前を入力してください")
' 検索処理
For i = 0 To 4
If src = names(i) Then
found = True
Exit For
End If
Next i
' 結果表示
If found Then
MsgBox src & "さんは登録済みです"
Else
MsgBox src & "さんは未登録です"
End If
End Sub
VB解説
- 配列
namesに5人分の名前を格納。 - 入力された文字列
srcをループで1つずつ比較。 - 一致したら
found = Trueにしてループ終了。 - 最後に
If foundで判定結果を表示。
👉 ポイント: 「見つかったらすぐ終了」するために Exit For を使うと効率的。
課題2:偶数の合計
解答例
Sub SumEvenNumbers()
Dim nums(9) As Integer
Dim i As Integer
Dim sumEven As Integer
' データをセット(例として1~10)
For i = 0 To 9
nums(i) = i + 1
Next i
' 偶数だけ合計
For i = 0 To 9
If nums(i) Mod 2 = 0 Then
sumEven = sumEven + nums(i)
End If
Next i
MsgBox "偶数の合計は " & sumEven
End Sub
VB解説
Mod演算子で割り算の余りを求める。x Mod 2 = 0なら偶数。- 偶数だけを合計に加算。
👉 ポイント: 条件付きで加算する処理は「If文+Mod」が定番。
課題3:2次元配列で行ごとの合計
解答例
Sub RowSum()
Dim table(2, 2) As Integer
Dim r As Integer, c As Integer
Dim rowSum As Integer
' データをセット(例:1~9)
Dim n As Integer
n = 1
For r = 0 To 2
For c = 0 To 2
table(r, c) = n
n = n + 1
Next c
Next r
' 各行の合計を計算
For r = 0 To 2
rowSum = 0
For c = 0 To 2
rowSum = rowSum + table(r, c)
Next c
MsgBox "行" & r & "の合計は " & rowSum
Next r
End Sub
VB解説
- 2次元配列
table(行,列)を使って3×3の表を作成。 - 二重ループでデータを代入。
- 各行ごとに合計を計算して表示。
👉 ポイント:
- 行ごとに合計をリセットするため、
rowSum = 0を行ループの最初に置く。 - 二重ループの入れ子構造に慣れると、表データの処理が楽になる。
まとめ
- 課題1: 配列+検索 →
Exit Forで効率化。 - 課題2: 偶数判定 →
Mod演算子を活用。 - 課題3: 2次元配列+二重ループ → 行ごとの集計に応用。
これらを練習すると「配列+ループ」の基本がしっかり身につきます。
ちょっと便利な豆知識
- 配列の範囲を取得:
LBound(a)とUBound(a)で最小・最大インデックスが取れる。サイズが変わる可能性があるコードではこれを使うと安全。
Dim i As Integer
For i = LBound(nums) To UBound(nums)
Debug.Print nums(i)
Next i
VB- Variant配列:
Dim v()をVariant型にすると、型が混ざったデータも入れられるが、初心者はまず「同じ型」で慣れるのがおすすめ。
まとめ
- 配列は「同じ型のデータを並べて入れる箱のセット」
- インデックスは0から、ループとセットで使うと本領発揮
- 固定サイズ(
Dim a(n))と動的サイズ(ReDim)を使い分ける - 2次元配列で表データも扱える
