100万行の読み込み構造(実務向け高速処理)
Excelでは「100万行」規模のデータを扱うこともあります。セルを1つずつ読み込むと処理が極端に遅くなるため、配列に一括読み込み → 配列内で処理 → 一括書き戻し の構造を使うのが鉄則です。初心者向けに、コード例とテンプレートをかみ砕いて説明します。
基本の考え方
- Rangeを一括で配列に読み込む
→v = Range("A1:C1000000").Value
→ 二次元配列に一瞬で取り込める。 - 配列内で処理する
→ ループや条件分岐でまとめて変更。 - 結果を一括で書き戻す
→Range("A1:C1000000").Value = v - 画面更新や計算を止める
→Application.ScreenUpdating = Falseなどでさらに高速化。
テンプレ1:100万行を一括読み込み・書き戻し
Sub ReadWrite_1M()
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:C1000000")
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 ' C列=数量を2倍
Next r
rg.Value = v
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub
VB- ポイント:
- 100万行でも数秒程度で処理可能。
- 画面更新・再計算を止めるのが高速化のコツ。
テンプレ2:条件付き一括変換(100以上なら「大」)
Sub ReadWrite_Condition_1M()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim rg As Range: Set rg = ws.Range("C2:C1000000") ' 数量列
Dim v As Variant: v = rg.Value
Dim r As Long
For r = 1 To UBound(v, 1)
If v(r, 1) >= 100 Then
v(r, 1) = "大"
Else
v(r, 1) = "小"
End If
Next r
rg.Value = v
End Sub
VB- ポイント: 条件判定も配列内でまとめて処理。
テンプレ3:集計(合計・平均)
Sub ReadWrite_SumAvg_1M()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim rg As Range: Set rg = ws.Range("C2:C1000000") ' 数量列
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- ポイント: 100万行でも配列なら高速に集計可能。
テンプレ4:検索をDictionaryで高速化
Sub ReadWrite_SearchDict_1M()
Dim ws As Worksheet: Set ws = Worksheets("Data")
Dim rg As Range: Set rg = ws.Range("A2:B1000000") ' 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 = "C500000"
If dict.Exists(key) Then
MsgBox "コード " & key & " の商品名は " & dict(key)
Else
MsgBox "該当なし"
End If
End Sub
VB- ポイント: 100万件でも検索が一瞬。
例題で練習
'例1:数量列を2倍にして書き戻す
Sub Example1()
ReadWrite_1M
End Sub
'例2:数量列を条件付きで「大」「小」に変換
Sub Example2()
ReadWrite_Condition_1M
End Sub
'例3:数量列の合計と平均を計算
Sub Example3()
ReadWrite_SumAvg_1M
End Sub
'例4:コード検索をDictionaryで高速化
Sub Example4()
ReadWrite_SearchDict_1M
End Sub
VB初心者向けポイント
- セル直操作は絶対NG: 100万行では処理が終わらない。
- 必ず配列に読み込む:
Range.Valueを配列に取り込む。 - 一括書き戻しが鉄則:
Range.Value = 配列で一瞬。 - 画面更新を止める:
ScreenUpdating=Falseでさらに高速化。 - 検索はDictionary: 巨大データでも即検索可能。
- 集計や変換も配列で: 実務の定型処理に最適。
👉 この「100万行の読み込み構造テンプレ」をベースにすれば、売上データの集計や顧客コード検索など、実務でよくある大量データ処理を高速にこなせます。
