Как правило, функция Evaluate Excel VBA - это удобный способ получить результат формулы рабочей таблицы в VBA без необходимости вводить формулу в ячейку рабочего листа. Тем не менее, я нахожу, что если формула, подлежащая оценке, является функцией MATCH, работающей через несколько столбцов, она удивительно медленная - МНОГО медленнее, чем вычисление той же формулы в ячейке рабочего листа. Например:Вычислить функцию медленно с помощью функции листа со списком ссылок, ссылающихся на несколько столбцов
MatchingRow = EVALUATE(MATCH(Sheet1!G6&Sheet1!H6&Sheet1!I6,Sheet2!B:B&Sheet2!C:C&Sheet2!D:D,0))
Любая идея, почему это было бы намного медленнее, чем это, в ячейке рабочего листа?
=MATCH(Sheet1!G6&Sheet1!H6&Sheet1!I6,Sheet2!B:B&Sheet2!C:C&Sheet2!D:D,0)
Я уверен, что я могу услышать кого-то уже набирает ответ говорят, что это все из-за накладные расходы вызова функции рабочего листа из среды VBA. Но если это так, мой следующий вопрос: Почему не ОЦЕНКА медленная для других функций тоже?
Если бы я должен был догадаться, это потому, что EVALUATE обрабатывает вашу формулу так, как будто это формула массива. Целые столбцы (например, Sheet2! B: B & Sheet2! C: C & 'Sheet2! D: D) замедляют его. В качестве теста попробуйте установить, чтобы ссылки на все столбцы были ближе к фактическим диапазонам, которые необходимо оценить, и посмотрите, улучшаете ли вы производительность. – sous2817
Взгляните на [это] (https://fastexcel.wordpress.com/2011/11/02/evaluate-functions-and-formulas-fun-how-to-make-excels-evaluate-method-twice-as -fast /) Чарльз Уильямс. Среди других интересных наблюдений он поддерживает, что «Application.Evaluate» вызывается дважды (это ошибка) по сравнению с «Worksheetfunction.Evaluate». – Ioannis
sous2817: спасибо, что улучшена производительность примерно в 10 000 раз. –