VBA Excel简单错误处理
我尽可能多地上网(除了Microsoft支持网站,该网站因某种原因在工作中被屏蔽)。我只是想跳过一个错误。我在这里写的代码是简化的,但应该以同样的方式工作 我的代码应该做什么: 我的一个sub在循环中创建形状并命名它们(btn_1、btn_2等)。但在创建它们之前,它会调用一个子系统,试图删除它们,以免创建重复项。此子循环(btn_1、btn_2等)并使用以下方法删除形状:VBA Excel简单错误处理,excel,vba,error-handling,Excel,Vba,Error Handling,我尽可能多地上网(除了Microsoft支持网站,该网站因某种原因在工作中被屏蔽)。我只是想跳过一个错误。我在这里写的代码是简化的,但应该以同样的方式工作 我的代码应该做什么: 我的一个sub在循环中创建形状并命名它们(btn_1、btn_2等)。但在创建它们之前,它会调用一个子系统,试图删除它们,以免创建重复项。此子循环(btn_1、btn_2等)并使用以下方法删除形状: for i = 1 to (a certain number) Set shp = f_overview.Shap
for i = 1 to (a certain number)
Set shp = f_overview.Shapes("btn_" & i)
shp.delete
next
当然,形状无法删除,因为它根本不存在。我发现,大多数情况下,建议的修复是在设置形状之前添加(在错误恢复下一步),因为我收到一个错误,说它不存在。我在循环内、循环前等都试过,比如:
for i = 1 to (a certain number)
On Error Resume Next
Set shp = f_overview.Shapes("btn_" & i)
shp.delete
next
据我所知,如果形状不存在,它应该是循环的,但是无论我是否在下一步添加错误恢复,我仍然会得到相同的错误!我做错了什么
编辑:形状确实存在时没有错误。请尝试:
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
出错时继续下一步
对于i=1到(某个数字)
设置shp=f_概览形状(“btn_”和i)
如果err0,则err.clear else shp.delete
下一个
错误转到0
听起来您设置了错误的错误捕获选项。在VBA编辑器中,选择Tools->Options
。在打开的窗口中,选择常规选项卡
,然后选择未处理错误中断
单选按钮。这将允许Excel正确处理“错误时恢复下一步”命令
我怀疑您已选择了“中断所有错误”。与其尝试盲目删除形状并跳过错误,不如浏览已知形状的列表并删除它们。这样,您就不必担心下一步恢复时出现的
错误,这通常会被滥用
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
语句
我发现,大多数情况下,建议的修复是在设置形状之前添加(在错误恢复下一步),因为我收到一个错误,说它不存在
不
处理运行时错误的推荐方法是not将它们隐藏起来,然后继续执行,就像什么都没发生一样-这正是下一步出错恢复时所做的
避免运行时错误的最简单方法是检查错误条件,并避免执行导致100%失败率的代码,就像尝试在一个无的对象引用上运行一个方法一样:
For i = 1 To (a certain number)
Set shp = f_overview.Shapes("btn_" & i)
If Not shp Is Nothing Then shp.Delete
Next
如果您无法检查错误情况,并且必须处理错误,建议使用以下方法处理:
如果您了解自己正在做什么以及它将如何影响代码,那么使用OERN(下一步错误恢复)没有什么错
在您的情况下,使用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
如果您希望还可以循环查看所有工作表,以检查工作表是否存在 ++关于正确的错误处理:)@SiddharthRout是的,除了我没有测试它,现在我越想它,我越相信赋值会使索引超出范围错误,在这种情况下有更好的解决方案;s ok:)编辑上述代码。我的评论是你在文章底部展示的正确的错误处理。我在我的帖子中也提到了这一点:)@SiddharthRout编辑,…没有从任何人的答案中窃取:)好的提示,对于像我这样的新手来说。然而,它失败的原因显然是因为我的设置错误(参见所选答案)。啊,太棒了!这是我将选择的方式。谢谢你的修复+1尽管您没有解释如何使用错误处理,但答案是:-)关于错误处理细节的缺乏,您是正确的-这个循环不需要它,特别是在您的思维方式上。在一般的错误处理方面做得很好。没关系,3个月后,出现了一个随机驱动upvote!:)谢谢我不断尝试其他回答者的建议,但都失败了。这就是为什么尽管他们也提供了有价值的信息@DavidGrand'Maison我同意其他答案中的错误处理更干净、更好。但是你的原始代码应该已经运行了。谢谢你的解释!但是,它失败的原因是因为我的设置错误(参见选择的答案)。++但不幸的是,大多数人不理解使用OERN的含义。顺便说一句,我喜欢这个首字母缩略词。我保留着它。
On Error Resume Next
<Your Entire Procedure>
On Error GoTo 0
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