1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【VBA】わたしのベストプラクティス:エラートラップ編

Last updated at Posted at 2024-12-16

VBAのエラートラップ、なにがいい形なのかいまいち定まっていなかったのですが、今のところ自分の行き着いた方法です

VBAでも、クラス設計をしっかりめにして書くのがマイブームです

エラーが発生したときにかんがえたいことは

  • ログへエラー情報を出力したい
  • フォーム上にエラーメッセージを表示したい
  • エラー情報をメール通知したい
    などです。

そのほかには

  • エラーがどこで発生したのか?エラーの発生場所(クラスやメソッド)を知りたい。
  • どの経路で呼び出した結果、エラーが発生したの?
    などです。

こんな感じで書くことに決めています。

  • クラス内のエラートラップは、全て呼び出し元へスローしてしまう
  • Erra.RaiseのSouceに、Err.Souce & ">" & "クラス名.メソッド名"を入れてスローする

呼び出し元

private mc_MODNAME="MAIN"

pubilc sub Yobidasimoto()
    const cnsPROCNAME="Yobidasimoto"
    dim modProcName as string
    modProcName=mc_MODNAME & "." & cnsPROCNAME

on Error Goto ERR_SECTION
    
    dim hogehoge as hogehogeClass
    set hogehoge = new hogehogeClass
    call hogehoge.Init

ERR_SECTION:
    'ログ出力

    'メール通知処理呼び出したり
    'ここにメール送信処理呼び出しメソッド(割愛します)
    
    'エラーメッセージ表示したり
    Msgbox(Err.Description)
    
end sub

クラスモジュール

public sub Init(av_filePath as string)
    const cnsPROCNAME="Yobidasimoto"
    dim modProcName as string
    modProcName=mc_MODNAME & "." & cnsPROCNAME

on Error Goto ERR_SECTION

    'なにかの処理
    'なにかの処理
    'なにかの処理
    'なにかの処理
    'なにかの処理
    'なにかの処理

ERR_SECTION:
    if Err.Number<>0 then
        call Err.Raise(Err.Number , Err.Souce & ">" & modProcName , Err.Description)
    end if

end sub

ログ出力に関しては、なにが一番良いものか決めきれていないところもあるのですが

  • グローバル変数使いたくない
  • 依存性を極力排除したい
    ので、、

クラスの中からログ出力イベント発生させて、呼び出し元でイベントキャッチしてログ出力するようにしてたりします。
また別の記事で書いてみます。
(これがいいのかわからない、、)

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?