.text,.value和.value2有什么区别?

我没有要求任何脚本的帮助,但我的问题是澄清。 最近我在Excel中做了很多VB脚本,所以我在这个问题上是指Excel。 .text,.value和.value2有什么区别? 像什么时候应该使用target.text,target.value和target.value2? 我从来没有使用value2选项,但仍然想知道它用于什么。

有时如果我使用.text它给了我一个错误,当我只检查或操作单元格内的文本时,我需要使用.value。 然后有时当我想我应该使用.value我得到一个错误,我需要使用.text。 通常它会接受或不接受问题,但有时它会有所作为。 我知道必须有一些逻辑,但我似乎无法弄清楚。

我也发现,如果你只是把它作为目标,而不指定.text或.value,它将开始工作,但是那么有人做的事最终会导致脚本错误,所以最好总是使用一个.something 。 我想我所问的是,如果有人能给我一些指导方针,经验法则,如何正确使用每一个,什么时候需要使用。

感谢解释家伙。 我有点更好理解。 他们都是很好的解释。 下面是我的一些代码工作的一个小例子。 我认为这应该是target.text,但它会错误,所以当我使用target.value它的工作。

If LCase(Target.Value) = LCase("HLO") And Target.Column = 15 Then Target.Value = "Higher Level Outage" End If 

我仍然有些困惑,因为当我想到价值或价值2时,特别是在你提供的答案之后,我认为他们只能用于数字。 然而,在我的例子中,我正在严格地谈论文本,这是我的脚本引用的很多东西(单元格中的文本,比数字更多)。

.Text为您提供了一个string,表示单元格在屏幕上显示的内容。 使用.Text通常是一个坏主意,因为你可以得到####

.Value2给你的单元格的基础值(可以是空的,string,错误,数字(双)或布尔值)

.Value会给出与.Value2相同的格式,除非单元格被格式化为货币或date,否则会给您一个VBA货币(可能会截断小数位)或VBAdate。

使用.Value或.Text通常是一个坏主意,因为您可能无法从单元格获得实际值,而且它们比.Value2慢

有关更广泛的讨论,请参阅我的文本vs值与值2

除了Bathsheba的第一个答案,MSDN信息除外:

。值
.Value2
。文本

您可以分析这些表格以更好地理解分析的属性之间的差异。

在这里输入图像描述

target.Value会给你一个Varianttypes

target.Value2会给你一个Varianttypes,但是一个Date被强制为一个Double

target.Text尝试强制转换为String并且如果基础Variant不能强制转换为Stringtypes,将会失败

最安全的事情就是这样

 Dim v As Variant v = target.Value 'but if you don't want to handle date types use Value2 

在尝试显式强制之前,使用VBA.VarType(v)检查变体的types。

关于C#中的约定。 假设您正在阅读包含date的单元格,例如2014-10-22。

使用时:

.Text ,您将获得date的格式化表示,如屏幕上的工作簿所示:
2014-10-22 。 此属性的types始终是string但不一定会返回满意的结果。

.Value ,编译器试图将date转换成DateTime对象: {2014-10-22 00:00:00}最可能只在阅读date时才有用。

.Value2 ,给你的细胞的真正的基础价值。 在date的情况下,这是一个date序列: 41934 。 根据单元格的内容,该属性可以有不同的types。 不过,对于date序列,types是double

所以你可以检索和存储一个单元格的值在dynamic ,variables或object但请注意,该值将始终有某种天生的types,你将不得不采取行动。

 dynamic x = ws.get_Range("A1").Value2; object y = ws.get_Range("A1").Value2; var z = ws.get_Range("A1").Value2; double d = ws.get_Range("A1").Value2; // Value of a serial is always a double