Excel VBA高速化テクニック完全ガイド

「マクロを実行したあと、画面が固まって動かない…」「数千行のデータ処理に数分かかる…」そんな悩みはありませんか?
Excel VBAの処理が遅い原因の9割は、コードの書き方にあります。実は、ほんの数行の書き換えや、VBA特有の「高速化ルール」を知るだけで、処理時間は1/10以下にまで短縮可能です。
今回は、初心者から脱却し、爆速マクロを手に入れるためのテクニックを、初級から応用までステップバイステップで解説します。
1. なぜVBAは遅くなるのか? 主な原因とボトルネック
VBAの処理速度を低下させる最大の要因は、「Excelシート(セル)へのアクセス」です。
VBAが1つのセルの値を読み書きするたびに、Excelは画面を書き換え、関連する数式を再計算しようとします。この「Excelというアプリケーションとのやり取り」の回数が増えるほど、オーバーヘッドが積み重なり、処理が重くなるのです。
2. 【初級】1行追加するだけで速くなる「おまじない」
まずは、処理の前後に入れるだけで劇的な効果を発揮する3つの設定です。これだけで、描画や再計算による無駄な負荷をカットできます。
Sub FastMacro_Basic()
' 1. 画面更新を停止(描画の負荷をなくす)
Application.ScreenUpdating = False
' 2. 自動計算を手動に切り替え(数式の再計算を止める)
Application.Calculation = xlCalculationManual
' 3. イベント発生を停止(Worksheet_Change等の連鎖を防ぐ)
Application.EnableEvents = False
' --- ここにメインの処理を書く ---
' 最後に設定を必ず元に戻す
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
3. 【中級】「Select」と「Activate」を今すぐ捨てる
マクロの記録機能を使うと、コードに Select や Activate が多用されます。しかし、VBAはセルを選択しなくても操作が可能です。
- 悪い例(遅い):
Sheets("Data").Select→Range("A1").Select→ActiveCell.Value = "OK" - 良い例(速い):
Sheets("Data").Range("A1").Value = "OK"
「選択する」という動作はPCのリソースを激しく消費します。オブジェクトを直接指定する書き方に変えるだけで、コードはスッキリし、速度も向上します。
4. 【上級】爆速の鍵「配列」でセルへのアクセスを最小化する
1万行を超えるような大量データを扱うなら、「配列(Array)」は避けて通れません。セルを1つずつループで回すのではなく、範囲を丸ごとメモリ(配列)に読み込んで処理します。
| 手法 | イメージ | 速度感 |
|---|---|---|
| セルを1つずつループ | バケツ1杯ずつ水を運ぶ | 亀速 |
| 配列で一括処理 | 太いホースで一気に流し込む | 爆速 |
配列を使った高速化のコード例
Sub FastArrayProcessing()
Dim dataArray As Variant
Dim i As Long
' A1:A10000の範囲を一括で配列(メモリ)に格納
dataArray = Range("A1:A10000").Value
' メモリ内で高速ループ処理
For i = 1 To UBound(dataArray, 1)
dataArray(i, 1) = dataArray(i, 1) * 1.1 ' 10%増しにする例
Next i
' 結果をシートへ一括書き出し(これが速い!)
Range("A1:A10000").Value = dataArray
End Sub
5. 【お悩み解決】フリーズ回避・メモリ不足・大量データの壁
「コードは合っているはずなのに、実行するとExcelが『応答なし』になる」といったトラブルの回避策です。
? 「応答なし(フリーズ)」を防ぐ DoEvents
ループ処理が長すぎると、Windowsが「このソフトは固まっている」と誤認します。これを防ぐのが DoEvents 関数です。
For i = 1 To 100000
' 1000回ごとに一度、制御をOSに返す
If i Mod 1000 = 0 Then DoEvents
' 処理...
Next i
? メモリ不足(Out of Memory)を回避する
大量のオブジェクトを扱う際は、使い終わった変数に Set Nothing を代入してメモリを明示的に解放しましょう。また、コピペを繰り返す際は Application.CutCopyMode = False を挟んでクリップボードを空に保つのが鉄則です。
6. 処理時間を計測して効果を可視化しよう
どれくらい速くなったか、数値で確認することがモチベーションに繋がります。
Dim startTime As Double
startTime = Timer
' --- 実行したい処理 ---
MsgBox "処理時間は " & Format(Timer - startTime, "0.00") & " 秒でした"
まとめ:速くて安定したマクロを目指して
VBA高速化の本質は、「Excelとの通信回数を減らし、メモリの中で完結させること」にあります。
- まずは「画面更新停止」などのおまじないを入れる
- 「Select」をコードから排除する
- 大量データは「配列」で一括処理する
この3ステップを意識するだけで、あなたのマクロは劇的に生まれ変わります。ぜひ、今日から自分のコードに取り入れてみてください!

