VBAでプログラミングをしていると、処理速度が遅いと感じる瞬間が出てきます。
ググってみると、たくさんの解決方法が紹介されているのですが、私が一番効果的だと思うとりあえず簡単にできる改善方法を伝授します。
もう探すの面倒だし、答え教えてくれーーという方はまずはこのコードの追加を試してみてください。
とにかく簡単に処理速度を向上させるコード
コードの最初と最後に以下のコードを追加しましょう!
二種類のコードで速度改善を図ります。
Sub 速度改善() Application.ScreenUpdating = False Application.Calculation = xlManual ' メインの処理 Application.ScreenUpdating = True Application.Calculation = xlAutomatic End Sub
処理改善コードの解説
ScreenUpdatingは 画面描画を停止するコマンドです。3行目で画面描画を停止し、8行目で再開しています。
この画面描画とは、VBAのコードを実行したときに、Excelのシート状のセルをコピーしたりすれば、エクセルファイル内での修正の過程が目視で確認できると思います。あれが画面描画です。
もっと具体的に例を出すと、エクセルでのプログラミングでは、シートの操作をすることが多いです。
例えば、「セルA2を指定する」などの場合に、いちいちSelectをしているといった場合には、プログラムを実行した際に律儀にその選択する処理まで目に見えていることが分かりますよね。あれのことです。
こちとら、自動実行で改善をするつもりなのに、わざわざ描画することで処理をおそくするのはナンセンスです。3・8行目のコードで改善しちゃいましょう。
もう一つ、4行目のCaluculationは、計算処理を自動でさせるかさせないか?です。エクセルの設定でいうと、以下の画面のことですね。
こちらも具体的に説明すると、プログラムを実行する前に、手動に変更し、プログラムを終了する前に自動に戻すというコードです。
このコードを追加して改善になる典型的なケースは、「シート内にものすごい複雑な関数を入力している」「ユーザ定義関数(Functionプロシージャを使っている)」などです。身に覚えのある方は、改善の一手になるかもしれません。
処理の時間数を計測する方法
具体的に処理が速くなったのかを確かめるためには、プログラムを実行した時刻と完了した時刻の差分を取ることで計測することが可能です。
サンプルコードは以下です。イミディエイトウィンドウにループイテレータの数を出力するコードです。
Sub 処理時間計測() Dim startTime, stopTime, processTime As Variant startTime = Time For i = 1 To 1000000 Debug.Print i Next stopTime = Time processTime = stopTime - startTime If Minute(processTime) < 1 Then MsgBox Second(processTime) & "秒" Else MsgBox Minute(processTime) & "分" & Second(processTime) & "秒" End If startTime = stopTime End Sub
1,000,000回のループの前後で開始時刻と終了時刻を取得して、時間を計測しています。
ちなみに、1分55秒で終了しました。
処理速度を把握する際にぜひ使ってみてください。
さいごに
ほんとは、オブジェクト使わずに操作するだとか、配列を使った方が良いとかたくさんあるんでしょうが、まずはこのコード追加を試していただければと思います。
ScreenUpdatingは知っている人も多いと思いますが、Caluculationを止めることも改善になるというのはあまり知られていないかもしれませんね。
特に人事やってると、関数でゴリゴリ計算しているという方をよく見るので、そんなファイルの改善のためにVBAを用いる場合は特に効果的だと思います。
ではまた。