Excel VBA 逆引き集 | 2次元配列の扱い

Excel VBA
スポンサーリンク

次元配列の扱い

Excel VBAで大量データを扱うときに必須になるのが 2次元配列
Rangeを読み込むと自動的に「行×列」の二次元配列になります。ここでは初心者向けに、コード例とテンプレートをかみ砕いて説明します。


2次元配列の基本

  • 構造: 配列(行番号, 列番号) でアクセス。
  • 行数: UBound(配列, 1)
  • 列数: UBound(配列, 2)
  • Range→配列: v = Range("A1:C10").Value
  • 配列→Range: Range("A1").Resize(行数, 列数).Value = v

テンプレ1:Rangeを2次元配列に読み込む

Sub Array2D_ReadRange()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("A1").CurrentRegion

    Dim v As Variant
    v = rg.Value ' 2次元配列に読み込まれる

    Dim r As Long, c As Long
    For r = 1 To UBound(v, 1)
        For c = 1 To UBound(v, 2)
            Debug.Print "行" & r & " 列" & c & " = " & v(r, c)
        Next c
    Next r
End Sub
VB
  • ポイント: v(r, c)でセルの値にアクセスできる。
  • CurrentRegion: 表全体を自動で範囲選択してくれる。

テンプレ2:2次元配列を加工する

例:数量列を2倍にして別シートへ書き戻す。

Sub Array2D_Process()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim lastRow As Long: lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

    Dim v As Variant
    v = ws.Range("A2:C" & lastRow).Value ' A=コード, B=商品名, C=数量

    Dim r As Long
    For r = 1 To UBound(v, 1)
        v(r, 3) = v(r, 3) * 2 ' 数量を2倍
    Next r

    Dim wsOut As Worksheet: Set wsOut = Worksheets.Add
    wsOut.Range("A2").Resize(UBound(v, 1), UBound(v, 2)).Value = v
End Sub
VB
  • ポイント: 配列を加工してから一括で書き戻すと爆速。

テンプレ3:2次元配列を新しく作る

Sub Array2D_Create()
    ' 3行×2列の配列を作成
    Dim arr(1 To 3, 1 To 2) As Variant

    arr(1, 1) = "A1": arr(1, 2) = 10
    arr(2, 1) = "A2": arr(2, 2) = 20
    arr(3, 1) = "A3": arr(3, 2) = 30

    ' シートに書き戻す
    Dim ws As Worksheet: Set ws = Worksheets("Sheet1")
    ws.Range("A1").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
End Sub
VB
  • ポイント: ReDimでサイズを動的に変更可能。

テンプレ4:一次元配列を二次元に変換して書き戻す

Sub Array1D_To2D()
    Dim arr1D As Variant
    arr1D = Array("りんご", "みかん", "バナナ")

    ' 縦方向の2次元配列に変換
    Dim arr2D() As Variant
    ReDim arr2D(1 To UBound(arr1D) + 1, 1 To 1)

    Dim i As Long
    For i = LBound(arr1D) To UBound(arr1D)
        arr2D(i + 1, 1) = arr1D(i)
    Next i

    Worksheets("Sheet1").Range("A1").Resize(UBound(arr2D, 1), 1).Value = arr2D
End Sub
VB
  • ポイント: 一次元配列はそのまま書き戻せないので、二次元に変換する。

例題で練習

'例1:表全体を2次元配列に読み込んで出力
Sub Example_Read()
    Array2D_ReadRange
End Sub

'例2:数量列を2倍にして別シートへ書き戻す
Sub Example_Process()
    Array2D_Process
End Sub

'例3:3×2の配列を作ってシートに書き戻す
Sub Example_Create()
    Array2D_Create
End Sub

'例4:一次元配列を二次元に変換して書き戻す
Sub Example_1DTo2D()
    Array1D_To2D
End Sub
VB

初心者向けポイント

  • セル直読みは遅い: Cells(i,j).Valueを繰り返すと数万行で止まる。
  • 配列一括読み込み・書き戻し: Range.Valueで読み込み、Range.Resize(...).Value = 配列で一括書き戻し。
  • 二次元配列必須: [行,列]形式でないと書き戻せない。一次元は変換する。
  • 加工は配列内で: 計算や文字列結合は配列内で済ませると高速。
タイトルとURLをコピーしました