Обработка ошибок VBA не работает, когда вызываемая функция генерирует ошибку - PullRequest
2 голосов
/ 06 марта 2012

Я перебираю строки и просматриваю первый столбец каждой строки (имени), используя разные функции для поиска его отметок.

Для каждого «имени» есть отдельная запись в другой таблице.("отметки"), которые также могут быть пустыми или "-"

Sub main()
On error goto errorhandler
Dim name as string
Dim marks as double
Dim source as range
Dim runs as integer

runs = 1
Set source = Sheets("input").Range("$A$2")
i=1

Do until source.offset(i,0) = ""        'iterate through rows 

    name = source.offset(i,0)
    marks = find(name)

    do until runs * marks > 100
        runs = runs + 1 'since marks is not defined;runs overflows 
    Loop
    'a lot of code which relies on marks
errorhandler:
    i = i + 1
Loop

End Sub

Function find(name as string) as double
    find = application.vlookup(name,Sheets("values").Range("$A$2,$C$5"),2,0)
End function

теперь, как я уже сказал, значение в столбце 2 этой таблицы также может быть пустым или "-", что приводит к ошибке Runtime error13 «Несоответствие типов»

я даже пытался вставить оператор ошибки внутри цикла. VBA обычно должен искать обработку ошибок в вызывающей функции, то есть «main», но этого не происходит

Ответы [ 2 ]

2 голосов
/ 06 марта 2012

ПРОВЕРЕНО И ИСПЫТАНО

Sub main()
    On Error GoTo errorhandler

    Dim name As String
    Dim marks As Double
    Dim source As Range

    Set source = Sheets("input").Range("$A$2")
    i = 1

    Do Until source.Offset(i, 0) = ""       'iterate through rows
        name = source.Offset(i, 0)
        marks = find(name)
        Debug.Print marks
        i = i + 1
    Loop

    Exit Sub
errorhandler:
    MsgBox Err.Description
End Sub

Function find(name As String) As Double
    find = Application.WorksheetFunction.VLookup(name, Sheets("values").Range("$A$2:$C$5"), 2, False)
End Function

РЕДАКТИРОВАТЬ: Kartik, Извините, я не видел, что вы уже приняли ответ.

Followup

на самом деле я не хочу печатать какое-либо сообщение об ошибке, вместо этого сразу перейти к следующей итерации - Kartik Anand 14 секунд назад

В этом случае вы обрабатываете ошибку в неправильном разделе;)

Попробуйте это

Sub main()
    Dim name As String
    Dim marks As Double
    Dim source As Range

    Set source = Sheets("input").Range("$A$2")
    i = 1

    Do Until source.Offset(i, 0) = ""       'iterate through rows
        name = source.Offset(i, 0)
        marks = find(name)
        Debug.Print marks
        i = i + 1
    Loop
End Sub

Function find(name As String) As Double
    On Error GoTo earlyexit

    find = Application.WorksheetFunction.VLookup(name, Sheets("values").Range("$A$2:$C$5"), 2, False)

    Exit Function
earlyexit:
    find = 0
End Function
0 голосов
/ 06 марта 2012

Добавьте Err.Clear после errorhandler:

Также см. Справку Excel по Err.Clear, которая рекомендует On Error Resume Next
вместе с If Err.Number <> 0 Then

Это приведет кгораздо понятнее код

что-то вроде

Sub main()
    On Error Resume Next
    Dim name As String
    Dim marks As Double
    Dim source As Range

    Set source = Sheets("input").Range("$A$2")
    i = 1

    Do Until source.Offset(i, 0) = ""       'iterate through rows
        name = source.Offset(i, 0)
        marks = Find(name)
        If Err.Number <> 0 Then
            Err.Clear
        Else
            ' Your other code for non-error case here

        End If
        i = i + 1
    Loop
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...