2017-07-26 152 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檢查中發現錯誤。 –