2017-06-19 127 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变得毛茸茸的时候,这是我们讨厌他们的原因之一。 –