我在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
答案 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
会这样做。