.Value = .Value与VBA中的Evaluate()函数类似吗?

考虑下面的片段。 它将相同的公式写入两个单元格A1A2

 Sub Main() With Range("A1") .Formula = "=1+1" End With With Range("A2") .Formula = "=1+1" .Value = .Value End With End Sub 

第二个块使用.Value = .Value来计算/执行公式,因此公式从公式栏中消失。 请参阅公式栏中的隐藏公式以获得支持性参考。

.Value = .Value从栏中隐藏公式

现在,添加另一个块

 With Range("A3") .Formula = "=1+1" End With Range("A4") = Evaluate(Range("A3").Formula) 

您将公式添加到单元格A3然后新单元格的公式正在Evaluated()到另一个单元格A4 。 结果如图所示

评估单元格公式

我认为上面那种显示.Value = .ValueEvaluate()做同样的事情。

但是,下面的代码使用上述两种方法从封闭的工作簿中提取值。 我为这个例子创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但公式栏显示实际的.FormulaC:\...

第二个块使用上面演示的.Value = .Value来评估公式,并通过replace结果来隐藏公式。

范围(“A3”)与第一个块相同。

现在( A4 )我遵循与第一个例子(在这个问题中的第一个片段)相同的原则来Evaluate()公式但是这一次是行不通的。

请查看所有激活的单元格值和公式栏

结果

所以现在我不能说.Value = .Value等于Evaluate()

Evalutate()的评论说,它可以与公式一起使用。 但在这个例子中,我已经certificate它不起作用。

评估()msdn

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 = .ValueEvaluate()是不同的。

我认为你对对象及其默认属性有一些困惑。

永远记住这两个概念:

  1. VBA允许您在不指定对象的情况下使用属性和方法。 VBA将使用它们的默认对象。 例如,当您使用Evaluate()您实际上使用Sheet1.Evaluate()

  2. 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的目的是允许Evaluatedynamic创build的公式,而不必将公式写入单元格。 如果传递公式,它应该也返回一个结果,即使工作簿计算closures,但如果传递一个名称,我希望它返回一个单元格的当前值,如果工作簿计算closures,该值可能不反映引用单元格的期望值。

据推测,由于单元格的值和Evaluate()可能返回不同的结果,因此工作表公式评估引擎和Application.Evaluate()引擎是不同的,或者至less有一些不同的元素。

Evaluate是一个函数而一个函数后面跟着一个点(。),被称为属性。 所以“.Value”,“。Formula”,“。Text”是你在这里使用的Range的属性。

不要混淆这两件事。

函数接受input,使用其inputvariables执行操作并返回结果。 它适用于configuration的数据types。

.value是一个不依赖于数据types的generics属性。 它可以是string,数字,浮动或其他。

所以有可能你从1和其他工作得到的错误绝对好。