Excel VBA | 多次元配列

VBA
スポンサーリンク

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点以上だけを別シートに出力。
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました