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
会做到这一点。