Excel VBA | 「大量データを高速で処理する実務テクニック(配列+書き戻し)

VBA
スポンサーリンク

ここでは 「大量データを高速で処理する実務テクニック(配列+書き戻し)」 を、
初心者でも理解できるように、図解レベルでかみ砕いて 解説します。


全体像:なぜ配列が高速なのか?

Excel での“遅さ”の正体は セルに 1 つずつアクセスすること

❌ 遅い方法(1セルずつ書く)

Cells(1,1)=…   ← Excel と通信
Cells(1,2)=…   ← Excel と通信
Cells(1,3)=…   ← Excel と通信
  …
10000回も通信!

✅ 速い方法(配列 → 一気に書き戻す)

arr(r,c)=…   ← Excelを一切触らない(超高速)
arr(r,c)=…

Range("A1").Resize(10000,5).Value = arr  ← 最後に1回だけ書く

Excelとの通信が “1万回 → 1回” に減るので爆速。


【基本形テンプレ】大量データを高速処理する 3ステップ

Step1:範囲を配列としてまとめて読み込む

Dim arr As Variant
arr = Range("A1:E10000").Value   ' ← これだけで 1回ですべて取得
VB
  • arr は 2次元配列になる
  • arr(1,1) が A1、arr(10000,5) が E10000
  • Excelへのアクセスは これで1回だけ

Step2:配列内で全ての計算・加工をする

Dim r As Long

For r = 1 To UBound(arr, 1)
    arr(r, 5) = arr(r, 2) * 2      ' 例:E列 = B列の2倍
Next r
VB
  • Excel を触っていないので、ここが 超高速
  • 10万行でもサクサク動く

Step3:加工後の配列を一気に書き戻す

Range("A1").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr
VB
  • 書き戻し回数は 1回だけ
  • 実務でのスピード改善効果は絶大

実務レベルのフルサンプル(超高速テンプレ)

「10万行のデータに、“売上=単価×数量” を作って書き戻す」例

(初心者でもそのまま使える)


Sub SuperFast_Example()

    Dim ws As Worksheet
    Set ws = Worksheets("Sheet1")

    Dim lastRow As Long
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row    ' A列の最終行
    
    '----- Step1:配列として読み込む -----
    Dim arr As Variant
    arr = ws.Range("A1:D" & lastRow).Value
    ' arr の構造(例)
    '   A列 = 商品名
    '   B列 = 単価
    '   C列 = 数量
    '   D列 = 売上(後で埋める)

    '----- Step2:配列内で高速処理 -----
    Dim i As Long
    For i = 2 To UBound(arr, 1)
        arr(i, 4) = arr(i, 2) * arr(i, 3)    ' 単価 × 数量 → 売上
    Next i

    '----- Step3:一気に書き戻す -----
    ws.Range("A1").Resize(UBound(arr, 1), UBound(arr, 2)).Value = arr

    MsgBox "完了!(配列で超高速処理)"

End Sub
VB

この処理が「1万件でも一瞬」の理由

動作回数速度
配列読み込み1回速い
配列内の計算(1万回)Excelと通信なし超高速
書き戻し1回速い

Excel と通信するのは最初と最後の 2回だけ だからです。


さらに高速化 ― 実務で必ず使う3つのテクニック

① ScreenUpdating を OFF(画面の描画を止める)

Application.ScreenUpdating = False
VB

画面がカクカクしなくなり、体感速度が上がります。

② Calculation を手動に(式の再計算を止める)

Application.Calculation = xlCalculationManual
VB

大量データのときは特に効果大。

③ EnableEvents を False(イベント発火を止める)

Application.EnableEvents = False
VB

Change イベントなどの無駄動作を防止できます。

この3つを安全に ON/OFF するテンプレ

Sub SafeFastStart()
    With Application
        .ScreenUpdating = False
        .Calculation = xlCalculationManual
        .EnableEvents = False
    End With
End Sub

Sub SafeFastEnd()
    With Application
        .ScreenUpdating = True
        .Calculation = xlCalculationAutomatic
        .EnableEvents = True
    End With
End Sub
VB

または
エラーが出ても元に戻すように On Error で囲むプロ方式もあります。

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