Общая функциональность "IsInArray"
Функция "IsInArray" обычно должна проверять, является ли какой-либо типизированный элемент частью массива.
Реализация с Application.Match
:
IsInArray = IsNumeric(Application.Match(ToBeFound, WithinArray(), 0))
- работает с числами и текстом (без учета регистра)
- сравнивает полный текст, но принимает * и? также
- Если элемент является частью массива,
Application.Match
возвращает свою позицию (число). Если нет, то возвращается нечисловая ошибка, и поэтому IsNumeric
возвращает False
.
Реализация с Filter
:
IsInArray = (UBound(Filter(WithinArray(), ToBeFound, True, vbTextCompare)) > -1)
- работает с числами и текстом (выбирается чувствительность к регистру)
- всегда сравнивает части текста, поэтому «A» будет в массиве («ABC», «DEF»)
- Если элемент является частью массива,
Filter
возвращает отфильтрованный массив с оставшимися элементами. Поскольку оставшийся массив основан на 0, верхняя граница массива будет не меньше 0. Если элемент не является его частью, то Ubound
не равно 0 или выше, поэтому> -1 сравнение.
* * Пример тысячи сорок один * ** 1 043 тысяча сорок-дв *
Если содержимое одной ячейки следует сравнивать с предварительно определенным массивом:
Private Sub CompareRangeValuesWithGivenArray()
Dim ad As Worksheet
Dim testArray() As Variant
Dim t As Long
Set ad = ActiveSheet
testArray() = Array("0", -3.2, "ABC", 5)
For t = 1 To ad.Cells(ad.Rows.Count, "A").End(xlUp).Row
If IsInArray(ad.Cells(t, "B").Value, testArray()) Then
Debug.Print ad.Cells(t, "B").Value & " is in Array"
Else
Debug.Print ad.Cells(t, "B").Value & " is NOT in Array"
End If
Next t
End Sub
Private Function IsInArray(ByRef ToBeFound As Variant, ByRef WithinArray() As Variant) As Boolean
IsInArray = IsNumeric(Application.Match(ToBeFound, WithinArray(), 0))
End Function
(сохраните IsNumeric
, даже если вы ищете текст)
Отрицательные значения
Если отрицательные элементы также должны быть возвращены как IsInArray() = True
, тогда капсулируйте ваши "проверяемые значения" на Abs()
и помещайте в ваш массив только положительные значения:
If IsInArray(Abs(ad.Cells(t, "B").Value), testArray()) Then
Если в вашем массиве должны быть отрицательные элементы:
testArray(1) = -1
testArray(2) = -2.5
или
testArray() = Array(1, -2.5)