Страницы: 1
RSS
Пользовательская функция ВПР2 возвращает 0 если не находит совпадения, а не ошибку
 
Подглядел и дописал функцию ВПР2, которая возвращает последнее найденное значение в диапазоне (а не первое, как обычная ВПР).
Пожалуйста, подскажите начинающему программисту на VBA, почему функция возвращает 0, а не ошибку, если совпадений не найдено.
Могу, конечно, в начало кода добавить строку
ВПР2 = "#Н/Д"
Но это как-то странно.

Код
Function ВПР2(SearchValue As Variant, Table As Range, ResultColumnNum As Integer)
Dim i As Integer
For i = 1 To Table.Rows.Count
    If Table.Cells(i, 1) = SearchValue Then
        ВПР2 = Table.Cells(i, ResultColumnNum)
    End If
Next i
End Function
 
s_bag, мне кажется так как условие не выполняется поэтому это else соответственно 0"...  ИМХО
Не бойтесь совершенства. Вам его не достичь.
 
s_bag,
это же Ваша функция, что напишете - то и вернет
Код
Function ВПР2(SearchValue As Variant, Table As Range, ResultColumnNum As Integer)
  Dim i As Integer
  For i = 1 To Table.Rows.Count
    If Table.Cells(i, 1) = SearchValue Then  ВПР2 = Table.Cells(i, ResultColumnNum):  Exit Function
  Next i
  ВПР2 = 0
End Function
Изменено: Ігор Гончаренко - 14.06.2019 16:55:05
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
s_bag написал:
Но это как-то странно.
Поскольку Вы не указали в #1 тип возвращаемого значения, то по умолчанию тип функции - Variant. Соответственно, возвращаемое значение инициализируется как Empty и в случае ненахождения возвращается Empty.
Используйте в VBA тип Long, а не Integer  - избежите многих неприятностей. Например, в #1 переменная i не может быть больше, чем 32767, а строк на листе может быть гораздо больше.
Владимир
 
sokol92, спасибо.
1) Поправил тип для переменной i.
2) Из вашего сообщения понял, что функция вполне может возвращать ноль, а чтобы она возвращала ошибку Excel (но не ошибку кода VBA), нужно сообщить ей, какую ошибку вернуть. Получило так:
Код
Function ВПР2(SearchValue As Variant, Table As Range, ResultColumnNum As Integer)
Dim i As Long
ВПР2 = CVErr(xlErrNA)
For i = 1 To Table.Rows.Count
    If Table.Cells(i, 1) = SearchValue Then
        ВПР2 = Table.Cells(i, ResultColumnNum)
    End If
Next i
End Function

Изменено: s_bag - 14.06.2019 16:51:10 (неверно отражается код VBA)
Страницы: 1
Наверх