Excel VBAの配列をやさしく理解する
はじめての配列は、少しだけ「コツ」を掴めば一気に使いこなせます。配列は「同じ種類のデータを、番号付きの箱に並べて入れておく仕組み」。名前一覧や点数表など「複数の値」をまとめて扱うときに威力を発揮します。
配列の基本イメージ
- 配列とは: 同じ型(数字、文字など)のデータを、順番に並べた「箱の列」。
- インデックス(番号): 箱に付いている番号で取り出す。Excel VBAでは基本「0から開始」します。
- 宣言する: 何個の箱が必要かを最初に決める。
' 文字を10個入れる配列(0~9の10個)
Dim names(9) As String
' 数字を5個入れる配列(0~4の5個)
Dim scores(4) As Integer
VBよくあるつまずきポイント
- 番号は0から始まる: 10個欲しいなら(9)まで。これは超重要。
- 型はそろえる: Stringの配列に数字をそのまま入れようとすると不整合。型は統一する。
- 範囲外アクセスはエラー: 例えば、Dim scores(4) なら scores(5) はアウト。
迷ったら「配列は0から始まる。上限は指定値と同じ数字」を合言葉に。
例題1:名前リストを配列で管理する
目的
シートA1~A4に「関東の県です」か「関東以外の県です」を出す、という判定を配列で行う。
コード
Sub CheckPrefecture()
Dim pref(3) As String ' 4つの箱:0~3
Dim src As String
Dim i As Integer
Dim msg As String
' 関東の一部県名を配列に入れる
pref(0) = "東京都"
pref(1) = "神奈川県"
pref(2) = "千葉県"
pref(3) = "埼玉県"
' 判定したい県名(ここを変えるだけで再利用できる)
src = "埼玉県"
' 初期メッセージ(見つからなければこれのまま)
msg = "関東以外の県です"
' 0~3まで順番にチェック
For i = 0 To 3
If src = pref(i) Then
msg = "関東の県です"
Exit For ' 見つかったらループを早めに抜ける
End If
Next i
Range("A1").Value = msg
End Sub
VB- ポイント: 繰り返し(For~Next)と組み合わせると「一覧から探す」が一気に楽になります。
- Exit For: 見つけたら早めに抜けると無駄がなく、速く終わる。
例題2:テストの点数を合計・平均する
目的
5人分の点数を配列に入れて、合計と平均を表示。
コード
Sub CalcScores()
Dim scores(4) As Integer ' 0~4で5人分
Dim i As Integer
Dim total As Integer
Dim average As Double
' 点数を配列に格納
scores(0) = 80
scores(1) = 92
scores(2) = 74
scores(3) = 88
scores(4) = 95
' 合計を計算
total = 0
For i = 0 To 4
total = total + scores(i)
Next i
' 平均を計算(小数を扱うためDouble)
average = total / 5
Range("A1").Value = "合計: " & total
Range("A2").Value = "平均: " & average
End Sub
VB- ポイント: 合計の初期値は0から。平均は小数になるのでDoubleが向いています。
例題3:入力データをまとめて加工する(小文字→大文字)
目的
シートのA1~A5にある文字列を「大文字」にして、B列に出力。
コード
Sub UpperCaseList()
Dim texts(4) As String ' 5つ分の文字を格納
Dim i As Integer
' A1~A5を配列に読み込む
For i = 0 To 4
texts(i) = Cells(i + 1, 1).Value ' 行番号は1から、配列は0から
Next i
' 加工してB列へ出力
For i = 0 To 4
Cells(i + 1, 2).Value = UCase$(texts(i))
Next i
End Sub
VB- ポイント: シートは1始まり、配列は0始まり。ズレに注意。
- UCase$: 文字列を大文字へ。末尾の$は「文字列版」を使う合図で少し速い。
一歩進んだ使い方:要素数をあとから変えたい(動的配列)
- 固定配列: Dim names(9) のように最初に個数を決める。
- 動的配列: 個数がわからないときは、あとから ReDim で増やす。
Sub DynamicArraySample()
Dim items() As String ' 個数はまだ決めない(空の配列)
Dim count As Integer
count = 3 ' たとえばデータ数が3だった
ReDim items(count - 1) ' 0~(count-1)に確保
items(0) = "Apple"
items(1) = "Banana"
items(2) = "Cherry"
' さらに増やしたいとき(中身を保持)
ReDim Preserve items(4) ' 0~4の5個に拡張、既存データは残す
items(3) = "Dates"
items(4) = "Elderberry"
Range("A1").Resize(UBound(items) + 1, 1).Value = Application.Transpose(items)
End Sub
VB- ReDim: 配列のサイズを再設定。
- Preserve: 既存の中身を保持してサイズ変更。末尾側の変更に向いています。
- UBound: 配列の最大インデックス(上限)を返す。要素数は UBound + 1。
使いこなしのコツと練習問題
- コツ1: 繰り返し(For~Next)と配列はセット。範囲や個数に合わせて回す。
- コツ2: UBound/LBoundで「配列の範囲」をコードから取得すると安全。
- コツ3: 0始まりを忘れない。範囲外アクセスはバグの元。
練習問題
- 最大値を見つける: Integerの配列 scores に入った点数のうち、最大値をA1に表示。
- 検索関数を作る: String配列 names に「鈴木」が含まれているかをTrue/Falseで返す関数。
- ユニーク抽出(やさしめ版): A1~A10の文字列を読み込み、重複を無視してB列に並べる(ヒント: 2重ループで「すでに出た?」をチェック)。
ヒントコード(最大値)
Function MaxOfArray(ByRef arr() As Integer) As Integer
Dim i As Integer
Dim m As Integer
m = arr(0)
For i = LBound(arr) To UBound(arr)
If arr(i) > m Then m = arr(i)
Next i
MaxOfArray = m
End Function
VBまとめ
- 配列は「同じ型のデータを、番号付きで並べて持つ」仕組み。
- 0始まり・範囲外に注意。For~Nextと組み合わせると本領発揮。
- 要素数が不定なら動的配列+ReDim(必要ならPreserve)で柔軟に対応。
