Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA Excel简单错误处理_Excel_Vba_Error Handling - Fatal编程技术网

VBA Excel简单错误处理

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

我尽可能多地上网(除了Microsoft支持网站,该网站因某种原因在工作中被屏蔽)。我只是想跳过一个错误。我在这里写的代码是简化的,但应该以同样的方式工作

我的代码应该做什么: 我的一个sub在循环中创建形状并命名它们(btn_1、btn_2等)。但在创建它们之前,它会调用一个子系统,试图删除它们,以免创建重复项。此子循环(btn_1、btn_2等)并使用以下方法删除形状:

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