关于vba:如何使用错误处理跳过循环迭代

How to Use Error Handling to Skip Loop Iterations

我有一个for循环,在该循环附近,我希望在尝试将变量设置为等于工作簿时引发错误。因为工作簿可能存在或不存在,所以返回错误。 for循环在许多工作簿上循环,它们可能存在或不存在。循环看起来像这样

1
2
3
4
5
6
7
8
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

这一切都很好,但如果工作簿不存在,则会出现错误。现在,我尝试了几种错误处理技术。理想情况是,如果找不到工作簿,则它会跳到循环的底部,然后进入下一个i。

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

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

只是为了您不认为我没有尝试过您首先想到的任何解决方案,以下是我阅读的其他一些问题:

对于循环,如何跳过迭代

错误on goto 0和错误on goto -1之间的区别-VBA

在错误转到0时未重置错误陷阱

Access VBA:是否可以重置错误处理

继续循环

错误处理仅适用一次


无需对此类问题使用错误处理。 只需使用智能逻辑即可:

1
2
3
4
5
6
7
8
9
10
11
12
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块中的代码将不会运行。


为什么不这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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