遅すぎて泣いた…私の残念マクロを爆速に改善した話
📌「処理遅すぎて絶望 → コード見直しで爆速化」という、誰もが通る道。
“1件あたり数秒”。100件処理するだけでコーヒーを淹れて帰ってきてもまだ終わらない。
そんな悲しいマクロを作ってしまった僕が、「どこがボトルネックだったのか」「どう改善したのか」をまとめました。
1. 🧨 何がそんなに遅かったのか?
当初のコード構成:
- セルを1つずつループ処理
-
.Select
を頻繁に使用 - 処理のたびに画面更新されて点滅しまくり
今振り返ると、“ザ・非効率”なマクロでした。
2. 🔍 遅さの原因を特定する
VBAでステップ実行すると、明らかに遅かったのがコレ:
Range("A1").Select
Selection.Copy
Range("B1").Select
ActiveSheet.Paste
❗ 無駄ポイント
-
.SelectやSelectionで処理が分断され、無駄に時間がかかる
-
画面描画や再計算がその都度走る
3. ⚡ 爆速化のためにやったこと
処理速度アップのために、以下の4つを重点的に見直しました。
✅ 3.1 .Select
をやめて直接操作
遅さの原因のひとつは、毎回 .Select
してから操作していた点。以下のように 直接代入 に置き換えるだけで劇的に速くなります。
Before
Range("A1").Select
Selection.Copy
Range("B1").Select
ActiveSheet.Paste
After
Range("B1").Value = Range("A1").Value
✅ 3.2 画面更新を一時停止する
処理中に画面がピカピカ点滅していたら、ScreenUpdating を OFF にしてみましょう。
Application.ScreenUpdating = False
' 処理本体
Application.ScreenUpdating = True
これだけで“体感速度”が大きく改善します。
✅ 3.3 配列を使って一括処理する
大量のセルに対して1つずつ操作すると、それだけでループ地獄に。 配列に読み込んでまとめて処理・貼り付けすれば、爆速になります!
Dim data As Variant
data = Range("A1:A100").Value ' 一括読み込み
' 処理(必要があれば data を加工)
Range("B1:B100").Value = data ' 一括書き出し
✅ 3.4 計算処理を一時オフ(必要に応じて)
数式が多いシートでは、再計算がボトルネックになる場合も。 一時的にオフにすることで処理が軽くなります。
Application.Calculation = xlCalculationManual
' 処理本体
Application.Calculation = xlCalculationAutomatic
※ 処理後に自動計算を戻し忘れないよう注意!
これらを組み合わせることで、約5分 → 約10秒未満 に改善できました 🚀
4. 🧪 Before / After の速度比較
実際に処理速度がどれほど変わったのか、数値と体感の両面からまとめてみました。
📊 実行速度の比較
状況 | 所要時間 | 備考 |
---|---|---|
改善前 | 約5分(300件) |
.Select 多用、画面更新ON |
改善後 | 約10秒未満 | 配列処理、画面更新OFF |
💬 体感の違い
- ⏳ 改善前: 「進んでるのか不安になる」「待ち時間がつらい」
- 🚀 改善後: 「処理が一瞬すぎてびっくり」「逆に何かミスったかと思う速さ」
🧠 ワンポイント解説
VBAでは以下のような工夫が高速化に貢献します:
-
.Select
やActivate
を排除する -
Application.ScreenUpdating = False
の活用 - 大量データの処理は 配列で一括読み書き
- 再計算が重ければ
Calculation
を一時オフ
「体感だけでなく、数値にもはっきり現れる効果」があるのが嬉しいですね!
5. ✏️ 学びと反省
今回の高速化チャレンジを通じて、たくさんの“反省ポイント”と“気づき”がありました。
🧠 学びメモ
-
.Select
やActivate
は極力使わない! → 処理が遅くなる最大要因 -
ScreenUpdating = False
の破壊力 → これだけで体感かなり変わる - 配列での一括処理が最強 → ループ処理が減ってコードもスッキリ
- 「ちょっとくらいなら…」の積み重ねがパフォーマンスを殺す
💡 書きやすさ vs 実行速度
可読性を優先して書きやすいコードにしていたけれど、業務で何度も使う処理なら “速さ”は正義。
使いやすさと効率のバランスはいつも悩ましいけど、遅い=誰も使わなくなるので要注意だと学びました。
6. 🔚 おわりに
正直、最初は「マクロ書いたのに全然速くならない…」と凹みました。
でも、逆に「どこに無駄があるのか?」を考えるきっかけになり、結果としてマクロも、自分のVBA力もレベルアップできたと思います。
小さな改善の積み重ねが、マクロを“爆速”にする!
もしこの記事が、同じように悩む誰かの助けになればうれしいです。
ここまで読んでくださってありがとうございました!