У меня возникли проблемы с запуском цикла поиска внутри подпрограммы при вызове подпрограммы с использованием метода Application.Evaluate или ActiveSheet.Evaluate. Например, в приведенном ниже коде я определяю подпрограмму FindSub(), которая ищет лист для строки «xxx». Обычная функция CallSub() вызывает подпрограмму FindSub(), используя стандартную инструкцию Call и Evaluate.Почему VBA Find loop терпит неудачу при вызове из Evaluate?
Когда я запустил Call FindSub, все будет работать так, как ожидалось: каждый соответствующий адрес будет распечатан в ближайшее окно, и мы получим окончательное сообщение «Закончено», когда код будет выполнен. Однако, когда я делаю Application.Evaluate «FindSub()», выводится только адрес первого совпадения, и мы никогда не доходим до сообщения «Закончено». Другими словами, после строки Cells.FindNext возникает ошибка, так как цикл пытается оценить, следует ли продолжать, а выполнение программы прекращается без какой-либо ошибки времени выполнения.
Я бы ожидал, что и Call FindSub, и Application.Evaluate «FindSub()», чтобы получить те же результаты в этом случае. Может кто-нибудь объяснить, почему они этого не делают, и, если возможно, способ исправить это? Благодарю.
Примечание: В этом примере мне явно не нужно использовать Evaluate. Эта версия упрощена, чтобы просто сосредоточиться на конкретной проблеме, которую я испытываю в более сложной ситуации.
Sub CallSub()
Call FindSub
Application.Evaluate "FindSub()"
End Sub
Sub FindSub()
Dim rngFoundCell As Range
Dim rngFirstCell As Range
Set rngFoundCell = Cells.Find(What:="xxx", after:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
If Not rngFoundCell Is Nothing Then
Set rngFirstCell = rngFoundCell
Do
Debug.Print rngFoundCell.Address
Set rngFoundCell = Cells.FindNext(after:=rngFoundCell)
Loop Until (rngFoundCell Is Nothing) Or (rngFoundCell.Address = rngFirstCell.Address)
End If
Debug.Print "Finished up"
End Sub
Существует некоторая интересная дискуссия об ограничениях .Evaluate по этому вопросу: http://stackoverflow.com/questions/2611929/stop-vba-evaluate-from-calling-target-function-twice –
@Richard , который также задал автор этого вопроса =) –
@Joel, Ooops. Это меня не очень уважало. Спасибо :) Тем не менее, это хороший вопрос для других людей, чтобы просмотреть, если они сталкиваются с некоторыми. Оцените странность. –