我遇到了一个较低级别的 UDF 将错误踢到最高级别子例程的错误处理的问题。我想我可以用 On Error GoTo -1
来解决这个问题,但问题仍然存在。
根据微软的说法,“如果没有 On Error GoTo -1
语句,则在退出过程时会自动禁用异常”( https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/on-error-statement )。这是否意味着当我调用较低级别的子例程时,我正在“退出”一个过程并取消 On Error GoTo -1
陈述?
例如,这是一个子程序,它获取一个 excel 文档并将其与 jpg 图像组合成一个 pdf。 jpg 图像需要按文件名结尾的数字排序(即 Photomics0)。有时,文件名的末尾没有数字。我希望这会导致应该发生的正常错误。
最高级别的子程序具有以下错误处理:
Sub Example()
Do While t = 1
On Error GoTo errorMSG1
Set wb2 = Workbooks(Copyrange)
On Error GoTo -1
'
' more code here & call to other subroutines
'
Exit Sub
Loop
errorMSG1:
On Error GoTo -1
'
' Code that notifies user that they don't have the excel document open in
' background and opens it for them
'
End Sub
最低级别的 UDF(向下 3 级)遇到代码错误:
retvalint = CLng(retval)
由于
retval
应该是 jpg 文件名末尾的数字。没有号码retval
为空并引发错误,导致代码跳转到 errorMSG1
,我不希望它这样做。我还应该说,当我试图捕获的原始错误没有发生时,总是会发生这种情况。我还没有测试过当原始错误确实发生时是否会发生这种情况。
我试过扔
On Error GoTo -1
在我的子程序和函数的各个级别中绝对无处不在,但无济于事。另外,顺便说一句,这是让错误“冒泡”的例子吗?
编辑:
我还应该说我之前尝试过使用
On Error GoTo 0
,但更高级别的子有一个大的Do Loop
在里面。我注意到,当我试图捕获的原始错误发生在 >=2 迭代时,它会吐出原始的 Runtime Error
错误。
最佳答案
我不理解这方面的文档,但我从测试中弄清楚了。On Error GoTo 0
停止使用当前的错误处理程序。On Error GoTo -1
清除当前错误。
这是一个例子:
Sub OnErrorTest()
On Error GoTo myErrHnd
Err.Raise 42
myErrorSub
On Error GoTo 0
Err.Raise 44
Exit Sub
myErrHnd:
Debug.Print ("Error: " & Err.Number)
Debug.Print ("Description: " & Err.Description & vbNewLine)
Resume Next
End Sub
Sub myErrorSub()
On Error GoTo myOtherErrHnd
Workbooks("").Close
Exit Sub
myOtherErrHnd:
On Error GoTo -1 ' aka Err.Clear
End Sub
因此,要解决您遇到的问题,您似乎需要在设置工作簿后切换到 On Error GoTo 0。通常,如果在它们的任何父函数中设置了错误处理程序,错误就会冒泡。
关于vba - 高级和低级过程之间的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58468061/