Excel UDF возвращает True, но не False? - PullRequest
0 голосов
/ 14 ноября 2011

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

=IF(ISNA(MATCH([value], [range], [match_type])),False,True) 

Но в моей попытке исправить простой двухстрочный макрос a возникла небольшая проблема.Кажется, что код VBA, который я написал, чтобы имитировать комбо рабочего листа, вернет истину просто отлично, но не ложь.Вместо этого для значения, не входящего в данный диапазон, возвращается # значение!ошибка.Насколько я понимаю, это операция с несоответствием типов данных, но я не понимаю, почему.

В качестве примечания, IF в приведенном выше комбинированном листе используется для обратного вывода из функции ISNA.Это немного сбивает с толку, если ваш поиск возвращает ложь для положительного результата.

Спасибо за вашу помощь, если у вас есть что-то лучше, дайте мне знать.Вот мой код.

Public Function CompareLists(variable As Variant, list As Range, match_type As String)  As Boolean

    If Application.WorksheetFunction.IsNA(Application.WorksheetFunction.Match(variable,     list, match_type)) = False Then

    CompareLists = True

    Else
        CompareLists = False  
    End If

End Function

** Для тех из вас, кто просит ввод, это может быть что угодно.Я обычно использую это, чтобы сравнить идентификационные номера для сотен вещей.Иногда они содержат буквы и цифры.

Примером может быть попытка найти число 3 в списке 1,2,3,4,5,6,7,8, где 3 находится на одном листе, и списокнаходится на другом.

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

Попробуйте эту версию:

Public Function CompareLists(variable As Variant, list As Range, match_type As Long) As Boolean
    CompareLists = WorksheetFunction.IsNA(Application.Match(variable, list, match_type))
End Function

Название «CompareLists» меня смущает. Более точное имя будет:

Public Function NotInList(variable As Variant, list As Range, match_type As Long) As Boolean
  NotInList = WorksheetFunction.IsNA(Application.Match(variable, list, match_type))
End Function

Это делает его более читабельным:

If NotInList(3, Range("A1:A8"), 0) Then
' rest of code
1 голос
/ 15 ноября 2011

Если вы настаиваете на использовании цикла (как видно из ваших комментариев), тогда я настоятельно рекомендую сначала сбросить диапазон в массив вариантов.

Вот пример функции с циклом. Обратите внимание, что я назвал это IsMissing, так как он кажется более естественным, когда пользователь утверждает, что это так, а не НЕ (личный настрой).

Function IsMissing(ByVal search_value As Variant, _
                   ByVal search_range As range) As Boolean

Dim varray As Variant
Dim i As Long, j As Long
Dim found As Boolean

varray = search_range.value

For i = 1 To UBound(varray, 1)
    For j = 1 To UBound(varray, 2)
        If Len(varray(i, j)) <> 0 Then
            If varray(i, j) = search_value Then
                found = True
            End If
        End If
    Next
Next

IsMissing = found

End Function

P.S. Это все еще можно оптимизировать, но я хотел, чтобы все было просто. Я добавил проверку длины ячейки, чтобы вы не тратили время на пустые ячейки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...