こんにちは、Ryoです。
エラー処理ルーチンで使用するResumeステートメントを活用すると、エラーが発生した行から再度処理を実行することができますので、今回はインプットボックスへの入力エラーを例としたサンプルで使用方法について書いていこうと思います。
1.サンプル概要
先ず、数値入力を促すインプットボックスを表示します。
数値を入力した場合、メッセージボックスで入力された値を表示する簡易的なものです。
先程のインプットボックスに数値以外を入力するとエラーとなり、メッセージを表示します。
メッセージ表示後OKをクリックすると、エラーが発生した箇所に戻して再処理を行うのでインプットボックスが表示されるというものです。
「キャンセルボタン」や右上の「×」ボタンをクリックした場合はキャンセル処理として無条件で終了するようにしています。
以上がサンプル概要になります。
2.サンプルコード
Sub Sample1() 'データ型をLongとしているので数値以外はエラー Dim Num As Long 'エラーが発生した場合、ErrJmpラベルに移行 On Error GoTo ErrJmp 'インプットボックスを表示、入力された値をNumに代入 Num = InputBox("数値を入力してください") '入力された値が数値であればメッセージボックス表示 MsgBox "入力された値:「 " & Num & " 」です。" '処理終了 Exit Sub ErrJmp: 'インプットボックスの「キャンセル」、「×」が '押された際の処理 If Num = 0 Then Exit Sub 'エラー=数値以外入力でのメッセージ表示 MsgBox "数値以外が入力されました", vbCritical 'エラーが発生した箇所に戻り、処理を再開する Resume End Sub
エラー処理として判定させるので、変数NumをLong型として数値以外はエラーとなるようにしています。
On Error Goto ErrJmpでエラー処理を開始し、エラーが発生したら「ErrJmp」ラベルに処理が移行する形になります。
入力された値が数値であればメッセージ表示して終了しますが、数値以外であればエラーとなりErrJmpラベルに移行、キャンセル処理と警告メッセージ表示を経てResumeステートメントによりエラーが発生した箇所のInputBox関数の処理まで戻ります。
構文:Resume[line]
このResumeステートメントはエラー処理ルーチンで使用するもので、このルーチン内でエラーが発生した行から再度プログラムを実行するものです。
下に示すようにエラー発生により指定ラベルに処理を移行、Resumeステートメントによってエラー発生行に戻るので、再度インプットボックスが表示されるということになっています。
3.まとめ
エラー処理としてResumeステートメントを使用した再処理は何かと便利なので活用する頻度も高く、私もよく利用します。
但し、ラベルを用いて処理を移行させる方法を乱用(多用)しすぎると後々自分のコードが難解な状態になって自身に苦しめられることにもなりかねないので注意が必要とも思います。
うまく扱えばとても有用なので、機会があればぜひご活用ください。
以上、エラーが発生した箇所に戻って処理を再開する方法についてでした!今回の記事が何かの参考になれば幸いです。
Ryo