如何使用错误处理来跳过循环迭代

时间:2017-07-26 13:41:28

标签: vba excel-vba excel

我有一个for循环靠近顶部我希望在尝试设置一个等于工作簿的变量时抛出错误。返回错误是因为工作簿可能存在,也可能不存在。 for循环遍历许多工作簿,其中任何数量都可能存在,也可能不存在。循环看起来像这样

for i = 1 to x
     'get ready for to open the workbook

     set = myworkbook = workbooks.open("path\myworkbook" & date)

     'do a bunch of stuff after I get the workbook

next i

这一切都很好,花花公子,但如果工作簿不存在,那我就会出错。现在我尝试了一些错误处理技术。理想情况下,如果找不到工作簿,它会直接跳到循环的底部,然后进入下一个工作簿。

我已经使用goto语句跳转到行的底部,但是只有一次工作,并且在工作簿不存在时第二次传递时会抛出错误。我在goto行之后尝试了err.Clear,以便可以捕获新的错误。我已经尝试过goto -1来清除错误,但这也不起作用。我已经尝试了各种简历下一个语句,但如果由于找到了工作簿而没有发生错误,则会抛出一个我无法处理的错误。我在启动错误处理例程之前检查错误编号,包装变量设置行以确保它显示为0但仍然会引发错误。

似乎有很多方法可以解决这个问题,我想我已经尝试过所有这些方法。这不是一个我确定的独特问题,我只需要朝着正确的方向努力。感谢您提供的任何帮助。

这样你就不会想到我没有尝试过你想到的任何解决方案,这里还有其他一些问题:

For Loop, how to skip iterations

Difference between 'on error goto 0' and 'on error goto -1' -- VBA

On Error Goto 0 not resetting error trapping

Access VBA: Is it possible to reset error handling

Continue For loop

Error handling only works once

2 个答案:

答案 0 :(得分:2)

为什么不这样:

Public Sub SkipLoop()
   On Error Resume Next

   Dim i As Integer
   Dim wb As Workbook

   For i = 1 To 100
      Err.Clear
      Set wb = Workbooks.Open("some file")

      If Err.Number = 0 Then
         'do work on success
      End If
   Next
End Sub

答案 1 :(得分:2)

不需要对此类内容使用错误处理。只需使用智能逻辑就可以了:

Dim MyWorkbook as Workbook
for i = 1 to x
     'get ready for to open the workbook

     On Error Resume Next
     set myworkbook = workbooks.open("path\myworkbook" & date)
     On Error GoTo 0

    If Not MyWorkbook Is Nothing Then
        'do a bunch of stuff after I get the workbook
    End if
next i

这样做是为了检查“虚无”'对象变量。如果对象未设置(未找到),则If块中的代码将不会运行。