.Value = .Value的行为类似于VBA中的Evaluate()函数吗?

时间:2013-07-19 12:04:42

标签: excel function vba comparison evaluate

请考虑以下代码段。它将相同的公式写入两个单元格A1A2

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来计算/执行公式,因此公式从公式栏中消失。有关支持性参考,请参阅hiding formulas from formula bar

.Value = .Value hides the formula from bar

现在,添加另一个带块

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

您向单元格A3添加公式,然后新单元格公式Evaluated()进入另一个单元格A4。结果如图所示

Evaluate cells formula

我认为上述类型的展示.Value = .ValueEvaluate()做同样的事情。

但是,下面的代码使用上述两种方法从已关闭的工作簿中提取值。我为此示例创建了一个工作簿book9.xlsm,并在单元格A1中放置了hellobook9.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来评估公式,并通过将结果替换为公式来隐藏公式。

范围(" A3")与第一个with块相同。

现在(A4)我遵循与第一个示例相同的原则(此问题中的第一个片段)到Evaluate()公式但是这次它不起作用。

请查看每个激活的细胞值和每个的公式栏

results

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

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

Evaluate() msdn

Evaluate()中用作参数的公式是否受限制?我一直认为Evaluate非常强大,但事实证明.Value = .Value实际上更强大。即使它们非常相似,但它们在某种程度上是不同的(但我认为这可能是我的错,因为我为这个例子选择的公式可能受到限制或限制)。我想我已经展示了让他们两个在同一时间相似和不同的原因。它仍然是50%/ 50%,我无法确切地说它们是否相同。如果有人能够解释这里缺少什么,那就太好了。

4 个答案:

答案 0 :(得分:8)

.value和Evaluate不相同。
Excel为每个使用过的单元格维护一个值和一个公式字符串,您可以使用Range.Value和Range.Formula单独获取这两个值。
当您使用Application.Evaluate来计算字符串时,字符串将被计算为活动工作表上的公式(因此实际上最好使用Worksheet.Evaluate而不是Application.Evaluate,并且它也更快)。
使用Rng1 .Value = Rng2.Value将Rng2中的值复制到Rng1并覆盖Rng1的公式。
使用Rng1.Value = Evaluate(rng2.Formula)要求Excel从rng2中检索公式字符串,对其进行评估并返回结果为Rng1。

评估方法的工作方式与单元格中的公式完全不同:它有许多“怪癖”需要注意(包括它没有使用引用外部封闭工作簿的公式):请参阅my blog post for details
通常更好地使用.Value2而不是.Value:请参阅Value vs Value2 for details

答案 1 :(得分:1)

.Value = .ValueEvaluate()不同。

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

始终牢记这两个概念:

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

  2. VBA允许您在不指定属性的情况下使用对象。 VBA将使用其默认属性。例如,当您使用Range("A1") = 1时,实际使用Range("A1").Formula = 1。 (您实际使用Sheet1.Range("A1").Formula = 1!)

  3. 回到您的示例,当您执行.Value = .Value时,您确实Range("A2").Value = Range("A2").Value。单元格的Value属性可以是数字,字符串,错误等。当它是数字时,它可能是错误的数字,这不是公式中的正确结果该单元格(例如,因为您已禁用自动计算)。因此.Value = .Value相当于.Formula = "<xxx>",其中<xxx>是在单元格上计算的最后一个值。

    执行Range("A4") = Evaluate(Range("A3").Formula)时,要求Excel评估公式并将结果分配给范围A4的Formula属性(因为公式属性是范围对象的默认属性。)< / p>

答案 2 :(得分:1)

.Value = .Value(在单元格的With块内)只需将单元格的值设置为其当前值,覆盖并删除其公式(如果有)。 .Value属性仅表示单元格的当前值。如果单元格包含尚未计算的公式,例如如果计算已关闭,则可能不会返回公式结果,而是返回单元格的先前值。

Excel.Application.Evaluate获取一个字符串值,将字符串的内容评估为公式或单元格的名称,并返回该单元格或公式的值。如果您传递一个无法映射到Excel单元格名称或不是有效公式的字符串,您将收到错误。 Evaluate的目的是允许评估动态创建的公式,而无需将公式写入单元格。如果传递了一个公式,它也应该返回一个结果,即使关闭了工作簿计算,但是如果传递一个名称,我希望它返回一个单元格的当前值,如果工作簿计算关闭,那么该值可能不会反映引用单元格的预期值。

大概是因为单元格的.ValueEvaluate()可以返回不同的结果,工作表公式评估引擎和Application.Evaluate()引擎是不同的,或者至少有一些不同的元素。< / p>

答案 3 :(得分:0)

评估是一种功能 在函数之后使用后跟点(。)的东西,称为属性。所以“.Value”,“。Formula”,“。Text”是您在这里使用的Range的属性。

不要混淆这两件事。

函数接受输入,使用其输入变量执行操作并返回结果。它适用于配置它的数据类型。

.value是一个不依赖于数据类型的通用属性。它可以是字符串,数字,浮点数等等。

所以有可能你从1得到错误,其他工作绝对没问题。