VBA Excel简单的error handling

我尽可能在网上查找(除了Microsoft支持网站,由于某种原因在工作中被阻止)。 我试图简单地跳过一个错误。 我写在这里的代码是简化的,但应该以同样的方式工作。

我的代码应该做什么:我的一个潜艇在循环中创build形状并命名它们(btn_1,btn_2等)。 但在创build它们之前,它会调用一个试图删除它们的子文件,以免创build重复文件。 这个子循环遍历(btn_1,btn_2等),并使用以下命令删除形状:

for i = 1 to (a certain number) Set shp = f_overview.Shapes("btn_" & i) shp.delete next 

当然,这种形状不可能被删除,因为它根本不存在。 我发现大多数时候,build议的修复方法是在设置形状之前添加(在接下来的错误恢复),因为我得到一个错误,说它不存在。 我已经尝试了循环内循环,等等,如下所示:

 for i = 1 to (a certain number) On Error Resume Next Set shp = f_overview.Shapes("btn_" & i) shp.delete next 

据我了解,如果形状不存在,应该循环遍历,但是我仍然会得到相同的错误,无论我是否继续添加On error resume! 我究竟做错了什么?

编辑:形状确实存在没有错误。

这听起来像你有错误的陷阱选项设置。 在VBA编辑器中,selectTools -> Options 。 在打开的窗口中,selectGeneral tab ,然后selectBreak on Unhandled Errors单选button。 这应该允许Excel正确处理On Error Resume Next命令。

我怀疑你selectBreak on All Errors

我发现大多数时候,build议的修复方法是在设置形状之前添加(在接下来的错误恢复),因为我得到一个错误,说它不存在。

没有!

处理运行时错误的build议方法不是将它们推到地毯下,并继续执行,就好像什么也没发生一样 – 这正是On Error Resume Next所做的。

避免运行时错误的最简单的方法是检查错误条件,并避免执行导致100%失败率的代码,例如试图在Nothing对象引用上运行方法:

 For i = 1 To (a certain number) Set shp = f_overview.Shapes("btn_" & i) If Not shp Is Nothing Then shp.Delete Next 

如果您不能检查错误情况并且必须处理错误,build议的方法是处理它们:

 Private Sub DoSomething() On Error GoTo CleanFail '...code... CleanExit: 'cleanup code here Exit Sub CleanFail: If Err.Number = 9 Then 'subscript out of range Err.Clear Resume Next Else MsgBox Err.Description Resume CleanExit End If End Sub 

而不是试图盲目删除形状和跳过错误,为什么不穿过已知形状的列表并删除它们。 那么你不必担心On Error Resume Next一个往往最终被滥用。

 Sub Test(TheSheet As Worksheet) Dim Shp as Shape For Each Shp in TheSheet.Shapes If left(Shp.Name, 4) = "btn_" Then Shp.Delete End if Next End Sub 

如果要删除所有形状,请删除If语句。 如果要删除多个不同名称的形状,请适当修改If语句。

如果你知道你在做什么以及它将如何影响你的代码,那么在使用OERNOn Error Resume Next )时没有任何错误。

在你的情况下,使用OERN是完全正常的

 Dim shp As Shape For i = 1 To (a certain number) On Error Resume Next Set shp = f_overview.Shapes("btn_" & i) shp.Delete On Error GoTo 0 Next 

同时确保你不要做类似的事情

 On Error Resume Next <Your Entire Procedure> On Error GoTo 0 

这将抑制所有的错误。 使用正确的error handling,如马特

编辑

这是关于如何使用OERN的另一个漂亮的例子这个函数检查一个特定的工作表是否存在。

 Function DoesWSExist(wsName As String) As Boolean Dim ws As Worksheet On Error Resume Next Set ws = ThisWorkbook.Sheets(wsName) On Error GoTo 0 If Not ws Is Nothing Then DoesWSExist = True End Function 

如果你希望你也可以遍历所有的工作表来检查是否存在或不存在工作表!

尝试:

 On Error Resume Next for i = 1 to (a certain number) Set shp = f_overview.Shapes("btn_" & i) if err<>0 then err.clear else shp.delete next on Error Goto 0