【问题标题】:Why does only one of my VBA error handlers handle errors?为什么我的 VBA 错误处理程序中只有一个处理错误?
【发布时间】:2026-02-17 00:15:01
【问题描述】:

这是一个 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(Format(Find_What, "Long Date")) 行出现类型不匹配的错误。果然,Find_What 以根本不是日期的方式传递。幸运的是,这正是我想要捕捉的错误。

但是当我逐步完成时,我发现运行时从 Short_Date = CDate(Format(Find_What, "Short Date")) 跳转到 Short_Date_Error 而没有给我错误窗口,而几乎相同的代码(只是带有“Long日期”而不是“短日期”)与 Find_What 的值相同,只是下面几行会导致错误窗口。

有人知道是什么原因造成的吗?

(另外,如果有任何关于如何搜索日期的好资源,那就太好了。我从the result of a Google search 得到了这个代码的想法。)

【问题讨论】:

  • 你没有退出你的程序来处理错误,然后resuming 所以你的错误标志没有被重置......我应该把它扩展到一个答案。 :)

标签: vba excel error-handling


【解决方案1】:

将错误处理移到代码主体之外。它应该介于Exit SubEnd Sub 之间。

此代码不会处理Type mismatch 错误,并且永远不会显示“Long Date Error”或“Finding”消息。

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 似乎有相当多的错误处理。

【讨论】:

  • 优秀。谢谢。
  • 如果是,请随时接受作为答案,尽管通常值得等待一下,看看是否有更好的结果。 :)