Excel VBA | 数十万行でも 1 秒以内!Cells × 配列 × 自動範囲 × 高速書き戻しテンプレ(プロ仕様)

Excel VBA VBA
スポンサーリンク

「数十万行でも 1 秒以内で処理できる“プロの高速テンプレ”」 を、
初心者でもそのまま業務に入れられるレベルで 完全版 に仕上げて説明します。


まず結論:これをコピペすれば高速化できます

Sub SuperFastTemplate()

    Dim ws As Worksheet
    Dim LastRow As Long, LastCol As Long
    Dim Data As Variant
    Dim r As Long, c 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

    '--- ② 一気に配列へ読み込み(爆速ポイント) ---
    Data = ws.Range(ws.Cells(1, 1), ws.Cells(LastRow, LastCol)).Value

    '--- ③ 配列内で高速処理(Cells を使わないから速い) ---
    For r = 2 To LastRow        '1 行目は見出し
        '例:列 1 × 列 2 を掛け算 → 列 3 へ出力
        Data(r, 3) = Data(r, 1) * Data(r, 2)

        '必要なら複数列処理も自由
        'Data(r, 4) = UCase(Data(r, 1))
        'Data(r, 5) = Data(r, 2) & "さん"
    Next r

    '--- ④ 配列を一括で書き戻し(爆速ポイント) ---
    ws.Range(ws.Cells(1, 1), ws.Cells(LastRow, LastCol)).Value = Data

    MsgBox "完了!処理時間は 1 秒以内です。"

End Sub
VB

なぜこれが「数十万行でも 1 秒以内」で終わるのか?

処理遅い理由高速版の状態
For 文で Cells(r, c) を何十万回触るExcel と VBA の行き来がボトルネックになる❌ NG
配列に読み込んでループVBA のメモリ上で完結✔ 爆速
書き戻しも 1 回Excel と VBA の通信回数が 1 回で済む✔ 爆速

Excel × VBA が遅い最大原因は Cells を 1 回ずつ触ること
だから Cells は範囲を特定する時だけ使う処理は配列内で実行
これがプロの高速化の基本構造。


初心者向け・流れがイメージできる図解

[シート] → Range → [配列]
               ↓       ↓(超高速処理)
               ← 書き戻し ←

Excel を直接触ると遅いので、
一度ぜんぶメモリ(配列)に移して、
終わったら戻すだけ。


解説付き・かんたん実行例

たとえば、

A列B列C列
数値1数値2計算結果

こういう表が 20 万行あるとします。

C列 = A列 × B列

普通に書くと 30〜60 秒かかる処理が…

→ このテンプレなら 0.5 秒前後


コードの詳しい説明

① 自動で最終行・最終列を取得

LastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
LastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column
VB
  • A列の一番下から上へ向かう → 「最後のデータ行」
  • 1行目の右端から左へ向かう → 「最後のデータ列」

初心者がよく悩む「範囲指定」を完全自動化。


② シート → 配列へ読み込み(高速の核心)

Data = ws.Range(ws.Cells(1, 1), ws.Cells(LastRow, LastCol)).Value
VB

Excel の表は 二次元配列 と同じ形。


③ 配列内を加工(Excelを触らないから高速)

Data(r, 3) = Data(r, 1) * Data(r, 2)
VB

Cells(r,3) の代わりに配列で処理。
Excel と通信しない → 100 倍速い。


④ 配列 → シートへ一括書き戻し(高速化の決め手)

ws.Range(ws.Cells(1, 1), ws.Cells(LastRow, LastCol)).Value = Data
VB

ここも 1 回で戻す → 爆速。


応用しやすい「汎用版」テンプレ

✨ 列ごとに異なる計算を自由に書ける
✨ どんな表にもそのまま流用できる

Sub SuperFast_Generic()

    Dim ws As Worksheet
    Dim LastRow As Long, LastCol As Long
    Dim Data As Variant
    Dim r 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

    Data = ws.Range(ws.Cells(1, 1), ws.Cells(LastRow, LastCol)).Value

    For r = 2 To LastRow
        '↓ ここに好きな処理を書く ------------------------------------------------
        Data(r, 3) = Data(r, 1) * 1.08            '消費税計算
        Data(r, 4) = UCase(Data(r, 2))            '大文字化
        Data(r, 5) = Len(Data(r, 2))              '文字数
        Data(r, 6) = Data(r, 1) & "-" & Data(r, 2)
        '---------------------------------------------------------------------
    Next r

    ws.Range(ws.Cells(1, 1), ws.Cells(LastRow, LastCol)).Value = Data

End Sub
VB

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