Обработка только определенных ошибок VBA - PullRequest
0 голосов
/ 15 октября 2018

У меня есть две ошибки, которые возможны при запуске моего кода.Первая - это распространенная ошибка, из-за которой мой метод .Find не может ничего найти, и я хотел бы, чтобы он возобновился следующим, если это произойдет.Это совершенно нормальное явление, и мне нужно оставить его для моего менеджера, чтобы утвердить код (старый код VBA все еще используется, и он боится его менять.

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

Ошибка, которую я хотел бы "игнорировать" (как в Resume Next или GoToконкретное место в остальной части кода, не беспокоясь об ошибке, я не беспокоюсь о дальнейшем коде) - Ошибка выполнения 91. В частности, в коде:

toFindCell1 = Cells.Find(nameVar).Row

, где nameVar изменяется на основеФормула a for идет вниз по списку. Затем я планирую сравнить ее с существующей информацией и использовать эту переменную, чтобы определить, существует ли она. Если нет, то она добавит ее.

Как я могу указать ошибку, которую я хочу обработать в VBA?

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Лучше всего использовать If Not result Is Nothing Then, как упоминалось в ответе Матье .


Однако в некоторых конкретных случаях это может быть действительно хорошимИдея поймать конкретный номер ошибки и продолжить, исправляя ее.Это определенно не один из них, но является хорошей иллюстрацией того, как «играть» с Err.Number:

Sub TestMe()

    On Error GoTo TestMe_Error

    Dim result As Range
    Set result = Cells.Find("Something")

    Debug.Print result.Row
    Debug.Print "Something here"
    Debug.Print 5 / 0
    Debug.Print "This line is unreachable."

TestMe_Error:

    Select Case Err.Number
    Case 91
        Debug.Print "ERROR 91!"
        Err.Clear
        Set result = Range("A100")
        Resume
    Case Else
        Debug.Print "Some other error!"
    End Select

End Sub

Что происходит в коде выше?В строке Debug.Print result.Row он выдает error 91, который перехватывается обработчиком ошибок и затем очищается с помощью Err.Clear.Как и ожидалось, Set result = Range("A100") используется в обработчике ошибок, и код продолжается со строки, которая вызвала ошибку, но на этот раз result является действительным.Как только он достигает новой ошибки 5/0, он выдает ошибку, отличную от 91, и завершается.

Это вывод:

ERROR 91!
 100 
Something here
Some other error!

Имейте в виду, что использование условной обработки ошибок может рассматриваться как код спагетти большим количеством разработчиков.

0 голосов
/ 15 октября 2018
toFindCell1 = Cells.Find(nameVar).Row

Range.Find возвращает Nothing, вызов участника .Row недопустим. Не делайте этого!

Если ваш код не выдает ошибку 91, то вам не нужно обрабатывать ошибку 91.

Dim result As Range
Set result = Cells.Find(nameVar)
If Not result Is Nothing Then
    toFindCell1 = result.Row
    '....
Else
    'not found.
End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...