VBA在错误奇怪的行为

我在VBA程序devise方面非常有经验,但是这个问题在我看来有一段时间了,甚至在研究之后,我从来没有find这个问题的答案。

这是我的代码片段

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 

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

假设一个集合中已经存在两个连续的表名,那么这个代码不会运行。 第一次,它首次在“主线”中find错误,然后跳到NextSheet标签。 目前很好。 但是当下一次到Col时,它不会考虑On Error Handler,并给我一个自动化错误。 如果我在立即Window中同时执行这行,它给了我一个错误“键已经存在到不同的项目”,这是一个正确的行为,但是当我运行它,它给了我自动化错误,并杀死我的代码执行完全。 我真的很难find这种行为的原因。 有人可以帮忙吗?

谢谢,V

我认为问题在于你的error handling程序仍处于活动状态时出现错误; 因为没有启用但是不活动的error handling程序,所以错误在发生的时候是致命的(请参阅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 

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

  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 

现在,你可以猜测它正在发生 – 你已经将一个隐藏的“栈 – popper”推到VBA引擎的内部堆栈中,而忽略了popup它。 Resume Next Sht会做到这一点。