【エクセル/VBA速度改善】重い・遅いマクロの処理を確実に早くする方法

Excel/VBA

大量のデータを扱う為重い、ある日を境に急に重くなった等々…マクロあるあるですが、本記事の内容を適用する事で確実にスピードアップする事間違い無しなので、お困りな方は是非参考にして下さい!

スポンサーリンク

速度改善基本コード

マクロの実行速度を改善するに辺り、三種の神器とでも呼ぶべきコードが存在します。重いと感じるマクロにもし下記が記述されていないのなら今すぐに導入する事を強く推奨します!

Application.Calculation

セルの自動計算を抑制する為のコードです。 xlCalculationManualになっている間は例えどこかのセルの内容が変更されたとしても、付随する関数だったりの計算が行われ無い様になります。なので、シートにびっしり関数が埋められていてマクロの処理によりそこの値が変動してしまう場合等が特に効果を発揮します。
処理が終わったらxlCalculationAutomaticで自動計算(デフォルト)に戻します。

Application.ScreenUpdating

画面の更新を抑制する為のコードです。Falseで抑制されている間はFalseと設定した時の画面から更新がされません。色んなファイルを開いたり、シートを飛び回ったり、どんどん画面が変動するようなマクロの場合に特に効果大。処理が終わったらTrueで画面描画されるように戻します。

Application.EnableEvents

イベント検知を抑制する為のコードです。抑制されている間はイベントの検知がされません。セルに値を入力して、それをセルのChangeイベントで拾って~みたいなマクロの場合は機能しなくなるので注意。そういった処理が無いのならFalse推奨。処理が終わったらTrueで画面描画されるように戻します。

手っ取り早く改善を行いたい場合はこれら3つを入れるだけでも大分速度の改善がされる筈です。

更に改善したい!って場合は根本から修正を行う必要も出てくるので中々根気がいる場合が在りますが、特に初学者がやってしまいがちな遅延に繋がる書き方を次からご紹介していきます。

セルの直接操作を減らす

やってしまいがちな激重操作その①セルアクセスしまくりマクロ。

例えばこんなマクロがあったとします↓

Timer結果:2.5

セルの値をCells(nCnt, 1)で直接取得し、Cells(nCnt, 2)へ書き込む処理です。VBAではなるべくセル操作を減らす事が鉄則。アクセスが増えれば増える程に遅くなっていきます。

最初は早かったのに最近重くなってきた…みたいな時は結構これが原因の場合が多い印象。

なのでこうしてみる↓

Timer結果: 0.1640625

大分変りました。都度アクセスするのでは無く一括で範囲を配列へ取り込み、配列の中で操作や計算を行い一括で出力する方式です。つまりループの回数だけセルへアクセスしていたのがたったの2回だけに減る訳です。

その都度取得をしに行くような作りがあるのなら、一度で取得出来るように調整を行いましょう!

不要なSelectや処理を減らす

やってしまいがちな激重操作その②無駄な処理しすぎマクロ。

例えばこんなマクロがあったとします↓

Timer結果: 25.515625

激重です。VBA初学者に特に多いんですが、最初やりたい事が出来た時にマクロの記録を使って作る事があると思います。

で、別シートの値をコピーして別シートに張り付けるって操作を記録するとそれぞれのコードが記録される訳ですが、そのまま記載しないといけないと思い込みそれをずっと継承し続けてしまう。すると上の様なものが出来上がる訳です。

なのでこうしてみる↓

Timer結果: 0.2578125

これも大分変りました。Select等も先ほどのセルの直接操作を減らす編で出て来た様になるべく行わない方が吉な操作。このマクロで行うような操作ならいちいちSelectを行わなくても値は取って来れるので削除すべし。

セルへのアクセスに限らず不要な操作や省けるものはどんどん削ぎ落した方が当然実行速度はちりつもで向上します。が、視認性が悪くなる様なら本末転倒なので、単純に短くしまくれば良いってもんでも無いのでそこだけ注意が必要。

余計なコードを埋め込んでませんか?視認性が保たれる範囲で、不要なものはどんどん排除しましょう!

速度改善の極意

ここまでのスピードアップ術を纏めると、

速度向上の為に
  • 三種の神器を記述すべし(元に戻すのも忘れずに!)
  • セルの直接操作を極力減らしメモリ領域内で行うすべし
  • 不要なSelectや処理を減らすべし

これらを意識するだけで確実に速度向上に繋がります!しっかり守って良いExcelライフを~(ᵔᴥᵔ)

コメント