Excel vba On Error GoTo不同的处理程序,具体取决于错误

时间:2017-08-17 13:54:33

标签: excel vba excel-vba

我有excel vba代码,可以打开不同的文件来使用它们。可能会发生错误,因为没有excel loos文件。我想用这样的错误创建一个MsgBox,其中包含一条特定文件不存在的消息。

现在我只能

On Error GoTo ErrorHandler

ErrorHandler:
     MsgBox("File is absent")

但是我无法指定哪个文件不存在。有没有办法通过错误处理程序实现它?也许通过一些额外的变量?

编辑:我通过

打开文件
Workbooks.Open Filename:=...

但我很好奇如果案件是

那应该怎么做
Dim fileTitle As String
filetitle=Dir()

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:1)

有两种方法可以解决这个问题。首先,正如您所建议的那样(这两者中也更容易),您可以创建一个变量,该变量将携带在每个文件成功加载后重新分配的文件名。如果发生故障,该名称可以传递到您的消息框中。如果你需要做的就是通过这个名字,这是更好的解决方案。

第二个选项是创建多个错误处理程序。我只推荐这个,如果您需要更多关于如何处理错误的自定义,比如想要根据缺少哪种类型的文件显示不同的消息。此选项会使您的代码变得更加混乱(因为您需要多次重新分配On Error GoTo ...语句,但如果您需要更复杂的解决方案,则值得考虑。

答案 3 :(得分: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!"