Excel VBA 逆引き集 | Range → 配列の読み込み

Excel VBA
スポンサーリンク

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 = 配列で一瞬。

タイトルとURLをコピーしました