Рассмотрим следующий фрагмент. Он записывает одну и ту же формулу в две ячейки A1
и A2
.
Sub Main()
With Range("A1")
.Formula = "=1+1"
End With
With Range("A2")
.Formula = "=1+1"
.Value = .Value
End With
End Sub
Второй блок with
использует .Value = .Value
, который вычисляет/выполняет формулу, поэтому формула исчезает из строки формул. Обратитесь к скрытие формул из панели формул для дополнительной справки.
Теперь добавьте еще один блок
With Range("A3")
.Formula = "=1+1"
End With
Range("A4") = Evaluate(Range("A3").Formula)
Вы добавляете формулу в ячейку A3
, а затем формула этой новой ячейки Evaluated()
переносится в другую ячейку A4
. Результаты, как показано
Я думаю, что приведенное выше показывает, что .Value = .Value
и Evaluate()
делают одно и то же.
Однако приведенный ниже код извлекает значение из закрытой книги, используя два упомянутых подхода. Я создал рабочую книгу book9.xlsm
для этого примера с hello
, помещенным в ячейку A1. book9.xlsm
— это тот, из которого я буду получать значение A1
. Рассмотрим код
Sub PullValue()
With Range("A1")
.Formula = "='C:\Users\admin\Desktop\[book9.xlsm]Sheet1'!A1"
End With
With Range("A2")
.Formula = "='C:\Users\admin\Desktop\[book9.xlsm]Sheet1'!A1"
.Value = .Value
End With
Range("A3").Formula = "='C:\Users\admin\Desktop\[book9.xlsm]Sheet1'!A1"
Range("A4") = Evaluate(Range("A3").Formula)
End Sub
Первый блок with
помещает формулу в значение A1
ячейки из блока book9.xlsm
. Он выполняется, поэтому полученное значение равно hello
, но в строке формул отображается фактическое .Formula
, которое равно C:\...
.
Второй блок with
использует .Value = .Value
, как показано выше, для оценки формулы и скрытия формулы путем замены ее результатом.
Range("A3") совпадает с первым блоком with
.
И теперь (A4
) я следую тому же принципу, что и в первом примере (первый фрагмент в этом вопросе) к Evaluate()
формуле, однако на этот раз она не работает.
Пожалуйста, просмотрите все значения активированных ячеек и строку формул для каждой из них.
Так что теперь я не могу сказать, что .Value = .Value
равно Evaluate()
.
Примечания Evalutate() говорят, что его можно использовать с формулами. Но в примере, который я показал, это не работает.
Ограничены ли формулы, используемые в качестве параметров в Evaluate()
? Я всегда думал, что функция Evaluate очень мощная, но оказалось, что .Value = .Value
на самом деле еще мощнее. Несмотря на то, что они очень похожи, они чем-то отличаются (но я считаю, что это может быть моя ошибка, поскольку формула, которую я выбрал для этого примера, может быть ограниченной или ограниченной). Думаю, я показал, что делает их двумя похожими и разными одновременно. Это все еще примерно 50%/50%, и я не могу точно сказать, одинаковы они или нет. Было бы здорово, если бы кто-нибудь смог объяснить, чего здесь не хватает.