2017-06-19 56 views
3

在VBA中,我正在做一個簡單的腳本來記錄正在使用的電子表格版本。VBA + Excel +試試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  

Process works find。

我試圖做一個嘗試趕上,所以如果Web主機脫機,而不是顯示運行時錯誤,我抓住它並壓制。

在VBA中嘗試catch的最佳方法是什麼,因此沒有顯示錯誤消息?

+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

這裏拉伸我的記憶,但我認爲這是一個否,因爲它不會再次通過on error命令。所以錯誤處理程序被有效地禁用。它會再次被捕獲。 –

+0

你並沒有完全錯誤,但只要以任何形式調用'Resume'語句,就會清除錯誤歷史記錄,並且整個過程都會重新開始。現在以新的形式回答,沒有resume關鍵字和潛在的無限循環,這是一個+1(不包括帶'Resume'的版本)。 –

+0

我想我們可以在錯誤處理程序中添加 '錯誤轉到0' '。但是,當goto變得毛茸茸的時候,這是我們討厭他們的原因之一。 –