2015-05-25 2 views
1

Я пишу некоторые функции vba. В частности, я переписываю VLOOKUP ... В этом MY_VLOOKUP у меня есть две логические переменные: 1. error_range, это правда, если диапазон, переданный в аргументах формулы, недействителен 2. not_ava, это правда, если там нет результата (результат ВПР будет # N/A)Управление типичными ошибками формулы excel в функциях vba

в разделе обработчика ошибок я написал

Errorhandler: 
If error_range Then error_cat = xlErrRef 
If not_ava Then error_cat = xlErrNA 
Err.Raise error_cat 

, но я получаю ошибку «#value» в клетке. При отладке я понял, что err.raise не работает и генерирует ошибку «#VALUE» Как я могу получить ошибку «# N/D» o «#REF» в ячейке?

ответ

0

Вы можете получить много ошибок при использовании формул Excel. Они могут быть как #Ref, #Value, #N/A, #Name и т.д.

Я обычно использую CVERR() в ловушку такого рода ошибок. Вот пример.

Sub Sample() 
    Dim Ret As Variant 
    Dim error_cat As Long 

    On Error GoTo Whoa 

    Ret = Application.Evaluate("=VLOOKUP(12,SiddharthRout,1,0)") '<~~ Invalid Range 
    'Ret = Application.Evaluate("=VLOOKUP(12,D3:G7,1,0)") '<~~ No Value found 

    Select Case CVErr(Ret) 
     Case CVErr(xlErrName): error_cat = xlErrName 
     Case CVErr(xlErrNA): error_cat = xlErrNA 
     Case CVErr(xlErrRef): error_cat = xlErrRef 
     Case CVErr(xlErrValue): error_cat = xlErrValue 
    End Select 

    If error_cat <> 0 Then Err.Raise error_cat 

LetsContinue: 
    MsgBox "Phew!" 
    Exit Sub 
Whoa: 
    MsgBox "Error Error Damn Error" 
    Resume LetsContinue 
End Sub 
+0

спасибо! ваши решения дали мне правильный путь. Я не знал, как использовать CVErr. Я решил проблему с этим кодом в разделе обработки ошибок: If error_range Затем error_cat = xlErrRef End If If not_ava Then error_cat = xlErrNA else error_cat = xlErrValue End If my_vlookup = CVErr (error_cat) –

+0

Glad помогать :) –

0

Я вставить код, может быть, это будет полезно бу для кого-то

(благодаря Сиддхарт Бегство за помощь)

If error_range Then 
error_cat = xlErrRef 
Else 
If not_ava Then 
error_cat = xlErrNA 
else 
error_cat = xlErrValue 
End If 
end if 
my_vlookup = CVErr(error_cat) 
Смежные вопросы