マクロ処理に時間がかかって困っている。何か改善する方法はないだろうか?
この記事では、こんな悩みを解決するためにエクセルVBAの処理速度を改善する方法を3つご紹介していきます。
実際に処理速度を測りながら、各改善策の効果を検証していきたいと思います。
ぜひあなたのマクロにも適用してみてください。
それでは早速やっていきます!
高速化対象のサンプルマクロ
マクロの高速化手法を検証していくにあたって、まずは高速化する対象がなければ話になりません。
というわけで今回は、以下のマクロを高速化していこうと思います。
Sub test1()
Dim i As Integer
For i = 1 To 500
If i Mod 2 = 1 Then
Sheets(1).Activate
Cells(i, 1) = i
Sheets(3).Activate
Else
Sheets(2).Activate
Cells(i, 1) = i
Sheets(3).Activate
End If
Next
End Sub
※あえて処理に時間がかかるように記述しています。
なお、マクロの処理時間は以下の記事に記載されている方法で計測しています。
気になる方は合わせてご覧ください。
【VBA】マクロの処理時間を計測する方法!記事中コードをコピーするだけ!
ひとまずこのコードの処理時間を測ってみましょう。
すると以下の結果が得られました。
この12.6秒という数値が、以降で紹介する3つの高速化手法によって、どのくらい短縮できるかを検証していきます。
それでは実際の高速化に移っていきましょう。
高速化手法①無駄な処理を削除する
Web上の記事をコピーして使用した場合などにありがちですが、実際の処理には関係のないコードが記述されていることは意外とあります。
(昔の私がそうでした。)
まずはそういった無駄な記述を徹底的に削除していきましょう。
先ほど紹介したサンプルコードでいうと、
Sheets(3).Activate
の部分がまさにそうです。
Sheets(1)とSheets(2)に数値を記述していくだけの処理なのに、Sheets(3)を毎回アクティブにする必要などありません。
というわけで、
Sheets(3).Activate
の部分を削除したコードは以下の通りです。
Sub test1()
Dim i As Integer
For i = 1 To 500
If i Mod 2 = 1 Then
Sheets(1).Activate
Cells(i, 1) = i
Else
Sheets(2).Activate
Cells(i, 1) = i
End If
Next
End Sub
それではこのコードを実行してみましょう。
実行時間は以下の通りです。
先ほどのコードが12.6秒だったので半分以下になっていますね。
今回はあえて重たい処理を無駄に書いていたのでこれほどまでの効果がでましたが、処理内容によってはそれほどの効果は出ない可能性はあります。
とはいえ、無駄な記述はないにこしたことはありませんので、ぜひあなたのコードを今一度確認してみましょう。
高速化手法②Ativate, Selectを極力しない
初心者にありがちなのですが、別シートのセルに数値を記述したりする際に、わざわざシート移動をしてから行っている人は多いです。
先ほど紹介したコードでいうと
◆Sheets(1).Activate
◆Sheets(2).Activate
の部分ですね。
このようなシート移動は無駄に処理を遅くしますので、極力避けましょう。
改善方法は以下の通りです。
◆シート移動ありの場合(悪い例)
Sheets(1).Activate
Cells(i,1)=i
◆シート移動なしの場合(良い例)
Worksheets(1).Cells(i, 1) = i
こうすればシートを移動する必要もありませんし、コードも1行短縮できます。
この方法を適用したサンプルコードは以下の通りです。
※先ほどの無駄な処理も省略しています。
Sub test1()
Dim i As Integer
For i = 1 To 500
If i Mod 2 = 1 Then
Worksheets(1).Cells(i, 1) = i
Else
Worksheets(2).Cells(i, 1) = i
End If
Next
End Sub
実行してみましょう。
もともとの処理:12.6秒
一つ目の無駄な記述削除:5.45秒
今回のシート移動の省略:0.12秒
かなりはやくなりましたね。
今回はActivateでしたが、Selectも多様しがちなので、極力しないように心がけましょう。
高速化手法③画面の更新を停止する
この手法は有名ですので、すでに適用している人も多いと思いますが、一番簡単で効果のあるものですので、ここでも紹介しておきましょう。
マクロ移動中にシートを移動したりすると、画面がチカチカ動いてしまいます。
そのような画面の更新によっても作業負荷がかかってしまいますので、 画面更新を停止しておくことでマクロ処理を高速化することが可能です。
やり方は非常に簡単。
コードの先頭に以下を付け加えるだけです。
Application.ScreenUpdating = False
先ほどまでの高速化でほぼ0秒まで短縮してしまっているので、今回はあえて一番最初の激遅コードで検証してみましょう。
実行コードは以下の通りです。
Sub test1()
Application.ScreenUpdating = False
Dim i As Integer
For i = 1 To 500
If i Mod 2 = 1 Then
Sheets(1).Activate
Cells(i, 1) = i
Sheets(3).Activate
Else
Sheets(2).Activate
Cells(i, 1) = i
Sheets(3).Activate
End If
Next
End Sub
以下がこのコードの実行時間です。
もともとのコードが12.6秒だったので、こちらもかなりの改善効果がありますね。
この手法は基本的にやらない理由がないので、コードを書きはじめる際は思考停止して
Application.ScreenUpdating = False
を記述するようにしておきましょう。
おわりに
というわけで今回はマクロの処理時間を高速化する方法3つをご紹介しました。
ご覧いただいた通り、コードの書き方によって処理速度は何十倍にもなります。
ぜひ取り入れられる部分は普段のコーディングに取り入れていきましょう。
このように、私のブログではエクセルスキルはもちろん、様々なプログラミングスキルを紹介しています。
今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。
確実にスキルアップできるはずです。
最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
それではまた!
コメント