2017-08-02 19 views
0

マクロがあり、コードの一部が次のものに関係しています。 1)空のセルが含まれているかどうかを検出する - ある場合は値を入力してください 2)エラーが含まれているセル(N/Aなど)が含まれている場合には、値を入力してください。VBAコード実行中にエラー処理メソッドを変更する

列にエラー/空白セルがない場合、それらを検出する行に「実行時エラー1004細胞が見つかった」と述べた。

エラー処理を使用してGoToでこれをスキップします。

以下はコードです - 最初のエラー処理GoToは完全に動作しますが、2番目のエラー処理ではエラー処理が行われますが、動作していないようです。コメント付きコード:

On Error GoTo EErrorOne 


'depending on file I get, below line will generate error and code successfully skips to ErrorOne label 

Workbooks(nazwawb).Sheets(szitnr).Columns(ktorepole).SpecialCells (xlCellTypeBlanks) 

' code to be skipped 

    Workbooks(nazwawb).Sheets(szitnr).Columns(ktorepole).Select 
    Selection.SpecialCells(xlCellTypeBlanks).Select 
    Selection.Value = "Some Value" 

' end of code to be skipped 

EErrorOne: 

' successfully skipped error line by now. Below line should set a new Error handling procedure. 

On Error GoTo EErrorTwo 



Workbooks(nazwawb).Sheets(szitnr).Columns(ktorepole).Select 

' Below line generates an error but does not skip to EErrorTwo label as detailed in the current Error handling procedure 

Selection.SpecialCells(xlCellTypeFormulas, 16).Select 

' code to be skipped 


Selection.SpecialCells(xlCellTypeFormulas, 16).Select 
    Selection.Value = "Some Value" 

' end of code to be skipped 


EErrorTwo: 



' Below line should reset error handling procedure to normal for subsequent handling of other errors: 
On Error GoTo 0 

それは、そのエラー処理手順(後藤特定のラベル)ようだが無視され、代わりに、エラーメッセージがエラー処理は、私は2番目をスキップするにはどうすればよい後藤0にリセットされたかのように示されていますエラー?

+0

エラーハンドラに依存しないコードを作成する方がよいでしょう。代わりに、エラーの原因となっている状態を確認して、エラーが発生することがわかっているコードをスキップします。 – braX

+2

あなたのコードはあまりにも多くのことをしています。プロシージャごとに1つのハンドラ。エラーを処理する際に新しいエラーを処理することはできません。最初に最初のエラーを処理する*必要があります。 'On Error'はエラーハンドラの中では役に立たない*あなたは既にエラー状態になっています*、どうなるでしょうか? FWIWはすぐに[Rubberduck](http://rubberduckvba.com)の検査になります。 –

+0

braX、私は範囲に関係するセルを割り当てようとしましたが、rangenameが何もない場合に設定しましたが、それでもエラーメッセージに評価されました。マットのマグ、私はこれの専門家ではない、私は新たに開始する前にエラー処理を終了する必要があると思っていたが、私はOn Error GoTo 0がエラー処理をリセットすると思った - それはOn Error GoTo -1、私の質問に対する受け入れられた答えに指摘されているように。とにかく私はどこでエラー処理をリセットしませんでしたが、これは私の問題の解決策です。すべてありがとうございました – FilipB

答えて

2

内部エラー処理ルーチン、それは、そうです、あなたは以前に設定されたエラー・ルーチン(https://excelmacromastery.com/vba-error-handling/)クリアしない限り:

'... 
EErrorOne: 
On Error GoTo -1 'Clears error trap flag 
On Error GoTo EErrorTwo 'Reset error handling 
'... 

後の受け入れ編集:
ように議論されましたコメントでは、On Error GoTo -1はエラートラップフラグをクリアしますが、Err.Clearはエラーをクリアします。
以下のコードでは、2つのエラーを作成し、トラップしようとしています。

On Error Goto -1は、2番目のエラーがOn Error GoTo NextLabel行にトラップされ、エラーが発生したときにコードにジャンプします。
Err.Clearは最初のエラーを生き続けるので、2番目のエラーが発生すると、ラベルにジャンプするコードではなく、エラーメッセージが表示されます。

Sub ClearErr() 

    Dim x As Long 
    Dim y As Worksheet 

    'Jump to label when "Division by 0" occurs. 
    On Error GoTo ErrorLabel 

    x = 1/0 
    Debug.Print x 

ErrorLabel: 

    'On Error GoTo -1 'Next error is trapped. 
    Err.Clear 'Untrapped error on y=Worksheets(1) 

    'Jump to label when "Object Variable not set" occurs. 
    On Error GoTo NextLabel 

    y = Worksheets(1) 
    Debug.Print y.Name 

NextLabel: 

End Sub 
+0

'Err.Clear'はエラーもクリアします。 –

+0

@ DarrenBartrup-Cook 'Err.Clear'clearsエラーですが、エラートラップフラグをクリアしません!試してみてください。 –

+1

それはありませんか?私はそれを見なければならないでしょう。私はまだすべてのエラーを処理し、 'RESUME'を使うためにメインの手順から飛び越すことを勧めます。 –

5

エラーが発生したときにエラーをクリアしているわけではありません。エラーが発生したときに何が起きているのか疑問に思っています。

チップピアソンは、彼のサイト上で言うように:最初のエラーが発生するとERR1次の行 に実行転送は、

:.二 エラーが発生したときに、エラーハンドラは、まだアクティブであるため、2番目のエラーは、On Errorステートメント

によって捕捉され、Resumeステートメントが実行を再開するためにVBAを指示

を続行していませんコードの指定された ポイント。エラー処理 ブロックでのみ再開を使用できます。それ以外の使用はエラーの原因となります。さらに、再開は、 ブロックのエラー処理から抜け出すために、手順を終了する以外に唯一の 方法です。エラー処理ブロック のコード実行を指示するためにGotoステートメントを使用しないでください。そうすると、 エラーハンドラで奇妙な問題が発生します。 http://www.cpearson.com/excel/errorhandling.htm

理想的な方法は、最初の場所でのエラーを回避することである - それを開く前に、それを参照しようとする前にシートが、ブック内に存在チェック存在するワークブックをチェックし、エラーが外のジャンプを発生した場合ルーチンの本体、エラーを処理してから再びジャンプします。一例として、

:新しいエラー処理ルーチンが動作しません定義するかのように

Sub Test() 

    On Error GoTo ERR_HANDLE 

    '.... code .... 

FAST_EXIT: 
    'Code to tidy up, clear references etc before finishing. 

Exit Sub 

ERR_HANDLE: 
    Select Case Err.Number 
     Case 1004 
      'Code to resolve error 
      '. 
      '. 
      'Resume - clear error, jump back to line that caused it. 
      'Resume Next - clear error, jump to line after the one that caused error. 
      'Resume FAST_EXIT - clear error and go to line label. 

     Case 92 'Do something else to resolve error. 

     Case Else 
    End Select 

End Sub 
+2

Darrenの答えをさらに明確にするために、エラーハンドラはコードに明示的に指示がない限りアクティブです。標準的なエラー処理では、 'On Error GoTo SomeLineLabel:Labelの後のエラー処理コード:ResumeまたはResume Next'を使用します。最後のステートメントは、本質的にエラーをクリアするものです。 –

+0

@Brandonは言った。 _clearエラーでそれを取得しようとしていた、それを引き起こした行に戻ってください。それぞれのケースで_clear error_が重要であることを明示する必要がありました。 –

関連する問題