2017-07-26 87 views
0

我有一个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 

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

我已经使用goto语句来跳转到行的底部,但是只有当该工作簿不存在时才会起作用,并且在第二次传递时会抛出错误。在goto行之后,我尝试了err.Clear,以便可以捕获新错误。我已经尝试了goto -1来清除错误,但这也不起作用。我尝试了各种resume resume语句,但是如果因为找到工作簿而没有发生错误,那么会抛出一个我无法处理的错误。在开始错误处理程序包装变量设置行之前,我检查错误编号,确保它显示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

+0

为什么不使用'对于myworkbook.Worksheets中的每个ws'请参见[SO Excel文档主题](https://stackoverflow.com/documentation/excel-vba/1144/loop-through-all-sheets-in-active -workbook/3685/retrieve-all-worksheets-names-in-active-workbook#t = 201707261350060188819) –

+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 
+0

这工作的第一次通过,但不是第二次。如果有两个连续的错误,那么第二个错误会被提出,但不是第一个错误。我用消息框来确保Err.Clear已经删除了错误1004,但错误仍然被抛出。 –

+0

@丹我没有看到这种行为与上述代码。 –

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块内的代码将不会运行。

+0

您需要使用错误处理,因为如果未找到该文件,则会引发错误。 –

+0

如果没有找到文件路径,我可以发誓它将返回'Nothing',但是将它包裹在一个错误中,以防万一(因为错误将由逻辑检查处理)。\ –

+0

我其实也试过这个,我会在MyWorkbook Is Nothing检查中发现错误。 –