Excel VBA | 配列で高速に処理する例

VBA
スポンサーリンク

ここでは 初心者向けに「配列で高速処理」を“完全にかみ砕いて”説明 → コピペで動く実践マクロ → 応用版 の流れで紹介します。
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
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました