Excel VBA 逆引き集 | 配列高速テンプレ(実務向け)

Excel VBA
スポンサーリンク

配列高速テンプレ(実務向け)

Excel VBAで「数万行以上のデータを処理する」ような実務では、配列を使った高速処理が必須です。セルを1つずつ操作すると極端に遅くなるため、一括で配列に読み込み → 配列内で処理 → 一括で書き戻すの流れを覚えておくと安心です。ここでは初心者向けに、実務で役立つ高速テンプレを紹介します。


基本の流れ

  1. Rangeを配列に読み込む
    v = Range("A1:C100000").Value
    → 二次元配列に一瞬で取り込める。
  2. 配列内で処理する
    → ループや条件分岐でまとめて変更。
  3. 結果を一括で書き戻す
    Range("A1:C100000").Value = v
    → セルに一括反映。
  4. 画面更新や計算を止める
    Application.ScreenUpdating = False などでさらに高速化。

テンプレ1:巨大データを一括読み込み・書き戻し

Sub FastArray_ReadWrite()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False

    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("A2:C100000")
    Dim v As Variant: v = rg.Value

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

    rg.Value = v

    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
End Sub
VB
  • ポイント:
    • 10万行でも一瞬で処理。
    • 画面更新・再計算を止めるとさらに高速。

テンプレ2:条件付き一括変換

Sub FastArray_Condition()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("B2:B50000") ' 商品名列
    Dim v As Variant: v = rg.Value

    Dim r As Long
    For r = 1 To UBound(v, 1)
        If v(r, 1) = "りんご" Then
            v(r, 1) = "Apple"
        End If
    Next r

    rg.Value = v
End Sub
VB
  • ポイント: 条件判定も配列内でまとめて処理。

テンプレ3:集計(合計・平均)

Sub FastArray_SumAvg()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("C2:C50000") ' 数量列
    Dim v As Variant: v = rg.Value

    Dim sumQty As Double, r As Long
    For r = 1 To UBound(v, 1)
        sumQty = sumQty + v(r, 1)
    Next r

    MsgBox "合計=" & sumQty & vbCrLf & "平均=" & sumQty / UBound(v, 1)
End Sub
VB
  • ポイント: 配列で集計すれば高速。

テンプレ4:検索をDictionaryで高速化

Sub FastArray_SearchDict()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("A2:B50000") ' A=コード, B=商品名
    Dim v As Variant: v = rg.Value

    Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
    Dim r As Long
    For r = 1 To UBound(v, 1)
        dict(v(r, 1)) = v(r, 2)
    Next r

    ' 検索例
    Dim key As String: key = "C100"
    If dict.Exists(key) Then
        MsgBox "コード " & key & " の商品名は " & dict(key)
    Else
        MsgBox "該当なし"
    End If
End Sub
VB
  • ポイント: 数万件でも検索が一瞬。

テンプレ5:行列反転(Transpose)

Sub FastArray_Transpose()
    Dim v As Variant
    v = Range("A1:C5").Value

    Dim vT As Variant
    vT = WorksheetFunction.Transpose(v)

    Range("E1").Resize(UBound(vT, 1), UBound(vT, 2)).Value = vT
End Sub
VB
  • ポイント: 行列の入れ替えも配列で高速に。

例題で練習

'例1:数量列を2倍にして書き戻す
Sub Example1()
    FastArray_ReadWrite
End Sub

'例2:商品名を条件付きで変換
Sub Example2()
    FastArray_Condition
End Sub

'例3:数量列の合計と平均を計算
Sub Example3()
    FastArray_SumAvg
End Sub

'例4:コード検索をDictionaryで高速化
Sub Example4()
    FastArray_SearchDict
End Sub

'例5:行列反転
Sub Example5()
    FastArray_Transpose
End Sub
VB

初心者向けポイント

  • セル直操作は遅い: 巨大データでは必ず配列に読み込む。
  • 一括書き戻しが鉄則: Range.Value = 配列 で一瞬。
  • 画面更新を止める: ScreenUpdating=False でさらに高速化。
  • 検索はDictionary: 巨大配列でも即検索可能。
  • 集計や変換も配列で: 実務の定型処理に最適。
タイトルとURLをコピーしました