2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

現場で本当に使える!爆速マクロの作り方とコツ

Posted at

遅すぎて泣いた…私の残念マクロを爆速に改善した話

📌「処理遅すぎて絶望 → コード見直しで爆速化」という、誰もが通る道。

“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では以下のような工夫が高速化に貢献します:

  • .SelectActivate を排除する
  • Application.ScreenUpdating = False の活用
  • 大量データの処理は 配列で一括読み書き
  • 再計算が重ければ Calculation を一時オフ

「体感だけでなく、数値にもはっきり現れる効果」があるのが嬉しいですね!

5. ✏️ 学びと反省

今回の高速化チャレンジを通じて、たくさんの“反省ポイント”と“気づき”がありました。

🧠 学びメモ

  • .SelectActivate は極力使わない! → 処理が遅くなる最大要因
  • ScreenUpdating = False の破壊力 → これだけで体感かなり変わる
  • 配列での一括処理が最強 → ループ処理が減ってコードもスッキリ
  • 「ちょっとくらいなら…」の積み重ねがパフォーマンスを殺す

💡 書きやすさ vs 実行速度

可読性を優先して書きやすいコードにしていたけれど、業務で何度も使う処理なら “速さ”は正義
使いやすさと効率のバランスはいつも悩ましいけど、遅い=誰も使わなくなるので要注意だと学びました。


6. 🔚 おわりに

正直、最初は「マクロ書いたのに全然速くならない…」と凹みました。
でも、逆に「どこに無駄があるのか?」を考えるきっかけになり、結果としてマクロも、自分のVBA力もレベルアップできたと思います。

小さな改善の積み重ねが、マクロを“爆速”にする!

もしこの記事が、同じように悩む誰かの助けになればうれしいです。
ここまで読んでくださってありがとうございました!


2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?