ここでは 初心者向けに「配列で高速処理」を“完全にかみ砕いて”説明 → コピペで動く実践マクロ → 応用版 の流れで紹介します。
Excel の大量データ(数千〜数十万行)でも 一瞬で終わる 激速パターン。
まず「なぜ配列だと速いのか?」
Excel VBA が遅い理由は セルを1つずつ読む/書く時のやり取りが重い から。
例:
For i = 1 To 100000
Cells(i, 1).Value = Cells(i, 1).Value * 2
Next
VBこの書き方は
- 10万回も Excel と通信
- なので めちゃ遅い (数秒〜数十秒)
配列を使うとどうなる?
1回でデータ全体を まとめて読み込む
↓
メモリ上の配列(超高速)で処理
↓
1回でまとめて 書き戻す
だから 10万行でも1秒以内 が当たり前。
配列高速処理の基本テンプレ
これだけ覚えればOK!
Dim v As Variant
v = Range("A1").CurrentRegion.Value '① まとめて読み込み
'② 配列をループして高速処理
Dim i As Long
For i = 2 To UBound(v, 1)
v(i, 1) = v(i, 1) * 2 '例:A列を2倍にする
Next
Range("A1").Resize(UBound(v, 1), UBound(v, 2)).Value = v '③ まとめて書き戻し
VB例題①:A列の数値をすべて2倍にする高速マクロ
特徴
- 途中に空白があっても OK
- 10万行でも一瞬
- 初心者でも理解しやすい構造
Sub FastDoubleA()
Dim ws As Worksheet
Dim v As Variant
Dim i As Long
Set ws = ActiveSheet
'--- 1) データ全体を配列に読み込む(CurrentRegion)
v = ws.Range("A1").CurrentRegion.Value
'--- 2) 配列で処理(超高速)
For i = 2 To UBound(v, 1) '1行目はヘッダと想定
If IsNumeric(v(i, 1)) Then
v(i, 1) = v(i, 1) * 2
End If
Next i
'--- 3) 一括書き戻し
ws.Range("A1").Resize(UBound(v, 1), UBound(v, 2)).Value = v
MsgBox "処理完了!"
End Sub
VB例題②:シート全体の最終行・最終列を自動検出して高速処理
やること
- 最終行/最終列を End で取得
- その範囲を配列で高速処理
- 行数が毎回変わっても壊れない
Sub FastProcessAutoRange()
Dim ws As Worksheet
Dim lastRow As Long, lastCol As Long
Dim v As Variant
Dim i As Long
Set ws = ActiveSheet
'--- 最終行・最終列を取得
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
'--- 配列に読み込み
v = ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol)).Value
'--- 配列で高速処理(ここ書き換え自由)
For i = 2 To UBound(v, 1)
'例:列1を2倍、列2を"!"追加
If IsNumeric(v(i, 1)) Then v(i, 1) = v(i, 1) * 2
v(i, 2) = v(i, 2) & "!"
Next
'--- 一括書き戻し
ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol)).Value = v
MsgBox "完了!"
End Sub
VB例題③:大量データ × Dictionary の最強高速パターン
(重複チェック・集計・マスタ結合なんでもできる!)
Sub FastUniqueCount()
Dim ws As Worksheet
Dim v As Variant
Dim dict As Object
Dim i As Long
Dim key As Variant
Set ws = ActiveSheet
Set dict = CreateObject("Scripting.Dictionary")
'--- A列を配列に読み込み
v = ws.Range("A1").CurrentRegion.Value
'--- 重複チェック+カウント
For i = 2 To UBound(v, 1)
key = v(i, 1)
If key <> "" Then
dict(key) = dict(key) + 1
End If
Next
'--- 結果を書き出す
ws.Range("C1").Value = "値"
ws.Range("D1").Value = "件数"
Dim r As Long: r = 2
For Each key In dict.Keys
ws.Cells(r, 3).Value = key
ws.Cells(r, 4).Value = dict(key)
r = r + 1
Next
MsgBox "完了!(" & dict.Count & "種類)"
End Sub
VB▼これでできること
- 重複排除
- 集計
- グルーピング
- マスタ結合の準備
- 大量データでも爆速
「配列 × End × 自動範囲」最強の実務テンプレ(完成版)
どんなデータでも動く万能型テンプレ
- 最終行・最終列の自動取得
- 配列で高速処理
- 結果を一括書き戻し
- 何万行でも1秒以内
Sub SuperFastTemplate()
Dim ws As Worksheet
Dim lastRow As Long, lastCol As Long
Dim v As Variant
Dim i As Long, j As Long
Set ws = ActiveSheet
'--- 最終行・最終列
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
'--- 配列に読み込み
v = ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol)).Value
'--- ▼▼▼ ここに好きな処理を書く ▼▼▼
For i = 2 To UBound(v, 1) '行
For j = 1 To UBound(v, 2) '列
'例:全てのセルの末尾に「※」を追加
v(i, j) = v(i, j) & "※"
Next j
Next i
'--- ▲▲▲ 自由に編集できる ▲▲▲
'--- 一括書き戻し
ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, lastCol)).Value = v
MsgBox "超高速処理 完了!"
End Sub
VBここまでのまとめ
| 処理方法 | 速度 | 向いている場面 |
|---|---|---|
| 1セルずつループ | 遅い | 小規模データ |
| 配列で処理 | 爆速 | 大量データ・定期処理 |
| 配列 × Dictionary | 最強 | 重複排除・集計・JOIN |

