“的VBA错误处理程序失败”;对于每个“in”;引用ActiveX控件时:运行时错误438

“的VBA错误处理程序失败”;对于每个“in”;引用ActiveX控件时:运行时错误438,vba,foreach,error-handling,runtime-error,activex,Vba,Foreach,Error Handling,Runtime Error,Activex,我有一个充满ActiveX控件的工作表。我知道它们在工作表上有bug,所以我实现了这个功能来重置控件并控制它们的行为 问题是错误处理程序没有捕获由于尝试访问列表框的自动大小属性而发生的运行时错误438(列表框没有自动大小属性,因此出现运行时错误438) 当我添加一个新的ActiveX列表框时,它开始出现问题,这很奇怪,因为我已经有了另一个列表框,它从来没有出现过问题 感谢任何人提供的帮助 编辑: 谢谢,就是这样 新代码适用于: ... 'Error Handler On Error GoTo C

我有一个充满ActiveX控件的工作表。我知道它们在工作表上有bug,所以我实现了这个功能来重置控件并控制它们的行为

问题是错误处理程序没有捕获由于尝试访问列表框的自动大小属性而发生的运行时错误438(列表框没有自动大小属性,因此出现运行时错误438)

当我添加一个新的ActiveX列表框时,它开始出现问题,这很奇怪,因为我已经有了另一个列表框,它从来没有出现过问题

感谢任何人提供的帮助

编辑:

谢谢,就是这样

新代码适用于:

...
'Error Handler
On Error GoTo CleanFail
...

'Other code

...
NotTheObjsUrLooking4:
      Next objX
   End With 
   On Error GoTo 0
Exit Sub

CleanFail:
   Err.Clear
   Resume NotTheObjsUrLooking4
End Sub

这不是VBA中错误处理的工作方式

是的,这是一个跳转,但它是一个到错误处理子程序的跳转<代码>非对象查找4不是一个子例程,它只是一个“继续”标签,是控制流/逻辑的一部分

制作一个
CleanFail
标签:

    ...
    Exit Sub

CleanFail:
    Err.Clear
    Resume NotTheObjsUrLooking4
End Sub
然后调整
On Error
语句,跳转到
CleanFail

    On Error GoTo CleanFail
这将使执行跳出循环并进入错误处理子例程,该子例程清除错误并基本上说这些不是您要查找的droids对象。。。并继续到下一个迭代


在错误转到0时删除
,您不需要它。

为什么不需要“错误转到0”呢?我一直认为您需要重置错误行为,或者在错误处理程序中恢复是否为您这样做?@BryanHarper您只需要
GoTo 0
来“重置错误处理”(通常在设置“错误恢复下一步”时
)-
On Error GoTo
跳转始终是本地过程,因此,在干净地处理运行时错误后,没有什么可重置的;
Resume
关键字重置错误状态(证明:在不处于错误状态的情况下尝试调用
Resume
;-)
    On Error GoTo CleanFail