Excel VBA | 配列

VBA
スポンサーリンク

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)  ' 要素数を増やす(既存データ保持)
VB

2次元配列(表みたいに行と列)

行×列の表データを扱うときに使います。

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次元配列で表データも扱える
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました