Excel VBA | 配列

VBA
スポンサーリンク

初心者向けに丁寧に噛み砕いて、実際に動くExcel VBA の配列(Array)の例をステップごとに説明します。実例コードと出力イメージ、よくあるミス対策、練習問題(解答付き)まで用意します。手を動かしながら読むと理解が速いです。

配列って何?

配列は「同じ種類の値をまとめて格納する箱の集合」です。
普通に Dim a As String と1つずつ宣言する代わりに、配列なら Dim a(4) As String と書いて a(0)〜a(4) の5個をまとめて持てます。

ポイント:VBA の配列は 0 から数えるDim x(4) は要素 0,1,2,3,4 の計5個)。


例 1 — 固定長配列(配列の宣言と代入)

Sub Example1_FixedArray()
    Dim pref(2) As String  ' 0〜2 の3要素
    pref(0) = "東京"
    pref(1) = "大阪"
    pref(2) = "福岡"
    
    MsgBox pref(1) ' → "大阪"
End Sub
VB

説明:pref に3つの都道府県を入れて、インデックス 1 を取り出しています。


例 2 — ループで配列を処理(よく使うパターン)

配列はループと相性が良いです。全要素を順番に処理できます。

Sub Example2_LoopArray()
    Dim numbers(4) As Integer
    Dim i As Integer
    
    For i = 0 To 4
        numbers(i) = (i + 1) * 10  ' 10,20,30,40,50
    Next i
    
    ' 配列の中身を表示
    For i = 0 To 4
        Debug.Print "numbers(" & i & ") = " & numbers(i)
    Next i
End Sub
VB

出力(イミディエイトウィンドウ):

numbers(0) = 10
numbers(1) = 20
...

例 3 — 動的配列(要素数を実行時に決める)

最初に要素数がわからないときは ReDim を使います。

Sub Example3_DynamicArray()
    Dim arr() As String   ' サイズ未指定の動的配列
    Dim n As Integer, i As Integer
    
    n = InputBox("何個の名前を登録しますか?", "個数入力", 3)
    ReDim arr(n - 1)      ' 0〜n-1 の配列を確保
    
    For i = 0 To n - 1
        arr(i) = InputBox("名前を入力してください(" & (i + 1) & ")")
    Next i
    
    ' 確認
    For i = 0 To UBound(arr)
        Debug.Print arr(i)
    Next i
End Sub
VB

ポイント:ReDim で配列の大きさを後から指定できます。UBound は配列の最大インデックスを返します(LBound は最小インデックス、通常 0)。


例 4 — ReDim Preserve(既存データを残してサイズ変更)

ReDim でサイズを変えると中身が消えることがあります。消さずに拡張するには Preserve を使います(1次元配列のみ、2次元では注意)。

Sub Example4_ReDimPreserve()
    Dim a() As Integer
    Dim i As Integer
    
    ReDim a(0)
    a(0) = 100
    
    ' もっと要素が必要になった → Preserve で拡張
    ReDim Preserve a(2)  ' 0〜2 に拡張(既存の a(0) は残る)
    a(1) = 200
    a(2) = 300
    
    For i = 0 To UBound(a)
        Debug.Print a(i)
    Next i
End Sub
VB

例 5 — 2次元配列(表のように使う)

行列(表)データを扱うときに便利です。

Sub Example5_2DArray()
    Dim table(1, 2) As String  ' 2行 × 3列(0〜1, 0〜2)
    table(0, 0) = "A"
    table(0, 1) = "B"
    table(0, 2) = "C"
    table(1, 0) = "D"
    table(1, 1) = "E"
    table(1, 2) = "F"
    
    Debug.Print table(1, 2) ' → "F"
End Sub
VB

注意:ReDim Preserve で 2次元配列のサイズを変更する場合、保てるのは最後の次元だけです(混乱しやすい点)。


例 6 — ワークシート範囲を配列で読み書き(高速)

シートから大量データを読み書きする場合、セルを1つずつ触るより配列に読み込んで処理→一括で書き戻す方が速いです。

Sub Example6_RangeToArray()
    Dim data As Variant
    Dim i As Long
    
    ' A1:A5 を配列として読み込む(Variant に 2次元配列で入る)
    data = ThisWorkbook.Sheets("Sheet1").Range("A1:A5").Value
    
    ' 読み込まれた data は data(1,1)〜data(5,1)
    For i = 1 To UBound(data, 1)
        Debug.Print data(i, 1)
    Next i
    
    ' 変更して書き戻す(例:全てに "-done" を付ける)
    For i = 1 To UBound(data, 1)
        data(i, 1) = data(i, 1) & "-done"
    Next i
    ThisWorkbook.Sheets("Sheet1").Range("A1:A5").Value = data
End Sub
VB

重要:Range から読み込むと 1始まり(1〜N)の2次元配列になります。LBound(data,1)UBound(data,1) を使して安全にループしましょう。


よくある間違いと対策

  • 0始まりを忘れるDim arr(5) は6個。混乱したら LBound/UBound を使う。
  • ReDim でデータが消える:サイズ変更すると中身が消える。消さずに拡張するには ReDim Preserve
  • Range → 配列 のときのインデックス:Range で読み込んだ配列は通常 data(1,1) 始まり(1ベース)。注意!
  • 2次元の ReDim Preserve の制限:最後の次元だけ保持可能。設計で注意。

ミニアプリ例:配列を使った「存在チェック(リストに値があるか)」

Sub MiniApp_CheckInList()
    Dim fruits() As String
    fruits = Array("りんご", "みかん", "バナナ", "ぶどう") ' 簡単に配列作成
    
    Dim target As String
    target = InputBox("探したい果物を入力してください")
    
    Dim found As Boolean
    found = False
    Dim i As Integer
    For i = LBound(fruits) To UBound(fruits)
        If fruits(i) = target Then
            found = True
            Exit For
        End If
    Next i
    
    If found Then
        MsgBox target & " はリストにあります。"
    Else
        MsgBox target & " はリストにありません。"
    End If
End Sub
VB

ポイント:Array(...) を使うと簡単に配列を作れます(戻り値は Variant 型の配列)。ループで比較して見つかったら Exit For で早めに抜けるのが効率的。


練習問題(短め・解答付き)

  1. Dim x(3) As Integerx(0)=1, x(1)=2, x(2)=3, x(3)=4 をセットし、合計を出すコードを書け。
    解答(要点)For i = 0 To 3: sum = sum + x(i): Next i のようにループで合算。
  2. ReDim a(0)a(0)=5 → さらに aReDim Preserve a(3) で拡張して a(1)=6, a(2)=7, a(3)=8 を入れたとき a(0) の値は何か?
    解答5(Preserve により保持される)。
  3. シートの B1:B4 を読み込んで、最大値を MsgBox で表示するコードを書け(ヒント:Range→Variant→配列、UBound 使用)。
    解答(要点)
Dim v As Variant, i As Long, mx As Double
v = Range("B1:B4").Value
mx = v(1,1)
For i = 1 To UBound(v,1)
    If v(i,1) > mx Then mx = v(i,1)
Next i
MsgBox mx
VB

一歩進んだコツ(覚えておくと便利)

  • LBound(arr) / UBound(arr) は必ず使えるように。配列の範囲依存のバグを防げます。
  • 大きなデータをセルに書き戻すときは、配列で処理してから一括書き戻し → 高速化。
  • 多次元データを扱うなら最初に「行/列どっちを最初の次元にするか」を設計しておくとコードが読みやすい。
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました