生成AIに相談したら、エラー処理を見直すといいよ!とアドバイスを貰ったので、書き直してみました。
前回紹介したExcelマクロを高速化する設定をクラスモジュールにまとめると、様々なマクロで再利用(使い回す)できるようになります。

Excelマクロの高速化設定をまとめたクラス
クラスモジュールの実装は以下のようになります。ここでは仮にProcessControlをいう名前にしています。
Option Explicit
'***
'Process Control
'マクロの開始、終了、エラー発生時の処理を受け持つクラス
'***
'---
'事前処理
'マクロができるだけ速く動くように、計算の邪魔になる処理を止める
'---
Public Sub Class_Initialize()
With Application
.ScreenUpdating = False '画面描画停止
.Calculation = xlCalculationManual '自動計算停止
.EnableEvents = False 'イベント動作停止
.EnableCancelKey = xlErrorHandler 'Escキーでエラーストップする
.Cursor = xlWait 'カーソルを砂時計にする
End With
End Sub
'---
'事後処理
'---
Public Sub Class_Terminate()
With Application
.Cursor = xlDefault
.StatusBar = False
.EnableCancelKey = xlInterrupt
.EnableEvents = True
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
End Sub
'---
'エラー処理
'---
Public Sub ErrorProcess()
MsgBox "ERROR!" & vbCrLf & Err.Description, vbCritical, "エラー発生"
' 状態を元に戻す
With Application
.Cursor = xlDefault
.StatusBar = False
.EnableCancelKey = xlInterrupt
.EnableEvents = True
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
End Subクラスの使い方(呼び出し側)
クラスモジュールを使用する場合は、以下のように変数を宣言した後に、
Dim 変数名 As クラス名 Set 変数名 = New クラス名
と書くと、変数にクラス用のメモリ領域が割り当てられて、クラスに定義されている関数を使用できるようになります。
使い終わったら
Set 変数名 = Nothing
と書くと、変数に割り当てられたメモリ領域を開放することができます。
また、冒頭のProcessControlクラスでは、「Set 変数名 = New クラス名」が実行されると「Class_Initialize」関数が動きます。
更に、(「Set 変数名 = Nothing」と書かなくても)関数が終了する際には「Class_Terminate」関数が動きます。
なお、マクロ実行中に予期せぬエラーが発生した場合に備えて
On Error GoTo ラベル名 ラベル名:
と書くと、エラー発生時に「ラベル名:」以降の処理を実行します。
また、生成AI曰く、エラー発生時にClass_Terminateを呼ぶのは好ましくないそうで、ErrorProcessにてTerminateを呼ぶのと同等の処理を実行するように変更しました。
以上を踏まえて、ProcessControlクラスを使用するVBAのサンプルソースは以下のようになります。
Sub Main()
Dim PC As ProcessControl
'---
'開始処理
'---
On Error GoTo ErrorHandler
'---
'個別処理呼び出し
'---
Set PC = New ProcessControl
Call DoSomething
'---
'終了処理
'---
Exit Sub
'---
'エラー発生時
'---
ErrorHandler:
PC.ErrorProcess
End SubVBAのプロジェクトにインポートすると次のように表示されます。
画面の更新を止めるとVBAの処理速度は上がりますが、ユーザによっては「画面が動いていたほうが処理が進んでいることが感じられて安心」することもあるので、そのときはScreenUpdatingの有効/無効を切り替えて、処理の進み具合を見せるようにしてください。

今回はこの辺で。


コメント