Выражение отрицательных значений для поиска в строковом массиве в VBA - PullRequest
1 голос
/ 11 апреля 2019

Приведенный ниже код сравнивает значения в диапазоне «B» & t с массивом, заданным в x (1).Я также хочу включить отрицательные значения, чтобы отрицательные значения в этом диапазоне обнаруживались и после завершения сравнения.Я просто не знаю, как вообще ввести «отрицательное значение» в мой массив x (1).Я пробовал это "<0", но не сработало.</p>

 sub compare()

 dim X(1) as string
 dim t as integer
 x(1)=("0")

 t=2
 Do

 If IsInArray(ad.Range("B"&t).Value,x) then
 'do something
 Else: 'do something else
 End if
 Loop Until ad.Range("A"&t)=""

 End sub     


 Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean
 IsInArray=(UBound(Filter(arr,stringToBeFound))>-1)
 End Function

1 Ответ

1 голос
/ 11 апреля 2019

Общая функциональность "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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...