.Value = .Value与VBA中的Evaluate()函数类似吗?
考虑下面的片段。 它将相同的公式写入两个单元格A1
和A2
Sub Main() With Range("A1") .Formula = "=1+1" End With With Range("A2") .Formula = "=1+1" .Value = .Value End With End Sub
第二个块使用.Value = .Value
来计算/执行公式,因此公式从公式栏中消失。 请参阅公式栏中的隐藏公式以获得支持性参考。
现在,添加另一个块
With Range("A3") .Formula = "=1+1" End With Range("A4") = Evaluate(Range("A3").Formula)
您将公式添加到单元格A3
然后新单元格的公式正在Evaluated()
到另一个单元格A4
。 结果如图所示
我认为上面那种显示.Value = .Value
和Evaluate()
做同样的事情。
但是,下面的代码使用上述两种方法从封闭的工作簿中提取值。 我为这个例子创build了一个工作簿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
block从book9.xlsm
放入单元格的A1
值。 它得到执行,因此拉的值是hello
但公式栏显示实际的.Formula
是C:\...
第二个块使用上面演示的.Value = .Value
来评估公式,并通过replace结果来隐藏公式。
范围(“A3”)与第一个块相同。
现在( A4
)我遵循与第一个例子(在这个问题中的第一个片段)相同的原则来Evaluate()
公式但是这一次是行不通的。
请查看所有激活的单元格值和公式栏
所以现在我不能说.Value = .Value
等于Evaluate()
。
Evalutate()的评论说,它可以与公式一起使用。 但在这个例子中,我已经certificate它不起作用。
在Evaluate()
用作参数的公式是否受到限制? 我一直认为评估是非常强大的,但事实certificate, .Value = .Value
实际上更加强大。 尽pipe它们非常相似,但它们有些不同(但我认为这可能是我的错,因为我为这个例子select的公式可能受到限制或限制)。 我想我已经展示了什么使他们两个相似,不同在同一时间。 它仍然是50%/ 50%,我不知道它们是否相同。 如果有人能够解释这里缺less的东西,这将是非常好的。
.value和Evaluate是不一样的。
Excel为每个使用的单元维护一个值和一个公式string,并且可以使用Range.Value和Range.Formula独立地获取这两个值。
当您使用Application.Evaluate评估一个string时,string在活动工作表上被评估为一个公式(所以实际上最好使用Worksheet.Evaluate而不是Application.Evaluate,而且它的速度也更快)。
使用Rng1.Value = Rng2.Value将来自Rng2的值复制到Rng1中,并覆盖Rng1的公式。
使用Rng1.Value = Evaluate(rng2.Formula)要求Excel从rng2检索公式string,对其进行评估并将结果返回给Rng1。
Evaluate方法与单元格中的公式无法完全一样:它需要注意许多“怪癖”(包括它不适用于涉及外部封闭工作簿的公式):请参阅我的博客文章的细节
另外它通常更好地使用.Value2而不是.Value: 有关详细信息,请参阅值与值2
.Value = .Value
和Evaluate()
是不同的。
我认为你对对象及其默认属性有一些困惑。
永远记住这两个概念:
-
VBA允许您在不指定对象的情况下使用属性和方法。 VBA将使用它们的默认对象。 例如,当您使用
Evaluate()
您实际上使用Sheet1.Evaluate()
。 -
VBA允许你在不指定属性的情况下使用对象。 VBA将使用它们的默认属性。 例如,当你使用
Range("A1") = 1
你实际上使用Range("A1").Formula = 1
。 (你实际上使用Sheet1.Range("A1").Formula = 1
!)
回到你的例子,当你做.Value = .Value
你实际上做Range("A2").Value = Range("A2").Value
。 单元格的Value属性可以是一个数字,一个string,一个错误等。当它是一个数字时,它可能是错误的数字,这不是该单元格中公式的正确结果(例如,因为你已禁用自动计算)。 所以.Value = .Value
相当于.Formula = "<xxx>"
,其中<xxx>
是在单元格上计算的最后一个值。
当您执行Range("A4") = Evaluate(Range("A3").Formula)
您可以要求Excel计算公式并将结果赋值给范围A4的公式属性(因为公式属性是范围对象。)
.Value = .Value
(在一个单元格的With
块中)只是简单地将单元格的值设置为它的当前值,覆盖并删除它的公式,如果它有一个。 .Value
属性只是表示单元格的当前值。 如果单元格包含尚未计算的公式,例如,如果计算已closures,则可能不会返回公式结果,而是返回单元格的前一个值。
Excel.Application.Evaluate
接受一个string值,将string内容评估为公式或单元格的名称,并返回该单元格或公式的值。 如果您传递一个string不能被映射到一个Excel单元格名称或不是一个有效的公式,你会得到一个错误。 Evaluate
的目的是允许Evaluate
dynamic创build的公式,而不必将公式写入单元格。 如果传递公式,它应该也返回一个结果,即使工作簿计算closures,但如果传递一个名称,我希望它返回一个单元格的当前值,如果工作簿计算closures,该值可能不反映引用单元格的期望值。
据推测,由于单元格的值和Evaluate()
可能返回不同的结果,因此工作表公式评估引擎和Application.Evaluate()
引擎是不同的,或者至less有一些不同的元素。
Evaluate是一个函数而一个函数后面跟着一个点(。),被称为属性。 所以“.Value”,“。Formula”,“。Text”是你在这里使用的Range的属性。
不要混淆这两件事。
函数接受input,使用其inputvariables执行操作并返回结果。 它适用于configuration的数据types。
.value是一个不依赖于数据types的generics属性。 它可以是string,数字,浮动或其他。
所以有可能你从1和其他工作得到的错误绝对好。