Excel VBA 逆引き集 | 巨大配列の高速化

Excel VBA
スポンサーリンク

巨大配列の高速化

Excel VBAで数万〜数十万行のデータを扱うとき、巨大配列をどう効率的に処理するか が重要です。初心者向けに、コード例とテンプレートをかみ砕いて説明します。


基本の考え方

  • セルを1つずつ読むのは遅いCells(i,j).Value を繰り返すと極端に遅くなる。
  • Rangeを一括で配列に読み込むv = Range("A1:C100000").Value で一瞬。
  • 配列内で処理 → 計算や検索は配列上で行う。
  • 結果も一括で書き戻すRange.Resize(...).Value = 配列 で高速。
  • 不要な画面更新を止めるApplication.ScreenUpdating = False でさらに高速化。

テンプレ1:巨大配列を一括読み込み

Sub HugeArray_Read()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("A2:C100000") ' 10万行
    Dim v As Variant

    v = rg.Value ' 一括で二次元配列に読み込み

    Debug.Print "行数=" & UBound(v, 1), "列数=" & UBound(v, 2)
End Sub
VB
  • ポイント: 10万行でも一瞬で読み込める。

テンプレ2:配列内で集計(数量合計)

Sub HugeArray_Sum()
    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 sumQty As Double, r As Long
    For r = 1 To UBound(v, 1)
        sumQty = sumQty + v(r, 3) ' C列=数量
    Next r

    MsgBox "数量合計 = " & sumQty
End Sub
VB
  • ポイント: セルを直接読むより数十倍速い。

テンプレ3:結果を一括書き戻し

Sub HugeArray_WriteBack()
    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
End Sub
VB
  • ポイント: 10万行でも一瞬で書き戻せる。

テンプレ4:画面更新・計算を止めて高速化

Sub HugeArray_FastProcess()
    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) + 10
    Next r

    rg.Value = v

    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
End Sub
VB
  • ポイント:
    • ScreenUpdating = False → 画面描画を止める。
    • Calculation = Manual → 再計算を止める。
    • EnableEvents = False → イベント処理を止める。
      → 巨大データ処理がさらに速くなる。

テンプレ5:巨大配列をDictionaryで検索高速化

Sub HugeArray_SearchDict()
    Dim ws As Worksheet: Set ws = Worksheets("Data")
    Dim rg As Range: Set rg = ws.Range("A2:B100000") ' 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 = "C50000"
    If dict.Exists(key) Then
        MsgBox "コード " & key & " の商品名は " & dict(key)
    Else
        MsgBox "該当なし"
    End If
End Sub
VB
  • ポイント: 巨大配列でも検索が一瞬。

例題で練習

'例1:10万行を一括読み込み
Sub Example_Read()
    HugeArray_Read
End Sub

'例2:数量合計を計算
Sub Example_Sum()
    HugeArray_Sum
End Sub

'例3:数量を2倍にして書き戻す
Sub Example_WriteBack()
    HugeArray_WriteBack
End Sub

'例4:画面更新を止めて高速処理
Sub Example_Fast()
    HugeArray_FastProcess
End Sub

'例5:Dictionaryで高速検索
Sub Example_Search()
    HugeArray_SearchDict
End Sub
VB

初心者向けポイント

  • セル直読みはNG: 巨大データでは極端に遅い。
  • 配列一括処理が必須: 読み込み・加工・書き戻しを配列で。
  • 画面更新を止める: ScreenUpdating=False でさらに高速化。
  • 検索はDictionary: 巨大配列でも即検索可能。
  • 元データは壊さない: 結果は別シートに出力すると安心。
タイトルとURLをコピーしました