Обычно для запуска функций рабочего листа вы должны использовать WorksheetFunction
API.
Early-bound, Application.WorksheetFunction.Match
дает вам проверку времени компиляции и идиоматические c ошибки времени выполнения VBA в случае несоответствия (т.е. вы можете обработать несоответствие с помощью оператора On Error
).
Late-bound, Application.Match
теряет проверку времени компиляции, но теперь вы получаете результат Variant/Error
вместо ошибки времени выполнения VBA в случае несоответствие.
Используя версию с поздним связыванием, вам нужно будет подтвердить, что результат можно использовать, прежде чем использовать его. Стандартная библиотечная функция IsError
возвращает true с аргументом Variant/Error
, поэтому здесь:
If IfError(cottageId) Then
'...
End If
Попробуйте изменить его на:
If IsError(cottageId) Then
'...
End If
Это делает ваш поток управления выглядит примерно так:
For i = 1 To iterations
Dim result As Variant
result = Evaluate("complicated Excel formula string")
If Not IsError(result) Then
'TODO process valid result here
Exit For 'we're done, no need to keep looping
End If
Next
Рассмотрите возможность прислушаться к совету Даррена хотя: кажется, Range.Find
может быть здесь лучшим инструментом. L oop logi c остается прежним: последнее, что вам нужно, это GoTo
-прыгать и увеличивать i
до тех пор, пока счетчик не переполнит свой тип данных - с помощью For
l oop вы можете ограничить максимум количество попыток, сверх которого вы просто должны признать, что не нашли совпадения для данного cottage_size
; Range.Find
/ Range.FindNext
есть механизмы, которые уже реализуют это за вас.