【VBA】マクロ処理を高速化する方法3つ!時間を測りながら実演!

f:id:yshgs_elec:20210413214604p:plain

この記事では、エクセル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】マクロの処理時間を計測する方法!記事中コードをコピーするだけ!

ひとまずこのコードの処理時間を測ってみましょう。

すると以下の結果が得られました。

f:id:yshgs_elec:20210413210230j:plain

この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

それではこのコードを実行してみましょう。

実行時間は以下の通りです。

f:id:yshgs_elec:20210413210524j:plain

先ほどのコードが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

実行してみましょう。

f:id:yshgs_elec:20210413212004j:plain

もともとの処理: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

以下がこのコードの実行時間です。

f:id:yshgs_elec:20210413213319j:plain

もともとのコードが12.6秒だったので、こちらもかなりの改善効果がありますね。

この手法は基本的にやらない理由がないので、コードを書きはじめる際は思考停止して

Application.ScreenUpdating = False

を記述するようにしておきましょう。

スポンサーリンク

おわりに

というわけで今回はマクロの処理時間を高速化する方法3つをご紹介しました。

ご覧いただいた通り、コードの書き方によって処理速度は何十倍にもなります。

ぜひ取り入れられる部分は普段のコーディングに取り入れていきましょう。

このように、私のブログではエクセルスキルはもちろん、様々なプログラミングスキルを紹介しています。

今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。

⇒興味をもった方は【ヒガサラ】で検索してみてください。

確実にスキルアップできるはずです。

 

最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。

↓ 応援ボタン

にほんブログ村 IT技術ブログ VBAへ
にほんブログ村

それではまた!

コメント

タイトルとURLをコピーしました