Excel VBA | 配列の「宣言」

VBA
スポンサーリンク

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始まりを忘れない。範囲外アクセスはバグの元。

練習問題

  1. 最大値を見つける: Integerの配列 scores に入った点数のうち、最大値をA1に表示。
  2. 検索関数を作る: String配列 names に「鈴木」が含まれているかをTrue/Falseで返す関数。
  3. ユニーク抽出(やさしめ版): 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)で柔軟に対応。
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました