.text, .value和.value2之间的区别是什么?如何时应瞄准。文本、目标。价值和目标。Value2被使用?


当前回答

关于c#中的约定。假设您正在读取一个包含日期的单元格,例如2014-10-22。

当使用:

.Text,你将得到日期的格式化表示,如屏幕上的工作簿所示: 2014-10-22。此属性的类型始终是字符串,但可能并不总是返回令人满意的结果。

如果编译器试图将日期转换为DateTime对象,则最有可能只在读取日期时有用。

. value2给出了单元格的真实的底层值。在日期的情况下,它是一个日期序列:41934。此属性可以具有不同的类型,具体取决于单元格的内容。但是对于日期序列,类型是double。

因此,你可以在dynamic, var或object中检索并存储单元格的值,但请注意,值总是有某种固有类型,你必须对其进行操作。

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

其他回答

目标。Value会给你一个Variant类型

目标。Value2也会给你一个Variant类型,但是Date被强制为Double类型

目标。文本试图强制转换为字符串,如果底层变体不能强制转换为字符串类型,则会失败

最安全的做法是

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

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

除了Bathsheba的回答和MSDN信息之外:

value .Value2 。text

您可以分析下面的表,以更好地理解这三个属性之间的差异。

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

.Value2给出了单元格的底层值(可以是空的,字符串,错误,数字(double)或布尔值)

. value会给你与. value2相同的结果,除了如果单元格被格式化为货币或日期,它会给你一个VBA货币(可能会截断小数位)或VBA日期。

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

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

关于c#中的约定。假设您正在读取一个包含日期的单元格,例如2014-10-22。

当使用:

.Text,你将得到日期的格式化表示,如屏幕上的工作簿所示: 2014-10-22。此属性的类型始终是字符串,但可能并不总是返回令人满意的结果。

如果编译器试图将日期转换为DateTime对象,则最有可能只在读取日期时有用。

. value2给出了单元格的真实的底层值。在日期的情况下,它是一个日期序列:41934。此属性可以具有不同的类型,具体取决于单元格的内容。但是对于日期序列,类型是double。

因此,你可以在dynamic, var或object中检索并存储单元格的值,但请注意,值总是有某种固有类型,你必须对其进行操作。

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

.Text是格式化单元格的显示值;.Value是单元格的值,可能增加日期或货币指标;. value2是去除任何无关信息的原始底层值。

range("A1") = Date
range("A1").numberformat = "yyyy-mm-dd"
debug.print range("A1").text
debug.print range("A1").value
debug.print range("A1").value2

'results from Immediate window
2018-06-14
6/14/2018 
43265 

range("A1") = "abc"
range("A1").numberformat = "_(_(_(@"
debug.print range("A1").text
debug.print range("A1").value
debug.print range("A1").value2

'results from Immediate window
   abc
abc
abc

range("A1") = 12
range("A1").numberformat = "0 \m\m"
debug.print range("A1").text
debug.print range("A1").value
debug.print range("A1").value2

'results from Immediate window
12 mm
12
12

如果您正在处理单元格的值,那么读取原始的. value2比. value或. text略快。如果你正在定位错误,那么. text将返回类似#N/A的文本,并可以与字符串进行比较,而. value和. value2将会阻塞将其返回值与字符串进行比较。如果对数据应用了一些自定义单元格格式,那么在构建报表时. text可能是更好的选择。