编辑原来的代码有一个粗心的错误。感谢 user2426679 给我机会修复它。
原帖
使用GoTo Label 的代码对于理解和避免错误来说可能是一场噩梦。我知道GoTo Label 可能适用的唯一情况是致命错误退出,没有返回的意图。跳出错误并试图跳回去是很难正确的,当你在几个月后返回时很难理解。
您的代码中是否有多个语句会引发错误?如果是这样,错误处理程序如何知道它正在处理哪个错误?
我赞成:
On Error Resume Next ' Suspend normal error handling
Statement that might throw an error
On Error GoTo 0 ' Restore normal error handling
If Err.Number <> 0 then
' Code to handle error
End If
Err.Number 和Err.Description 的值将告诉错误是什么,并允许编写特定的错误处理代码。
有些人认为,从主代码中去除错误处理可以保持主代码的整洁。这个论点有一些优点。如果有几十个潜在错误,分析可能会变得复杂,并使正常路径难以隔离。但是,根据我的经验,这是非常不寻常的。也许,您有一个文件列表,其中一些可能无法打开。文件打开的原因有很多,但您的代码对它们无能为力。它所能做的就是显示Err.Description 并移动到下一个文件。
新文本和代码
除了代码中的错误之外,我现在认为我原来的帖子中没有任何内容不正确。但是,我认为原始帖子没有应有的完整。
如果您搜索“VBA Err.Number”,您会找到列出 VBA 错误处理代码的网站。由于这些网站来来去去,我不会推荐我最喜欢的。但是,我尝试生成错误以查看会发生什么。考虑这段代码:
Option Explicit
Sub DemoErrorHandling()
Dim ErrDesc As String
Dim ErrNum As Long
Dim FileNum As Long
Dim PathFile As Variant
FileNum = FreeFile
For Each PathFile In Array("", "X:", "C:\Program Files\Common Files\Intel\" & _
"WirelessCommon\libeay32.dll")
On Error Resume Next
Open PathFile For Input As FileNum
ErrNum = Err.Number
ErrDesc = Err.Description
Close FileNum
On Error GoTo 0
Debug.Print """" & PathFile & """ gives error:"
Debug.Print " A " & Err.Number & " " & Err.Description
Debug.Print " B " & ErrNum & " " & ErrDesc
Next
End Sub
在我的系统上,输出:
"" gives error:
A 0
B 75 Path/File access error
"X:" gives error:
A 0
B 76 Path not found
"C:\Program Files\Common Files\Intel\WirelessCommon\libeay32.dll" gives error:
A 0
B 0
注意,正如用户 2426679 指出的那样,On Error GoTo 0 已清除 Err.Number 和 Err.Description。只有将这些值保存在变量中,它们才能用于测试。请注意,尝试打开空文件名和不存在的光盘会产生不同的错误。
我的代码演示了您可以循环尝试不同的文件,直到一个文件成功打开。您可以一直向用户询问文件,直到打开时没有错误。