Excel VBAの多次元配列をやさしく解説
夜に勉強おつかれさま。Excelの「表」をそのままプログラムで扱えるのが多次元配列です。まずは「1次元=リスト」「2次元=表」の感覚をつかみましょう。
配列ってなに?
- イメージ: 同じ種類のデータをまとめて入れる「箱の並び」。1個ずつ名前を付けず、番号で管理する。
- メリット: データが増えてもコードがスッキリ。繰り返し処理と相性抜群。
- 基本形: 1次元は番号が1つ、2次元は「行番号」と「列番号」を使う。
1次元配列(リスト)の基礎
例題1:5人の点数を入れて平均を計算
Sub OneDimArrayExample()
Dim scores(4) As Integer '0~4の5人分
Dim i As Integer
Dim total As Integer
Dim avg As Double
'点数を代入
scores(0) = 80
scores(1) = 92
scores(2) = 75
scores(3) = 88
scores(4) = 60
'合計を計算
For i = 0 To 4
total = total + scores(i)
Next i
avg = total / 5
Debug.Print "平均点: " & avg
End Sub
VB- ポイント:
scores(4)と書くと「5個分」になる。VBAは基本「0スタート」。 - 取り出し方:
scores(i)のように番号でアクセス。
2次元配列(表)の基礎
- イメージ: 行×列の「表」。Excelのシートそのもの。
- 宣言:
Dim data(行の最大, 列の最大) As 型(どちらも0スタート)
例題2:3人×3教科の点数表から各人の平均を出す
Sub TwoDimArrayExample()
Dim scores(2, 2) As Integer '3人×3教科(0~2)
Dim person As Integer
Dim subject As Integer
Dim total As Integer
Dim avg As Double
'データを代入(人:0~2、教科:0~2)
'人0
scores(0, 0) = 80 '国語
scores(0, 1) = 90 '数学
scores(0, 2) = 70 '英語
'人1
scores(1, 0) = 85
scores(1, 1) = 75
scores(1, 2) = 95
'人2
scores(2, 0) = 60
scores(2, 1) = 88
scores(2, 2) = 82
'各人の平均を表示
For person = 0 To 2
total = 0
For subject = 0 To 2
total = total + scores(person, subject)
Next subject
avg = total / 3
Debug.Print "人" & person & "の平均: " & avg
Next person
End Sub
VB- ポイント:
scores(人番号, 教科番号)の順で管理すると覚えやすい。 - 入れ子のFor文: 行の外側、列の内側が定番。
実用例:シートと配列を組み合わせる
例題3:シートの「A1:C3」を2次元配列に読み込み、合計を計算
Sub RangeToArraySum()
Dim r As Range
Dim arr As Variant
Dim i As Long, j As Long
Dim total As Double
Set r = ThisWorkbook.Sheets("Sheet1").Range("A1:C3")
arr = r.Value 'Variantに2次元配列として入る(1~3でインデックス)
For i = 1 To UBound(arr, 1) '行数
For j = 1 To UBound(arr, 2) '列数
If IsNumeric(arr(i, j)) Then
total = total + arr(i, j)
End If
Next j
Next i
Debug.Print "合計: " & total
End Sub
VB- ポイント: Rangeをそのまま配列にすると「1スタート」になる。通常の配列(0スタート)と違うので注意。
- 便利さ: Excelの表を一気に読み書きできるので高速。
一歩進んだ使い方と注意点
- 可変サイズ: データ数が決まっていないときは
ReDimを使って後からサイズ変更できる。
Sub RedimExample()
Dim arr() As String
Dim n As Long, i As Long
n = 5
ReDim arr(n - 1) '0~n-1
For i = 0 To n - 1
arr(i) = "Item" & i
Next i
End Sub
VB- サイズ確認:
UBound(arr, 次元番号)で上限を取得。2次元なら第1引数に1(行)や2(列)を指定。 - 混乱しやすい点: Range配列は1スタート、
Dim配列は0スタートが基本。どちらを使っているか常に意識する。 - 命名のコツ:
scores(person, subject)のように、順番が分かる名前で統一。
練習問題(自分で書いて動かそう)
- 問題1: 4人×2項目(身長・体重)の2次元配列を作り、各人のBMIを計算して表示。
- ヒント:
- 身長はメートルに変換してから計算。
- BMI = 体重(kg) ÷ 身長(m)^2
Sub BMIArrayPractice()
Dim data(3, 1) As Double '4人×2項目(身長m、体重kg)
Dim i As Long
Dim bmi As Double
'例データ(m, kg)
data(0, 0) = 1.72: data(0, 1) = 65
data(1, 0) = 1.60: data(1, 1) = 52
data(2, 0) = 1.80: data(2, 1) = 75
data(3, 0) = 1.55: data(3, 1) = 48
For i = 0 To 3
bmi = data(i, 1) / (data(i, 0) ^ 2)
Debug.Print "人" & i & "のBMI: " & Format(bmi, "0.0")
Next i
End Sub
VB- 問題2: シート「Data」のA列に名前、B列に点数が入っている。これを配列に読み込み、80点以上だけを別シートに出力。
