2016-04-23 12 views
1

私は、vba IDEがエラーで適切に壊れるのを許さないと信じています。On Error GoToはどのように使用しますか?

How do I break on errors?

ソリューション/回避策はOn Error GoTo ErrorHandlerまたは類似を使用するためのようだ:私はここで、実行時エラーを特定する方法についての質問をしました。私はその仕事をしようとしていますが、あまり成功していません。

Microsoft On Error GoToによれば、ランタイムエラーが発生した場合(https://msdn.microsoft.com/en-us/library/5hsw66as.aspx)、地域の指定されたコードに送信されます。私の経験に基づいて、それはすべての話ではありません。この問題は、そのソリューションを実際に動作させる方法に関するものです。

だから私は、以下の機能を持っている:

Function generateTimeseries() As Variant 

On Error GoTo ErrorHandler 

Dim currentArray As Range 

currentArray = Selection.Range ' this doesn't work - I don't care why 

generateTimeseries = currentArray.Rows 

Return 

ErrorHandler: 
    Debug.Assert False 
    Resume ' break here if you want to catch errors 

End Function 

この関数はErrorHandlerコードを入力することはありません。代わりに、Selection.Rangeになり、関数は単に#VALUEを返します。私は実際にはなぜこれが壊れているか気にしない、私はちょうどコードを手動でジャンプすることなく、私はそれが実際にその行に落ちたことを私に教えてIDEを得ることができる知りたい。

+0

次のとおりです。これを再現することはできません。私にとっては、ErrorHandlerコードを入力します。 2つのエラー:1. 'currentArray'はオブジェクトであるため、' Set'によって設定する必要があります: 'Set currentArray = Selection'。 2. 'Selection'は' Range'であるかもしれませんが、もしそうなら 'Range'メソッドはパラメータを必要とします。そして、この文脈では 'Return'は何をするでしょうか? –

+0

@AxelRichter問題が見つかりました。私の投稿された答えを見てください。 – arman

答えて

1

Iちょうどテストし、あなたのエラーハンドラが動作しますが、それは

Debug.Assert False 

に正しく破る - >デバッガオプションを確認してください。

しかし、アプリケーションをコンパイルしてそのようなエラーハンドラを忘れた場合、プロシージャでエラーが発生するとアプリケーションは無限ループに陥るため、これはvBAのエラーを処理する正しい方法ではありません。

ほとんどの場合、エラーが発生したことをユーザーに知らせるためにmsgboxを投げ、現在のプロシージャを終了する必要があります。これが当てはまらない唯一の状況は、エラーを引き起こす可能性があるものの、それを知って意図的にエラーを回避したいことがあるときです。まれな状況です。

私はAssertメソッドを使用したことがないし、これは、「この機能は、ErrorHandlerのコードを入力することはありません」私はすべての手順で私のエラーを処理する方法

Function generateTimeseries() As Variant 

    On Error GoTo ErrorHandler 

    Dim currentArray As Range 

    currentArray = Selection.Range ' this doesn't work - I don't care why 

    generateTimeseries = currentArray.Rows 

Exit_Function: 
     Exit Function 

ErrorHandler: 
     MsgBox Err.Description, vbCritical, "Error " & Err.Number 
     Resume Exit_Function ' breakpoint here if you want examine the code after error, otherwhise it terminates the function 
     Resume ' Once the code breaks on the above line, move to this instruction and F8 to return to the statement in error 

End Function 
+0

ありがとうございます。それは私が持っていたものよりはるかに優れています。その理由として、それはエラーで壊れませんでした。私の答えを見てください。これを答えとしてマークします。 – arman

0

すべてのエラーを中断する以前の試みで、この機能を "すべてのエラーで中断"する機能を有効にしました。

Tools->Options->Generalに移動し、Break on All ErrorsBreak on Unhandled Errorsに置き換えてこれを無効にしました。

Break on All Errorsは、「いくつかのエラーでブレークしますが、UDFエラーの場合はガベージを返します」というWindowsのことです。

+0

いいえ、すべてのエラーを中断することを意味しますが、セルから呼び出されたUDF **の未処理のエラー**は、ユーザーをVBEにスローするのではなく、単に#VALUEエラーとなります。 – Rory

+0

@Roryありがとう、私はこれを知らなかった。 – arman

関連する問題