2017-08-17 42 views
1

我有Excel VBA代碼,打開使用它們的不同文件。可能會出現錯誤,因爲沒有文件在Excel中放鬆。我想創建一個MsgBox這樣的錯誤與一個特定的文件不存在的消息。Excel vba在錯誤轉到不同的處理程序,具體取決於一個錯誤

現在我只能

On Error GoTo ErrorHandler 

ErrorHandler: 
    MsgBox("File is absent") 

但我不能確定究竟哪些文件不存在。有沒有辦法通過錯誤處理程序來實現它?也許通過一些額外的變量?

編輯:我通過

Workbooks.Open Filename:=... 

打開的文件,但我很好奇一個應該做的事情,如果情況是

Dim fileTitle As String 
filetitle=Dir() 

爲好。

+0

是您使用的代碼來打開文件(S)?它是Dir()聲明嗎?如果是這樣,s = Dir()返回找到的文件的名稱,如果沒有則返回空字符串。這完全取決於你如何在文件中循環。請提供您的代碼 –

+3

您應該*做的是在您的程序嘗試打開它之前確保文件存在,然後適當地進行路由(例如,通過消息框向「Exit Sub」進行路由,通知用戶某些所需的輸入對於該方案不可用)。不要使用錯誤處理程序爲代碼提供意想不到的代碼,而是爲了避免導致錯誤的未處理的異常並乾淨地退出,而在代碼中構建適當的邏輯。 –

+0

我只是使用FileSystemObject來檢查文件是否存在,然後再嘗試打開它 – Zac

回答

3

而不是硬編碼通過文件路徑:

Workbooks.Open Filename:=... 

使用一個變量來表示文件路徑/文件名:

Dim fileName As String 
fileName = "C:/path/to/my/file.xlsx" 

然後,檢查以確保其之前存在您嘗試打開它:

If FileIsAccessible(fileName) Then 
    ' Do stuff 
Else 
    MsgBox fileName & " doesn't exist or cannot be opened" 
    Exit Sub 
End If 

使用自定義功能

Function FileIsAccessible(path$) As Boolean 
    Dim FF As Long 
    On Error GoTo EarlyExit 
    FF = FreeFile 

    'Does file exist? 
    ' Raises Error 53 if file not found 
    Open path For Input Access Read As FF 
    Close FF 

    'If file exist, is it accessible? 
    ' Raises error 70 if file is locked/in-use 
    FF = FreeFile 
    Open path For Binary Access Write As FF 
    Close FF 

EarlyExit: 
FileIsAccessible = (Err.Number = 0) 
End Function 
+0

謝謝。我想我會用你的方法。請問在評論中如何使用'FileSystemObject'是否太多了?你的自定義功能對我來說很難。 – Ans

+0

是的,它太多了。有足夠的文檔可用於使用FileSystemObject :)如果遇到問題,請針對FSO專門提出問題。此外,這個自定義函數應該更容易實現,它可以從字面上複製並粘貼到代碼中,並根據需要調用它。 –

2

有兩種方法可以解決這個問題。首先,如您所建議的(這也是兩者中較容易的),您可以創建一個變量,該變量將載入在每個文件成功加載後重新分配的文件名。如果發生故障,該名稱可以傳遞到您的消息框中。如果你只需要通過這個名字,這是更好的解決方案。

第二種選擇是創建多個錯誤處理程序。如果您需要更多自定義處理錯誤的方法,例如想要根據丟失的文件類型顯示不同的消息,我只會推薦這種方法。這個選項會讓你的代碼變得更加混亂(因爲你需要多次重新分配On Error GoTo ...聲明,但是如果你需要更復雜的解決方案,它的價值應該考慮在內。)

+0

謝謝你的回答。我很好奇第二個解決方案的樣子,找不到那個自定義的錯誤處理語法。 – Ans

+0

@Ans這將是相當醜陋的。您基本上需要有多個錯誤處理程序(例如'ErrorHandler1','ErrorHandler2'等),然後在每次需要使用另一個錯誤時重新指定「On Error GoTo」語句。 – RGA

1

按照你的需求試一試並調整它。這會給你一個處理錯誤處理的起點......

假設你試圖打開位於桌面的文件abc.xlsx,並且如果在桌面上找不到此文件,錯誤處理將被觸發

不要忘記在錯誤處理標籤之前使用Exit Sub,以便在找到該文件時不會執行它

Dim wb As Workbook 
Dim FilePath As String 

FilePath = Environ("UserProfile") & "\Desktop\abc.xlsx" 

On Error GoTo ErrorHandler 
Set wb = Workbooks.Open(FilePath) 
'Other stuff here if file was found and opened successfully 
' 
' 
' 
' 
Exit Sub 
ErrorHandler: 
    MsgBox Err.Number & vbNewLine & Err.Description, vbCritical, "File Not Found!" 
2

您仍可以訪問在錯誤處理的變量,所以你知道在其中文件錯誤發生:

Sub ... 
    Dim filename As String 
    On Error GoTo ErrorHandler 
    filename = Dir(...) 
    While filename>"" 
     Set wb = Workbooks.Open(filename) 
     ... 
     filename=Dir 
    Wend 
    Exit Sub 
ErrorHandler: 
    MsgBox "Error " & Err.Number & ": " & Err.Description & " File: " & filename 
End Sub