Предполагая, что я правильно понял ваш вопрос, вы ищете, существует ли элемент массива Data(i, 13)
в диапазоне AllBands
.
Возможно, вы могли бы изменить этот бит:
And (Data(i, 13).Value Like worksheets("LookupFile.xls").range("AllBands"))
к приведенному ниже (если AllBands
- одна строка или столбец):
And IsNumber(Application.Match(Data(i, 13).Value,Worksheets("LookupFile.xls").Range("AllBands"), 0))
или ниже (если AllBands
состоит из нескольких столбцов или нескольких строк):
And Not (Worksheets("LookupFile.xls").Range("AllBands").Find(Data(i, 13), , xlValues, xlWhole, xlByRows, xlNext, False) Is Nothing)
Однако VBA не предлагает оценку короткого замыкания.Таким образом, он всегда будет оценивать каждое логическое выражение в цепочке / серии.Возможно, было бы лучше разбить утверждение (так что вам не нужно проверять AllBands
, например, если вы уже знаете, что дата находится за пределами диапазона дат).
Это будет означать что-то вроде:
' Some code here...
If (Data(i, 9) >= sDate) And (Data(i, 9) <= EDate + 1) Then
If Data(i, 6) = LOBName And (Data(i, 8) = "Approved-PCSP") Then
If IsNumber(Application.Match(Data(i, 13).Value, Worksheets("LookupFile.xls").Range("AllBands"), 0)) Then
' Some code here...
End If
End If
End If
' Some code here...
Также может быть полезно сохранить AllBands
в переменной перед циклом (например, Dim cellsToSearch as range
, затем Set cellsToSearch = Worksheets("LookupFile.xls").Range("AllBands")
, затем обратиться к cellsToSearch
внутри цикла.
Если вышеупомянутое работает хорошо для вас, тогда хорошо. Вероятно, нет необходимости в дальнейшей оптимизации.
Оба вышеуказанных подхода будут выполнять линейный поиск (с циклическим просмотром каждого значения в AllBands
).Кроме того, этот линейный поиск будет выполняться для каждой строки в массиве Data
.
Если выполнение кода занимает слишком много времени, возможно, вы могли бы отсортировать данные в AllBands
, чтобы разрешитьдля бинарного поиска (бинарный поиск может быть выполнен через Application.Vlookup
или Application.Match
с правильными аргументами, если я не ошибаюсь).
Или может потребоваться использовать подход с более низкой алгоритмической сложностью, например dictionary
, collection
(хотя он не предлагаетcontains
или exists
() или любой объект, который внутренне использует хеш-таблицу.Поэтому перед циклом вы, например, добавили бы все значения в AllBands
в словарь (обратите внимание на чувствительность к регистру), а затем внутри цикла вы можете проверить (гораздо быстрее), соответствует ли Data(i, 13)
что-либо вAllBands
.