次元配列の扱い
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 = 配列で一括書き戻し。 - 二次元配列必須:
[行,列]形式でないと書き戻せない。一次元は変換する。 - 加工は配列内で: 計算や文字列結合は配列内で済ませると高速。
