这是一个XY问题,但我发现它本身很奇怪。
以下是我作为搜索日期解决方案的一部分编写的一些代码:
...
Dim Short_Date As Date
Dim Long_Date As Date
Dim Not_A_Short_Date As Boolean
Dim Not_A_Long_Date As Boolean
Not_A_Short_Date = False
Not_A_Long_Date = False
On Error GoTo Short_Date_Error
Short_Date = CDate(Format(Find_What, "Short Date"))
GoTo Long_Date
Short_Date_Error:
Not_A_Short_Date = True
Long_Date:
On Error GoTo Long_Date_Error
Dim Temp
Temp = Format(Find_What, "Long Date")
Long_Date = CDate(Format(Find_What, "Long Date"))
GoTo Date_Find
Long_Date_Error:
Not_A_Long_Date = True
Date_Find:
...
我发现VBA运行时在Long_Date = CDate(格式(Find_What,“Long Date”))行引发了一个错误,指出类型不匹配。果然,Find_What被传递的东西完全没有约会。幸运的是,这正是我想要抓住的错误。
但是当我单步执行时,我发现运行时从Short_Date = CDate(格式(Find_What,“短日期”))跳转到Short_Date_Error而没有给我错误窗口,而几乎相同的代码(只是带有“Long”)日期“而不是”短日期“)具有相同的Find_值,只有几行会产生错误窗口。
有人知道可能导致这种情况的原因吗?
(另外,如果有很多关于如何搜索日期很好的资源。我从the result of a Google search得到了这个代码的想法。)
答案 0 :(得分:3)
将错误处理移到代码主体之外。它应介于Exit Sub
和End Sub
之间。
此代码不会处理Type mismatch
错误,也不会显示"长日期错误"或"发现"消息。
Sub Test()
Dim Short_Date As Date
Dim Long_Date As Date
On Error GoTo Short_Date_Error
Short_Date = 1 / 0 'Overflow
GoTo Long_Date
Short_Date_Error:
MsgBox "Short Date Error"
Long_Date:
On Error GoTo Long_Date_Error
Long_Date = Int("A") 'Type mismatch
GoTo Date_Find
Long_Date_Error:
MsgBox "Long Date Error"
Date_Find:
MsgBox "Finding"
End Sub
另一方面,此代码移出代码体,处理错误然后恢复:
Sub Test1()
Dim Short_Date As Date
Dim Long_Date As Date
On Error GoTo Short_Date_Error
Short_Date = 1 / 0 'Overflow
Long_Date:
On Error GoTo Long_Date_Error
Long_Date = Int("A") 'Type mismatch
Date_Find:
MsgBox "Finding"
Exit Sub
Short_Date_Error:
MsgBox "Short Date Error"
Resume Long_Date
Long_Date_Error:
MsgBox "Long Date Error"
Resume Date_Find
End Sub
这个link似乎有很多关于错误处理的内容。