2017-03-05 1 views
0

エラーが3回以上発生したときにコードを作りたいと思います。モジュールが一時停止します。VBAエラーの再発

ただし、以下のコードはエラーハンドラを永続的に実行し続けます。とにかくそれを修正するには?

Sub errorTestButton() 

Dim i As Long  

On Error GoTo errorhandler 
With Sheets("abc") 'there is no sheets abc, i made an error intentionally. 
End With 
MsgBox "no error" 
Exit Sub 

errorhandler: 
i = 0 
If i < 3 Then 
    i = i + 1 
    MsgBox "error" 
    Call errorTestButton 
Else 
    Exit Sub 
End If 

End Sub 
+2

コードがたくさん明確になる:あなたの特定のケースで


Option Explicit Dim i As Long '<--- define it outside your sub, in the Mofule level Sub errorTestButton() On Error GoTo errorhandler With Sheets("abc") 'there is no sheets abc, i made an error intentionally. End With MsgBox "no error" Exit Sub errorhandler: 'i = 0 '<-- this is where you are reseting it If i < 3 Then i = i + 1 MsgBox "error" errorTestButton Else Exit Sub End If End Sub 
、あなたは「クリーン」なアプローチで「トラップ」このエラーは、以下のコードを見ることができます。 – trincot

+0

@ pexpex223あなたは以下のいずれかの答えに疲れましたか?どんなフィードバック? –

+0

@ Shai Radoはい、以下のコードは私の問題を解決しました。どうもありがとうございます! – pexpex223

答えて

1

あなたiがローカルで、あなたは再実行されているので、あなたのiはあなたが0と1と決して間で立ち往生しているので、あなたは、errorhandler:に着くたびに、また3

0にリセットさに達しているが、 SubSubの外にiを定義すると、リセットされます(下のコードのように)。あなたはそれをインデントするとき

Option Explicit 

Sub errorTestSheetButton() 

Dim Sht As Worksheet 
Dim i As Long 

Start_Err_Loop: 
On Error Resume Next 
Set Sht = ThisWorkbook.Sheets("abc") 'there is no sheets abc, i made an error intentionally. 
If Sht Is Nothing Then 
    i = i + 1 
    If i > 3 Then 
     Exit Sub 
    Else 
     MsgBox "Error!" 
    End If 
    On Error GoTo 0 
    GoTo Start_Err_Loop 
End If 

End Sub 
0

あなたが右i < 3テスト前にゼロにiをリセットすると、そのテストは常にtrueになります。そのため、i = 0を削除してください。

errorTestButtonへのコールごとにエラーカウンタをリセットする場合は、変更で十分です。つまり、errorTestButtonを複数回呼び出すと、各呼び出しで3つのエラーメッセージが生成される可能性があります。

errorTestButtonを再度呼び出しても、3つ以上のエラーメッセージが表示されないようにするには、カウンタをグローバルにする場合は、iをグローバル変数として宣言する必要があります。また、その変数にわかりやすい名前を使用するとよいでしょう。

+1

ダウンボッターが問題の内容を説明できますか? – trincot

関連する問題