【问题标题】:VBA Error Handling for when a file doesn't exist in the directory目录中不存在文件时的 VBA 错误处理
【发布时间】:2020-02-24 17:19:04
【问题描述】:

如果工作簿存在于基于单元格条目的特定文件夹中,我已经编写了一些代码来启动它们。当条目为空白和/或文件中不存在该条目时,我无法显示错误消息。我尝试使用 On Error GoTo MsgBox,但即使输入正确,也会显示 MsgBox。

Private Sub Worksheet_Change(ByVal Target As Range)

'PART NUMBER DECLARATIONS
Dim part1 As Long
Dim part2 As Long

'Variable Assignments
part1 = 123
part2 = 234

If Target.Address = "$G$9" Then

varCellvalue = Range("G9").Value

Workbooks.Open "C:\Users\USERX\Desktop\Test File\" & varCellvalue & ""

 ElseIF varCellvalue <> Range("G9").Value Then

MsgBox" Invalid Part Number"

End If


End Sub

【问题讨论】:

  • 您可以edit 对您尝试的错误处理代码提出问题吗?您是否可能在处理程序部分之前忘记了Exit Sub

标签: excel vba error-handling


【解决方案1】:

不使用错误处理,另一种方法是简单地检查文件是否存在,然后做出适当的响应:

Private Sub Worksheet_Change(ByVal Target As Range)
   'PART NUMBER DECLARATIONS
   Dim part1 As Long
   Dim part2 As Long

   'Variable Assignments
   part1 = 123
   part2 = 234

   If Target.Address = "$G$9" Then
      varCellvalue = "C:\Users\USERX\Desktop\Test File\" & Range("G9").Value & ""

      If Dir(varCellvalue) <> "" Then
         Workbooks.Open varCellvalue
      Else
         MsgBox "The file does not exist"
      End If
   End If
End Sub

我认为这种方法更简洁,也许更直观。

【讨论】:

  • 谢谢,我同意这是一个更好的方法。但是,无论您在单元格中放置什么内容,您的代码都会显示 MsgBox,并且不会启动任何工作簿。不知道为什么。
  • 请注意,错误处理(正如我在回答中所展示的)是一种更好的方法。虽然您只是测试文件是否存在,但这并不意味着Workbooks.Open 可以毫无错误地打开它。因此,通过错误处理,您可以捕获导致文件无法打开的 all 错误,而您的测试只是防止“文件不存在”错误。如果文件存在但您无权打开它,则您的代码将失败。
【解决方案2】:

有很多方法可以实现错误处理。这是一个……

Private Sub Worksheet_Change(ByVal Target As Range)
    '… rest of your code

    On Error Goto ERR_FILE_OPEN
    Dim Wb As Workbook
    Set Wb = Workbooks.Open("C:\Users\USERX\Desktop\Test File\" & varCellvalue & "")
    On Error Goto 0 'don't forget to re-enable error reporting

    '… rest of your code

    Exit Sub
ERR_FILE_OPEN:
    MsgBox "File '" & varCellvalue & "' could not be opened.", vbCritical
End Sub

更多信息请阅读:VBA Error Handling – A Complete Guide


注意

If Target.Address = "$G$9" Then

不是测试单元格 G9 是否更改的非常可靠的方法。而是始终使用 intersect 方法来测试范围是否已更改:

If Not Intersect(Me.Range("G9"), Target) Is Nothing Then
    varCellvalue = Me.Range("G9").Value

【讨论】:

    【解决方案3】:

    实现错误检测的方法有很多,这里有几个流行的。

    1. Try-Catch 方法
    ' The "Try" part
    On Error Resume Next
    ...
    On Error GoTo 0
    ' The "Catch" part
    If Err.Number <> 0 Then
    ...
    End If
    
    1. On error Goto 方法
    on error goto Oops
    ..
    ..
    ..
    Exit Sub
    Oops:
        'handle error here
    End Sub
    
    For a comprehensive approach, refer to further reading "VBA Error Handling – A Complete Guide." provided by PEH.
    

    【讨论】:

    • If Err.Number &lt;&gt; 0 Then 永远不会是 True。您的第一个示例只是隐藏了On Error Resume NextOn Error GoTo 0 之间的所有错误消息。
    猜你喜欢
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 2017-10-29
    • 1970-01-01
    • 2019-08-21
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多