VBA On error奇怪的行为

时间:2014-08-02 01:34:56

标签: excel vba onerror

我在VBA编程方面经验丰富,但这个问题偶尔会出现在我身上,即使经过研究,我也从未找到这个问题的答案。

这是我的代码段

    Dim sht As Worksheet

    For Each sht In Worksheets
        On Error GoTo Nextsheet

        col.Add sht.name, sht.name '<-- will be using it as a main Line in my post.
        shtList.AddItem sht.name
        shtList.List(shtList.ListCount - 1, 1) = sht.name
Nextsheet:
        Err.Clear
    Next sht

这是一个简单的for循环,col是一个Collection Object。我想要做的是如果一个项目已经存在于集合中,它将抛出一个错误并转到NextSheet标签。如果没有,那么它将在列表中加载工作表名称。所以这就是我的问题所在:

假设集合中已存在两个连续的工作表名称,则此代码不会运行。第一次,它在&#34;主线&#34;中发现错误这是第一次,它会跳到NextSheet Label。目前很好。但是下次谈到Col时,它并没有考虑On Error Handler并给我一个自动化错误。如果我在即时窗口中同时执行此行,它会给我一个错误&#34;键已经存在于另一个项目&#34;,这是正确的行为,但是当我运行它时,它给了我自动化错误并完全杀死我的代码执行。我真的很努力地找到这种行为的原因。有人可以帮忙吗?

谢谢, V

2 个答案:

答案 0 :(得分:2)

我认为问题是你的错误处理程序仍处于活动状态时会出现错误;由于没有启用但不活动的错误处理程序,错误在发生时是致命的(请参阅HELP for On Error语句)。

我会尝试类似的事情:

On Error Resume Next
    For Each sht In Worksheets
        col.Add sht.Name, sht.Name '<-- will be using it as a main Line in my post.
        If Err.Number = 0 Then
            shtList.AddItem sht.Name
            shtList.List(shtList.ListCount - 1, 1) = sht.Name
        Else
            Err.Clear
        End If
    Next sht
On Error Goto 0

答案 1 :(得分:1)

你需要像这样重写你的例程:

    Dim sht As Worksheet

    For Each sht In Worksheets
        On Error GoTo ErrHandler

        col.Add sht.name, sht.name '<-- will be using it as a main Line in my post.
        shtList.AddItem sht.name
        shtList.List(shtList.ListCount - 1, 1) = sht.name
Nextsheet:
        Err.Clear
    Next sht

    ' other code here

EndSub:
    exit sub

ErrHandler:
    Resume NextSht
End Sub

现在你可能猜到它正在进行 - 你已经将一个隐藏的'stack-popper'推送到VBA引擎的内部堆栈中而忽略了 pop 它。 Resume Next Sht会这样做。