素人VBA備忘録第5回です。
例によって個人的な備忘録ですが、もしかしたら役に立つかもしれないので公開しています。
Contents
速くなるはずのマクロがやたら重い。なぜ?
大体の方の方にとってExcelVBAを始めるきっかけというのは、「手作業がめんどくさい」とか「重くなってきたから速くしたい」とか「機械に任せてヒューマンエラーを減らしたい」とかだと思います。
私もそんな感じでした。
そんな中で、私のような初心者がたまに出くわす「特に複雑なことをしていないのにマクロがやたら重くなる」という現象の原因と解決策についていくつか書いていきます。
所詮素人のメモ帳なので気軽に読んでください。
原因1:ループしっぱなしだといつまで経っても終わらない。
Do 文の終了失敗はいくら待っても終わらないのですぐ気づくとは思います。
ループの終了条件を満たさない限り終わらないので、マクロを走らせたときの終了条件がきちんと満たされているかを確認しましょう。
具体的には、
- Do Until 文の終了条件を満たすセルがちゃんとあるか。
- Do While 文の継続条件式を満たさないセルがちゃんとあるか。
- For 文の最終数値がバカでかい数になっていないか。
などです。
For 文は終わらないということはありませんが、終了数値が大きすぎると無駄に時間はかかります。
スポンサーリンク
原因2:過程を表示させると描画で遅くなる。
これは多分Excel VBA を始めたら初期段階で知ることではありますが一応。
Excel VBA はデフォルトだとマクロの過程をExcelで描画します。
描画自体は高速ですがやはり過程が増えると描画で結構な時間を食ってしまいます。
ですので描画をオフにする命令をマクロの最初に記述すればあっさり解決します。
Application.ScreenUpdating = False
これを入れることでExcelの画面更新を描画せずに結果だけを表示してくれるようになります。
なお私は食らったことはありませんが、描画オフにしっぱなしだと最終結果も出てこない場合があるらしいので、マクロの最後には画面更新をオンに戻しておいたほうがいいそうです。
Application.ScreenUpdating = True
マクロを書くときには最初に上の2つを入れ込んでしまう癖をつけておくといいかもしれません。
原因3:セルに数式を入れるとその自動計算で遅くなる。
ゼロから作ってすべてをマクロでやるExcelファイルではセルに数式を入れることはあまりないかもしれません。
しかし旧来VBAを使わず関数だけで使っていたExcelファイルにマクロを足して使うときなど、元からあった数式を流用したり新たにマクロで数式を入れ込むことなどもあるかもしれません。
Excelではセルに数式が入ったり、セルの値が変わったら勝手に計算します。
そのため次の命令に移る前に計算する時間を必要とするので、数式が多ければ多いほど時間を食うことになります。
表などを流用してSUMやVLOOKUPなどを多用したファイルなどでは、ほんとに自動かと思うくらいたっぷりと時間を消費してくれます。
しかしよく出来たもので、この自動計算をオフにするプログラムもちゃんと存在します。
Application.Calculation = xlCalculationManual
これを最初に入れておくと、セルの値が変わったときなどの自動計算を止めてくれます。
しかしやはりこのままではExcelの自動計算が止まりっぱなしになるので、マクロの最後には自動計算を再開する命令を書いておきましょう。
Application.Calculation = xlCalculationAutomatic
これでExcelは元通り自動計算をしてくれるようになります。
身に覚えがないのにやたらマクロが重いときのまとめ。
- いつまで経っても終わらないときはループ絡みの式が間違っている可能性大。
- Excelの描画をオフにしよう。
- Excelの自動計算機能をオフにしよう。
- 不具合が出るといけないのでマクロが終わったらオンに戻そう。
私が今のところ派手に引っかかったのはこんなところです。
この先引っかかった案件が出てきたら追記していこうかなと考えています。
せっかくマクロを勉強するのですからなるべくサクサク動いてほしいでしょうし、思い原因は早めに潰していきたいものですね。
以上です!