この週末、クラスモジュールを使ってエラーが起きてしまった箇所がなるべく詳細に分かるような、かつそれが容易に取得できるような仕組みを考えていました。
で、出来上がったコードが↓こちら。そもそも何でこんなものを作ろうと思ったのかというと、
「結局はプログラムの中身を確認する必要はあるけど、ユーザーさんからマクロのエラー内容の報告を受け取った時点で、ある程度どのあたりでエラーになってしまっているのか分かっていた方が良いに決まっているよな」と最近思ってしまったから。
ま~そんなの当たり前っちゃ当たり前のことなのですが、それまでは自身のVBAスキルが足りなくてあきらめていたところがあって。
でも散々修行を重ねた今だったら-。と、いうことで作ってみたのですが、即興で作った割には比較的良い感じにできました(^^)。早速今後は、業務で作成するマクロにコイツを実装していこうと思います。
'クラス名:ErrorTrapClass
'予期せぬエラーをトラップするためのクラス
'on error goto~を設定するメインプロシージャのあるモジュールの宣言セクション部分に→を記述する。 public ETC as new ErrorTrapClass
'on error goto~のジャンプ先に→を記述する。 ETC.ErrorMessage
'呼び出す各プロシージャの先頭に→を記述する。 ETC.GetErrorProc "モジュール名", "プロシージャ名"
Option Explicit
Private mwb As Workbook
Private ErrModule As String
Private ErrProc As String
'このクラスの実態が生成されると同時にコンストラクタで各プロパティの値を初期化
Private Sub Class_Initialize()
Set mwb = ThisWorkbook
ErrModule = ""
ErrProc = ""
End Sub
'このクラスの実態が破棄されると同時に所持していたプロパティの値も破棄
Private Sub Class_Terminate()
ErrModule = ""
ErrProc = ""
End Sub
'エラー箇所の該当モジュール、プロシージャを取得
Public Sub GetErrorProc(ByVal Mdle As String, ByVal Proc As String)
ErrModule = Mdle
ErrProc = Proc
End Sub
'表示するエラーメッセージ
Public Sub ErrorMessage()
Const ProcMaster As String = "きうっち"
MsgBox "プログラム中に予期せぬエラーが発生してしまいました。作成者にお問い合わせください。" & vbCrLf _
& "また" & mwb.Name & "以外のEXCELファイルが開いていたら、一度閉じてから再度このマクロを実行するようにしてください。" & vbCrLf & vbCrLf _
& "■エラー箇所" & vbCrLf _
& "モジュール:" & ErrModule & vbCrLf _
& "プロシージャ:" & ErrProc & vbCrLf & vbCrLf _
& "その他情報" & vbCrLf _
& "エラー番号:" & Err.Number & vbCrLf _
& "エラー内容" & Err.Description & vbCrLf _
& "作成者:" & ProcMaster, vbCritical
Application.StatusBar = False
Application.ScreenUpdating = True
End Sub
で、出来上がったコードが↓こちら。そもそも何でこんなものを作ろうと思ったのかというと、
「結局はプログラムの中身を確認する必要はあるけど、ユーザーさんからマクロのエラー内容の報告を受け取った時点で、ある程度どのあたりでエラーになってしまっているのか分かっていた方が良いに決まっているよな」と最近思ってしまったから。
ま~そんなの当たり前っちゃ当たり前のことなのですが、それまでは自身のVBAスキルが足りなくてあきらめていたところがあって。
でも散々修行を重ねた今だったら-。と、いうことで作ってみたのですが、即興で作った割には比較的良い感じにできました(^^)。早速今後は、業務で作成するマクロにコイツを実装していこうと思います。
'クラス名:ErrorTrapClass
'予期せぬエラーをトラップするためのクラス
'on error goto~を設定するメインプロシージャのあるモジュールの宣言セクション部分に→を記述する。 public ETC as new ErrorTrapClass
'on error goto~のジャンプ先に→を記述する。 ETC.ErrorMessage
'呼び出す各プロシージャの先頭に→を記述する。 ETC.GetErrorProc "モジュール名", "プロシージャ名"
Option Explicit
Private mwb As Workbook
Private ErrModule As String
Private ErrProc As String
'このクラスの実態が生成されると同時にコンストラクタで各プロパティの値を初期化
Private Sub Class_Initialize()
Set mwb = ThisWorkbook
ErrModule = ""
ErrProc = ""
End Sub
'このクラスの実態が破棄されると同時に所持していたプロパティの値も破棄
Private Sub Class_Terminate()
ErrModule = ""
ErrProc = ""
End Sub
'エラー箇所の該当モジュール、プロシージャを取得
Public Sub GetErrorProc(ByVal Mdle As String, ByVal Proc As String)
ErrModule = Mdle
ErrProc = Proc
End Sub
'表示するエラーメッセージ
Public Sub ErrorMessage()
Const ProcMaster As String = "きうっち"
MsgBox "プログラム中に予期せぬエラーが発生してしまいました。作成者にお問い合わせください。" & vbCrLf _
& "また" & mwb.Name & "以外のEXCELファイルが開いていたら、一度閉じてから再度このマクロを実行するようにしてください。" & vbCrLf & vbCrLf _
& "■エラー箇所" & vbCrLf _
& "モジュール:" & ErrModule & vbCrLf _
& "プロシージャ:" & ErrProc & vbCrLf & vbCrLf _
& "その他情報" & vbCrLf _
& "エラー番号:" & Err.Number & vbCrLf _
& "エラー内容" & Err.Description & vbCrLf _
& "作成者:" & ProcMaster, vbCritical
Application.StatusBar = False
Application.ScreenUpdating = True
End Sub