Обработка ошибок VBA, когда файл не существует в каталоге - PullRequest
0 голосов
/ 29 октября 2019

Я написал некоторый код для запуска рабочих книг, если они существуют в определенной папке на основе записи в ячейке. У меня возникают проблемы при отображении сообщения об ошибке, когда запись пуста и / или когда ее нет в файле. Я пытался использовать 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

Ответы [ 3 ]

0 голосов
/ 29 октября 2019

Существует много подходов к реализации обнаружения ошибок, вот несколько популярных.

  1. Подход Try-Catch
' The "Try" part
On Error Resume Next
...
On Error GoTo 0
' The "Catch" part
If Err.Number <> 0 Then
...
End If
Подход к ошибке 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.
0 голосов
/ 29 октября 2019

Вместо использования обработки ошибок другим подходом было бы просто проверить, существует ли файл, и затем ответить соответствующим образом:

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

Я думаю, что этот подход более чистый и, возможно, более интуитивный.

0 голосов
/ 29 октября 2019

Есть много способов реализовать обработку ошибок. Вот один…

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 - Полное руководство .


Обратите внимание, что

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

не очень надежный метод для проверки, была ли изменена ячейка G9. Вместо этого всегда используйте метод пересечения, чтобы проверить, был ли изменен диапазон:

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