VBA高速化おまじない【サブモジュール】超絶楽々VBA処理を速くしよう

ExcelVBAの処理を簡単に速くするサブモジュールを紹介します。

VBA高速化のおまじないとして実行する方も多いと思います。

ですが、今回紹介するコードは
おまじないではなく、確実に処理が高速になる効果を実感できると思います。

紹介したコードをファイルに保存すれば、簡単に呼び出しが可能です。

サブモジュールにしてしまえば、関数のような感じで簡単に使用可能です。

VBAでサブモジュールを作って保存しておくことで、コードを覚えなくてよいというメリットがあります。

man riding bicycle on road during daytime

VBAの処理速度が遅くて困っている方は、ぜひ使用してください。

VBAの高速化をもっと詳しく知りたい方は、こちらをご覧ください。

◆サブモジュール紹介

・コード

Sub userSpeedUp(Op1 As Integer, Optional ScFlag As Integer, Optional EveFlag As Integer, Optional CalFlag As Integer)
'//////////////////////////////////////////////////////
'******************************************************
'■使用方法:call userSpeedUp(0) or call userSpeedUp(2,0,0,0)
'           ですべてFalse
'           call userSpeedUp(1) or call userSpeedUp(2,1,1,1)
'           ですべてTrue
'■処理内容:VBAの高速化
'■注意点  :特になし
'******************************************************
'Writer:JoVBA
'Created_Date:2023/09/19
'Change_Date ://
'//////////////////////////////////////////////////////
Select Case Op1
    Case 0
        Application.ScreenUpdating = False
        Application.EnableEvents = False
        Application.Calculation = xlCalculationManual
    Case 1
        Application.ScreenUpdating = True
        Application.EnableEvents = True
        Application.Calculation = xlCalculationAutomatic
    Case 2
        '●画面更新
        Application.ScreenUpdating = ScFlag
        
        '●シートイベント
        Application.EnableEvents = EveFlag
        
        '●再計算
        If CalFlag = 0 Then
            Application.Calculation = xlCalculationManual
        Else
            Application.Calculation = xlCalculationAutomatic
        End If
    Case Else
        MsgBox "エラーモジュール名 : userSpeedUp" _
            & vbCrLf & "エラー名称 : 引数範囲外[Op1]" _
            & vbCrLf & "[Op1] = " & Op1 _
            & vbCrLf & "" _
            & vbCrLf & "", vbCritical
        Stop
End Select
End Sub

上記のVBA高速化コードをコピーして、貼付けしてください。

VBAの処理が遅くなる多く原因である処理は、下記の3つです。

  • 画面更新
  • シートイベント
  • 再計算

この3つの処理を簡単にできるようにしたサブモジュールになります。

・使用方法(基礎編)

Sub userSpeedUp_TEST_1()

'高速化(すべてFalse)
Call userSpeedUp(0)

'~~~~~~
'### 処理 ###
'~~~~~~

'通常に戻す(すべてTrue)
Call userSpeedUp(1) '※処理の最後に必ず実行

End Sub

処理を高速化したいモジュールの処理の冒頭で「Call userSpeedUp(0)」を実行すれば、それ以降の処理を高速化することができます。

モジュールの最後に必ず、「Call userSpeedUp(1)」を実行してくださいね。

「Call userSpeedUp(0)」で再計算をしない設定にしているので
「Call userSpeedUp(1)」を実行しないとセル入力時に再計算が行われません。

・使用方法(応用編)

Sub userSpeedUp_TEST_2()

'個別に指定(0:False_1:True)
Call userSpeedUp(2, 0, 0, 0)
Call userSpeedUp(2, 1, 1, 1)

End Sub

「画面更新」と「シートイベント」と「再計算」の設定を個別に指定する事も可能です。

「Call userSpeedUp(2, 画面更新, シートイベント, 再計算)」というような感じで
それぞれの名前の所を「0」か「1」に置き換えてください。

「0」が「False」で無効となり、VBA高速化に繋がります。

「1」が「True」で有効となり、通常にするのでVBA高速化状態を終了します。

◆高速化の対象となる処理

今回、紹介するVBAコードで、高速化の対象になるのは、おおまかに下記になります。

  • ブックを開いたり、ブックやシートを「Active」をしているコード
  • セルの選択をしているコード
  • 不必要なシートイベントが発生しているコード
  • シート内で複数回計算させているコード

これらの処理であれば、上記のコードを使用すれば、かなりVBAの処理が速くなると思います。

それ以外は、恩恵はあるかもしれませんが微々たるものだと思います。

◆サブモジュールの保存と使用方法

サブモジュールを保存する方法とファイルを呼び出して使用する方法は
こちらの記事で紹介しています。*****

インポートがめんどくさい方は、Excelのアドインにすれば、インポートの手間が省けます。

こちらの記事をご覧ください。*****

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です