2017-06-19 9 views
3

VBAでは、使用しているスプレッドシートのバージョンを記録する簡単なスクリプトを作成しています。VBA + Excel + Try Catch

Private Sub Workbook_Open() 
    version = "1.0" 

    Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1") 
    URL = "<WEB SERVICE>" 

    objHTTP.Open "POST", URL, False 
    objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
    objHTTP.setRequestHeader "Content-type", "application/x-www-form-urlencoded" 
    objHTTP.send ("version=" + version) 
End Sub  

プロセス検索が見つかります。

ウェブキャストがオフラインの場合、実行時エラーを表示する代わりに、キャッチして抑制します。

VBAでキャッチしてエラーメッセージが表示されないようにするには、どのような方法が最適ですか?

+3

これはすべて[エラー処理](https://stackoverflow.com/documentation/vba/3211/error-handling#t=201706192005424139825)のドキュメントのトピックで説明しています。 –

+0

私は以下の回答を掲載しました。しかし、また、サイドノートとして。あなたのコードは、グローバル変数を使用しないでください。あるいは変数を宣言するのを忘れてしまった。 VBAを使用すると、使用変数を曖昧にすることはできますが、それを行うとメンテナンスが難しくなります。 コードの先頭にバージョン の直後に追加する 'dim URL as string' ' dim objHTTP as object' –

答えて

6
Private Sub Workbook_Open() 
    on error goto Oops 
    version = "1.0" 

    Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1") 
    URL = "<WEB SERVICE>" 

    objHTTP.Open "POST", URL, False 
    objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
    objHTTP.setRequestHeader "Content-type", "application/x-www-form-urlencoded" 
    objHTTP.send ("version=" + version) 
    exit sub 
Oops: 
    'handle error here 
End Sub 

あなたは、例えば、エラーのためにURLを変更したい場合、あなたは、また、この

Private Sub Workbook_Open() 
    on error goto Oops 
    version = "1.0" 

    Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1") 
    URL = "<WEB SERVICE>" 
Send: 
    objHTTP.Open "POST", URL, False 
    objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
    objHTTP.setRequestHeader "Content-type", "application/x-www-form-urlencoded" 
    objHTTP.send ("version=" + version) 
    exit sub 
Oops: 
    'handle error here 
    URL="new URL" 
    resume Send 'risk of endless loop if the new URL is also bad 
End Sub 

を行うことができ、あなたの気持ちが本当にキャッチー/しようとした場合、あなたはこのようにそれをエミュレートすることができます。

Private Sub Workbook_Open() 
    version = "1.0" 

    Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1") 
    URL = "<WEB SERVICE>" 
    on error resume next 'be very careful with this, it ignores all errors 
    objHTTP.Open "POST", URL, False 
    objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
    objHTTP.setRequestHeader "Content-type", "application/x-www-form-urlencoded" 
    objHTTP.send ("version=" + version) 
    if err <> 0 then 
     'not 0 means it errored, handle it here 
     err.clear 'keep in mind this doesn't reset the error handler, any code after this will still ignore errors 
    end if 
End Sub 

もそう

Private Sub Workbook_Open() 
    version = "1.0" 
    on error resume next 
    Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1") 
    if err <> 0 then 
     'unable to create object, give up 
     err.clear 
     exit sub 
    end if 
    URL = "<WEB SERVICE>" 
    objHTTP.Open "POST", URL, False 
    if err <> 0 then 
     'unable to open request, give up 
     err.clear 
     exit sub 
    end if 
    objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
    objHTTP.setRequestHeader "Content-type", "application/x-www-form-urlencoded" 
    objHTTP.send ("version=" + version) 
    if err <> 0 then 
     'unable to send request, give up 
     err.clear 
     exit sub 
    end if 
End Sub 

あなたはこの

をしましたので、もし、 on error gotoスタイルで発生したエラーを処理されないことは注目に値する...これは本当にハードコアであることを拡張します
private sub MakeError() 
    dim iTemp as integer 
    on error goto Oops 
    iTemp = 5/0 'divide by 0 error 
    exit sub 
Oops: 
    itemp = 4/0 'unhandled exception, divide by 0 error 
end sub 

未処理の例外が発生することがありますが、

private sub MakeError() 
    dim iTemp as integer 
    on error resume next 
    iTemp = 5/0 'divide by 0 error 
    if err <> 0 then 
     err.clear 
     iTemp = 4/0 'divide by 0 error, but still ignored 
     if err <> 0 then 
      'another error 
     end if 
    end if 
end sub 

VBAがすべて無視するため、例外は発生しません。

+0

ここで私の記憶を伸ばしていますが、エラー時に再度エラーが発生しないのでnoだと思います。そのため、エラーハンドラは実質的に無効になります。それは再び捕らえられないだろう。 –

+0

完全に間違っているわけではありませんが、「Resume」ステートメントがどのフォームでも呼び出されるとすぐに、エラー履歴はクリアされ、プロセスはすべて再開します。今度はレスポンスの新しい形で、resumeキーワードと潜在的な無限ループなしでは、それは+1です(しかし、Resumeというバージョンは除きます)。 –

+0

エラーハンドラに 'on error goto 0' を追加できたと思います。しかし、これは、gotoが毛むくじゃらしているとき、私たちが嫌いな理由の一つです。 –