VBA高速化おまじない【サブモジュール】超絶楽々VBA処理を速くしよう
ExcelVBAの処理を簡単に速くするサブモジュールを紹介します。
VBA高速化のおまじないとして実行する方も多いと思います。
ですが、今回紹介するコードは
おまじないではなく、確実に処理が高速になる効果を実感できると思います。
紹介したコードをファイルに保存すれば、簡単に呼び出しが可能です。
サブモジュールにしてしまえば、関数のような感じで簡単に使用可能です。
VBAでサブモジュールを作って保存しておくことで、コードを覚えなくてよいというメリットがあります。
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のアドインにすれば、インポートの手間が省けます。
こちらの記事をご覧ください。*****