On Errorステートメントでエラーの処理をする
EXCEL VBAの基本コードを紹介しています。初心者の方が順番に読んでくだけでVBAの基礎コードが理解出来るようになればなと思って、短めの記事で進めて行きたいと思います!
今回は、”On Errorステートメントでエラーの処理”について紹介します!
エラー処理
次の図とコードを見てください。
Sub test()
' EXCELシートを取得する
Dim sheet As Worksheet
Set sheet = ThisWorkbook.ActiveSheet
'A2セル、B2セルの値を取得
Dim val_A2 As Long: val_A2 = sheet.Range("A2").Value
Dim val_B2 As Long: val_B2 = sheet.Range("B2").Value
'答えを入力するセルの取得
Dim ans_掛け算 As Range: Set ans_掛け算 = sheet.Range("B5")
Dim ans_割り算 As Range: Set ans_割り算 = sheet.Range("B6")
' こっから処理 **************
ans_掛け算 = val_A2 * val_B2 ' 掛け算
ans_割り算 = val_A2 / val_B2 ' 割り算
MsgBox "処理終了"
End Sub
A2セルとB2セルの値を取得して、B5セルとB6セルにそれぞれの答えを入力するプログラムです、
ちゃんと数値を入力すると、問題なく実行出来ます。
しかし、割り算は「0」で割るとエラーになります。
次のエラーで止まってしまいましたね(T_T)
このように、エラーが発生したとき、プログラムは停止して次の処理に進まなくなってしまいます。
VBAを分かっている人が実行した場合は、問題ないかもしれませんが、ただ使うだけの人が実行したときにエラーが起こったらどうしようもありません。
もちろんエラーが起こらないようにプログラムを組み立てていくのは大前提ですが、現実問題全てのエラーを想定してというのは難しいものです。
そのため、エラーが発生してもプログラムが止まってしまわないようにする必要があります。
On Errorステートメント
“On Errorステートメント”を使うことで、エラーを検知して、適切に処理することができるようになります。
処理の方法は3種類あります。
- On Error GoTo ラベル
- On Error Resume Next
- 1と2の組み合わせ
一つずつ紹介します。
On Error GoTo ラベル
GoToステートメントとの組み合わせですね。
エラーがあった場合、GoToで指定したラベルまで飛ぶ処理を行います。
※GoToについて紹介している記事はこちらです。
次のコードをご覧ください。
Sub test()
' EXCELシートを取得する
Dim sheet As Worksheet
Set sheet = ThisWorkbook.ActiveSheet
'A2セル、B2セルの値を取得
Dim val_A2 As Long: val_A2 = sheet.Range("A2").Value
Dim val_B2 As Long: val_B2 = sheet.Range("B2").Value
'答えを入力するセルの取得
Dim ans_掛け算 As Range: Set ans_掛け算 = sheet.Range("B5")
Dim ans_割り算 As Range: Set ans_割り算 = sheet.Range("B6")
' こっから処理 **************
On Error GoTo tobutookro '★★ここ★★
ans_掛け算 = val_A2 * val_B2 ' 掛け算
ans_割り算 = val_A2 / val_B2 ' 割り算
MsgBox "正常に終了"
Exit Sub '正常な場合はここで終わり
tobutookro: '★★エラーの時ここに飛びます★★
MsgBox "エラーが発生しました。"
End Sub
16行目以降でエラーが発生した場合、指定ラベルの「tobutokoro」まで処理が飛びます。
実際にどのように動くのか見てみましょう。まずはエラーにならない数値の場合です。
エラーは発生していないので、GoToで指定したラベルには進んでいません。
それでは、「0」で割ってエラーになる場合はどうでしょうか。
エラーが発生した段階で、GoToで指定したラベルに飛びました。
処理の流れを図で表すと次のようになります。
On Error Resume Next
この処理では、エラーがあっても停止せずに無視して次の処理にどんどん進みます。
次のコードを見てください。
Sub test()
' EXCELシートを取得する
Dim sheet As Worksheet
Set sheet = ThisWorkbook.ActiveSheet
'A2セル、B2セルの値を取得
Dim val_A2 As Long: val_A2 = sheet.Range("A2").Value
Dim val_B2 As Long: val_B2 = sheet.Range("B2").Value
'答えを入力するセルの取得
Dim ans_掛け算 As Range: Set ans_掛け算 = sheet.Range("B5")
Dim ans_割り算 As Range: Set ans_割り算 = sheet.Range("B6")
' こっから処理 **************
On Error Resume Next '★★ここ★★
ans_掛け算 = val_A2 * val_B2 ' 掛け算
ans_割り算 = val_A2 / val_B2 ' 割り算
MsgBox "処理完了"
End Sub
16行目に「On Error Resume Next」を入れています。どのような動きになるか確認しましょう。
動画のように、割り算のところでエラーが発生しているはずですが、何事もなかったかのように次の行に進んで入ることがわかります。
処理の流れは次の図のような形です。
GoToステートメントとResume Nextの組み合わせ
これは1と2を組み合わせた処理になります。
一旦、GoToで飛んでからの、Resume Nextでエラーのあった次の処理から続きを実行します。
コードで確認してみましょう。
割り算に続けて、足し算・引き算も追加しています。
Sub test()
' EXCELシートを取得する
Dim sheet As Worksheet
Set sheet = ThisWorkbook.ActiveSheet
'A2セル、B2セルの値を取得
Dim val_A2 As Long: val_A2 = sheet.Range("A2").Value
Dim val_B2 As Long: val_B2 = sheet.Range("B2").Value
'答えを入力するセルの取得
Dim ans_掛け算 As Range: Set ans_掛け算 = sheet.Range("B5")
Dim ans_割り算 As Range: Set ans_割り算 = sheet.Range("B6")
Dim ans_足し算 As Range: Set ans_足し算 = sheet.Range("B7")
Dim ans_引き算 As Range: Set ans_引き算 = sheet.Range("B8")
' こっから処理 **************
On Error GoTo tobutokoro '★★ここ★★
ans_掛け算 = val_A2 * val_B2 ' 掛け算
ans_割り算 = val_A2 / val_B2 ' 割り算
ans_足し算 = val_A2 + val_B2 ' 足し算
ans_引き算 = val_A2 - val_B2 ' 引き算
MsgBox "処理完了"
Exit Sub 'プログラムの終了
tobutokoro:
MsgBox "エラーが発生しています。"
Resume Next 'エラーが発生した次の行に戻る
End Sub
18行目に「On Error GoTo tobutokoro」でそれ以下エラーが発生した場合は、「tobutokoro:」ラベルまで飛びます。
今度は、「tobutokoro:」ラベルの処理に「Resume Next」を入れることで、エラーが発生した次の行に戻すことが出来ます。
動きを動画で確認しましょう。
流れを図で表します。
ループ処理など、エラーの場所も特定したいし、処理もそのまま続けて欲しいときなど便利につかえますね。
まとめ
On Errorステートメントを使ってのエラー処理について説明しました。ユーザーが使いやすいシステムを作るためにはエラー処理が欠かせません。しっかり使えるようになりましょう!
コメント