请考虑以下代码段。它将相同的公式写入两个单元格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
来计算/执行公式,因此公式从公式栏中消失。有关支持性参考,请参阅hiding formulas from formula bar。
现在,添加另一个带块
With Range("A3")
.Formula = "=1+1"
End With
Range("A4") = Evaluate(Range("A3").Formula)
您向单元格A3
添加公式,然后新单元格公式Evaluated()
进入另一个单元格A4
。结果如图所示
我认为上述类型的展示.Value = .Value
和Evaluate()
做同样的事情。
但是,下面的代码使用上述两种方法从已关闭的工作簿中提取值。我为此示例创建了一个工作簿book9.xlsm
,并在单元格A1中放置了hello
。 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
来评估公式,并通过将结果替换为公式来隐藏公式。
范围(" A3")与第一个with
块相同。
现在(A4
)我遵循与第一个示例相同的原则(此问题中的第一个片段)到Evaluate()
公式但是这次它不起作用。
请查看每个激活的细胞值和每个的公式栏
现在,我不能说.Value = .Value
等于Evaluate()
。
Evalutate()的评论说它可以与公式一起使用。但在示例中,我已经表明它不起作用。
Evaluate()
中用作参数的公式是否受限制?我一直认为Evaluate非常强大,但事实证明.Value = .Value
实际上更强大。即使它们非常相似,但它们在某种程度上是不同的(但我认为这可能是我的错,因为我为这个例子选择的公式可能受到限制或限制)。我想我已经展示了让他们两个在同一时间相似和不同的原因。它仍然是50%/ 50%,我无法确切地说它们是否相同。如果有人能够解释这里缺少什么,那就太好了。
答案 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 = .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属性可以是数字,字符串,错误等。当它是数字时,它可能是错误的数字,这不是公式中的正确结果该单元格(例如,因为您已禁用自动计算)。因此.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
的目的是允许评估动态创建的公式,而无需将公式写入单元格。如果传递了一个公式,它也应该返回一个结果,即使关闭了工作簿计算,但是如果传递一个名称,我希望它返回一个单元格的当前值,如果工作簿计算关闭,那么该值可能不会反映引用单元格的预期值。
大概是因为单元格的.Value
和Evaluate()
可以返回不同的结果,工作表公式评估引擎和Application.Evaluate()
引擎是不同的,或者至少有一些不同的元素。< / p>
答案 3 :(得分:0)
评估是一种功能 在函数之后使用后跟点(。)的东西,称为属性。所以“.Value”,“。Formula”,“。Text”是您在这里使用的Range的属性。
不要混淆这两件事。
函数接受输入,使用其输入变量执行操作并返回结果。它适用于配置它的数据类型。
.value是一个不依赖于数据类型的通用属性。它可以是字符串,数字,浮点数等等。
所以有可能你从1得到错误,其他工作绝对没问题。