« 2度目のエラーは捕えない | トップページ | 値によってセルを色分けする »

2011年8月 7日 (日)

エラーを無視してエラーを使う

エラーに対処する方法として
エラートラップを作るという方法があります。
これは、

On Error GoTo ErrHandle

などとしてエラーが起きたときに、
「ErrHandle」行ラベルに行き
エラーに対処するという方法です。

今回は
これを使わないでエラーに対処する方法です。

まず、エラーが起きてもそのまま次を実行する状態に
次のコードでします。

On Error Resume Next

このコードでエラーが起きても無視して次へ進みます。
「無視」するとデバッグモードになりません。

エラーが発生していない時はErr = 0 です。
逆にエラーが発生しているときはErr <> 0 になります。
これを利用してエラーが発生しているかいないかを判定します。

コードはこちら

エラーを無視してエラーを使うコード:

Sub macro110807a()
'エラーを無視してエラーを使う
   
    On Error Resume Next
        'エラーを起こす
        Err.Raise 1004
       
        'エラーが起きているかいないかを判定
        If Err <> 0 Then
            Debug.Print "エラー発生"
        End If
    On Error GoTo 0
   
End Sub

この構造を使って、
以前の記事『 2度目のエラーは捕えない 』 の中の
macro110806bと同じことをしてみます。

次のプロシージャは、
エラーを故意に引き起こしも問題なく
1から100までの数字を順番にA列に入れます。

コードはこちら

エラーを無視してエラーを使うコード2:

Sub macro110807b()
'エラーを無視してエラーを使う
   
    Dim i As Integer
   
Step100:
    If Cells(1, 1) = 100 Then
        Exit Sub
    Else
        i = Cells(1, 1) + 1
    End If
   
    On Error Resume Next
        For i = i To 100
            Rows(101).Delete
            Rows(1).Insert
            Cells(1, 1) = i
            If Rnd < 0.2 Then
                'エラーをある率で起こす
                Err.Raise 1004
            End If
            
            'エラーが起きているかいないかを判定
            If Err <> 0 Then
                Cells(1, 2) = "エラー発生"
                GoTo Step100
            End If
        Next i
    On Error GoTo 0
   
End Sub

「On Error GoTo ○○」を使って1回エラーになり
○○に飛んでから
GoToステートメントで戻ると、
2回目のエラーではデバッグモードになってしまいます。

一方、上のコードの中のIf文、

If Err <> 0 Then
    …
End If

この中でGoToステートメントを使って前に戻っても
デバッグモードにはなりません。
その代わりに永遠に続くことになりますので、
ある程度でストップする別の対処が必要です。

|

« 2度目のエラーは捕えない | トップページ | 値によってセルを色分けする »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: エラーを無視してエラーを使う:

« 2度目のエラーは捕えない | トップページ | 値によってセルを色分けする »