[解決済み] VBAのエラー処理に適したパターンにはどのようなものがありますか?
2023-07-09 04:50:05
質問
VBAのエラー処理について、良いパターンを教えてください。
特に、このような場合はどうしたらいいのでしょうか。
... some code ...
... some code where an error might occur ...
... some code ...
... some other code where a different error might occur ...
... some other code ...
... some code that must always be run (like a finally block) ...
両方のエラーを処理し、エラーが発生する可能性のあるコードの後で実行を再開したいです。また、最後にあるfinallyのコードは必ず 常に を実行する必要があります - 以前にどんな例外が投げられたかに関係なく。どうすればこの結果を達成できるでしょうか?
どのように解決するのですか?
VBAのエラー処理
-
On Error Goto
ErrorHandlerLabel -
Resume
(Next
| ErrorHandlerLabel ) -
On Error Goto 0
(現在のエラーハンドラを無効にする) -
Err
オブジェクト
は
Err
オブジェクトのプロパティは通常、エラー処理ルーチンの中でゼロまたは長さゼロの文字列にリセットされますが、明示的に
Err.Clear
.
エラー処理ルーチンのエラーは終了しています。
ユーザーエラーの場合、513-65535の範囲が使用可能です。
カスタムクラスのエラーの場合は
vbObjectError
をエラー番号に追加します。
については、Microsoft のドキュメントを参照してください。
Err.Raise
と
エラー番号のリスト
.
で実装されていないインターフェースのメンバについては
派生した
クラスでは、定数
E_NOTIMPL = &H80004001
.
Option Explicit
Sub HandleError()
Dim a As Integer
On Error GoTo errMyErrorHandler
a = 7 / 0
On Error GoTo 0
Debug.Print "This line won't be executed."
DoCleanUp:
a = 0
Exit Sub
errMyErrorHandler:
MsgBox Err.Description, _
vbExclamation + vbOKCancel, _
"Error: " & CStr(Err.Number)
Resume DoCleanUp
End Sub
Sub RaiseAndHandleError()
On Error GoTo errMyErrorHandler
' The range 513-65535 is available for user errors.
' For class errors, you add vbObjectError to the error number.
Err.Raise vbObjectError + 513, "Module1::Test()", "My custom error."
On Error GoTo 0
Debug.Print "This line will be executed."
Exit Sub
errMyErrorHandler:
MsgBox Err.Description, _
vbExclamation + vbOKCancel, _
"Error: " & CStr(Err.Number)
Err.Clear
Resume Next
End Sub
Sub FailInErrorHandler()
Dim a As Integer
On Error GoTo errMyErrorHandler
a = 7 / 0
On Error GoTo 0
Debug.Print "This line won't be executed."
DoCleanUp:
a = 0
Exit Sub
errMyErrorHandler:
a = 7 / 0 ' <== Terminating error!
MsgBox Err.Description, _
vbExclamation + vbOKCancel, _
"Error: " & CStr(Err.Number)
Resume DoCleanUp
End Sub
Sub DontDoThis()
' Any error will go unnoticed!
On Error Resume Next
' Some complex code that fails here.
End Sub
Sub DoThisIfYouMust()
On Error Resume Next
' Some code that can fail but you don't care.
On Error GoTo 0
' More code here
End Sub
関連
-
[解決済み] Javaにおける例外処理によるパフォーマンスへの影響とは?
-
[解決済み】WPFアプリケーションで例外をグローバルにキャッチする?
-
[解決済み】Exceptionを投げるとき、どの部分が高価なのですか?
-
[解決済み] Javaでfinallyブロックから復帰する
-
[解決済み] Excel VBAで整数を文字列に変換するにはどうすればよいですか?
-
[解決済み] VBAでSetというキーワードは実際に何をするのですか?[重複しています]
-
[解決済み] VBAのハッシュテーブル/連想配列
-
[解決済み] VBAでコンストラクタに引数を渡す
-
[解決済み] エラー 3340 クエリ実行時にクエリ ' ' が破損している DoCmd.RunSQL
-
[解決済み] オプションの引数が与えられているかどうかをテストするにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
vlookup関数の使用でExcelのvba
-
[解決済み] VBAで変数の宣言と代入を同時に行うことはできますか?
-
[解決済み] Excel VBAで整数を文字列に変換するにはどうすればよいですか?
-
[解決済み] VBAでSetというキーワードは実際に何をするのですか?[重複しています]
-
[解決済み] Microsoft Office VBAの編集時に、ポップアップの「コンパイルエラー」メッセージを無効にするにはどうすればよいですか?
-
[解決済み] VBA - 条件付きで for ループの反復をスキップする方法
-
[解決済み] VBAのハッシュテーブル/連想配列
-
[解決済み] VBAでコンストラクタに引数を渡す
-
[解決済み] 文字列が文字列で始まるかどうかをテストしますか?
-
[解決済み] エラー 3340 クエリ実行時にクエリ ' ' が破損している DoCmd.RunSQL