Range → 配列の読み込み
Excel VBAで大量データを扱うときの「高速化の必殺技」が Rangeを一括で配列に読み込む 方法です。セルを1つずつ読むより数十倍速くなります。初心者向けに、コード例とテンプレートをかみ砕いて説明します。
基本の仕組み
Range.Valueを変数に代入すると、二次元配列として読み込まれる。- 配列の添字は
[行番号, 列番号]でアクセスする。 - 1行目はヘッダー、2行目以降がデータという形が多い。
テンプレ1:単一列を配列に読み込む
A列のデータを配列に読み込んで、ループで処理する例。
Sub RangeToArray_SingleColumn()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' A2:A最終行を配列に読み込む
Dim v As Variant
v = ws.Range("A2:A" & lastRow).Value
Dim i As Long
For i = 1 To UBound(v, 1)
Debug.Print v(i, 1) ' 配列の[行,列]でアクセス
Next i
End Sub
VB- ポイント:
UBound(v, 1)は行数、UBound(v, 2)は列数。
テンプレ2:複数列を配列に読み込む
A〜C列を配列に読み込み、コード・商品名・数量を一気に処理。
Sub RangeToArray_MultiColumn()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' A2:C最終行を配列に読み込む
Dim v As Variant
v = ws.Range("A2:C" & lastRow).Value
Dim i As Long
For i = 1 To UBound(v, 1)
Dim code As String: code = v(i, 1)
Dim name As String: name = v(i, 2)
Dim qty As Double: qty = v(i, 3)
Debug.Print code, name, qty
Next i
End Sub
VB- ポイント: 配列は「行×列」で二次元。セルを直接読むより圧倒的に速い。
テンプレ3:配列を加工してシートに書き戻す
読み込んだ配列を加工して、別シートに一括で書き戻す。
Sub RangeToArray_WriteBack()
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
' 数量を2倍にして新しい配列を作る
Dim out() As Variant
ReDim out(1 To UBound(v, 1), 1 To 3)
Dim i As Long
For i = 1 To UBound(v, 1)
out(i, 1) = v(i, 1) ' コード
out(i, 2) = v(i, 2) ' 商品名
out(i, 3) = v(i, 3) * 2 ' 数量×2
Next i
' 別シートに一括書き込み
Dim wsOut As Worksheet
Set wsOut = Worksheets.Add
wsOut.Range("A2").Resize(UBound(out, 1), UBound(out, 2)).Value = out
End Sub
VB- ポイント:
Resizeで配列サイズに合わせて一括書き込み。セルを1つずつ書くより速い。
テンプレ4:ヘッダー付きでCurrentRegionを配列化
表全体を一括で配列に読み込む。
Sub RangeToArray_CurrentRegion()
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
Dim r As Long, c As Long
For r = 2 To UBound(v, 1) ' 1行目はヘッダー
For c = 1 To UBound(v, 2)
Debug.Print "行" & r & " 列" & c & " = " & v(r, c)
Next c
Next r
End Sub
VB- ポイント: CurrentRegionは「連続した表」を自動で範囲選択してくれる。
例題で練習
'例1:A列を配列に読み込んで出力
Sub Example_Single()
RangeToArray_SingleColumn
End Sub
'例2:A〜C列を配列に読み込んで出力
Sub Example_Multi()
RangeToArray_MultiColumn
End Sub
'例3:数量を2倍にして別シートへ書き戻す
Sub Example_WriteBack()
RangeToArray_WriteBack
End Sub
'例4:表全体を配列に読み込んでループ処理
Sub Example_CurrentRegion()
RangeToArray_CurrentRegion
End Sub
VB初心者向けポイント
- セル直読みは遅い:
Cells(i, j).Valueを繰り返すと数万行で止まる。 - 配列一括読み込み:
Range.Valueで一度に読み込むと爆速。 - 二次元配列:
[行,列]でアクセス。行数はUBound(v,1)、列数はUBound(v,2)。 - 書き戻しも一括:
Range.Resize(...).Value = 配列で一瞬。
