Я не знаю, как это остановить, но вы можете хотя бы узнать, когда это происходит в большинстве случаев. Это может быть полезно, если ваши вычисления занимают много времени или имеют побочные эффекты, которые вы не хотите, чтобы они происходили дважды, и вы хотите замкнуть их.
(РЕДАКТИРОВАТЬ: Чарльз Уильямс на самом деле имеет ответ на ваш конкретный вопрос. Мой ответ все еще может быть полезен, когда вы не знаете, какой тип данных вы можете получить, или когда вы ожидаете получить что-то вроде массива или диапазон.)
Если вы используете свойство Application.Caller
в подпрограмме, вызванной в результате вызова Application.Evaluate
, вы увидите, что один из вызовов поступил из верхней левой ячейки фактического диапазона Evaluate
вызов сделан, и один из ячейки $ A $ 1 листа, на котором находится диапазон. Если вы вызываете Application.Evaluate
из непосредственного окна, как если бы вы вызывали ваш пример Sub, один вызов появляется из верхней левой ячейки текущего выбранного диапазона и один из ячейки $ A $ 1 текущей рабочей таблицы. Я почти уверен, что в обоих случаях это первый звонок, который стоит $ A $ 1. (Я бы проверил это, если это имеет значение.)
Однако из Application.Evaluate
будет возвращено только одно значение. Я почти уверен, что это второй эвал. (Я бы тоже это проверил.)
Очевидно, что это не будет работать с вызовами из действительной ячейки $ A $ 1.
(Что касается меня, я хотел бы знать , почему происходит двойная оценка. Мне также хотелось бы знать, почему оценщик выставляется вообще. Кто-нибудь?)
РЕДАКТИРОВАТЬ: я спросил здесь о StackOverflow: Почему метод Excel Evaluate является оценщиком общих выражений?
Надеюсь, это поможет, хотя и не дает прямого ответа на ваш вопрос.