VBAの例外処理の話。
JavaやC#とかだと、Try-CatchのCatchの中でのエラーについては、Catch内にさらにTry-Catchを入れるという手法を取ると思うのだけれど、VBAになると、少々めんどくさい。いやかなりめんどくさい話になる。
ブイサバ【Excel VBAサバイバル】~とりあえずここに来れば解決できる~『VBA|エラー処理を2回目以降も処理できる方法』
この記事でいくと、VBAの例外処理(On Error文)で気をつけておかなければならないことがあるようだが、
端的に言えば、下の2つのことを考慮するとよいということになる。
- エラー処理中のエラーはトラップされないヨ
- とはいえ、Resumeステートメントで、仕切り直しできるんだよ
というので実践編。
Sub Sample1 On Error Goto ErrLabel1 *** エラー発生(1) *** Exit Sub ErrLabel1: MsgBox "No." & Err.Number & Err.Description , "Error" Resume ErrLabel2 '←←←←ココで仕切り直し!! ErrLabel2: On Error Resume Next *** エラー発生(2) *** End Sub
まずは「On Error Goto ErrLabel1」で例外処理へスキップする処理を入れる。
エラー発生(1)の箇所でエラーが発生すると、ErrLabel1ラベルに飛ぶ。
エラーを表示させた後の「Resume ErrLabel2」というところが仕切り直しの箇所。
なので、Errをウォッチすると、「Resume ErrLabel2」の箇所ではエラーNoが設定されているが、ErrLabel2ラベル下の「On Error Resume Next」の行になると、エラーはクリアされている。
よって、ErrLabel2以降で、再度トラップ可能なOn Error文を指定してあげればよい。
(ここではResume
Nextにしているので、エラーがあると次行へ進むようになっている)
因みに、こういうことをやらずにErr.Clearとかしてみたらどうなるのか試したのだが、これだと2つ目のエラーはトラップされなかった。
んじゃぁ、Resumeじゃなくて、Gotoだったら?とやってみたが、この場合はErrにそのままエラー情報が残った状態で、ErrLabel2に飛んでいた。
なので、「Resume ラベル名」
面倒だがこういう手を使わなければならない。