.text, .value和.value2之间的区别是什么?如何时应瞄准。文本、目标。价值和目标。Value2被使用?
当前回答
.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可能是更好的选择。
其他回答
. text为您提供一个字符串,表示单元格在屏幕上显示的内容。使用.Text通常是一个坏主意,因为你可能会得到####
.Value2给出了单元格的底层值(可以是空的,字符串,错误,数字(double)或布尔值)
. value会给你与. value2相同的结果,除了如果单元格被格式化为货币或日期,它会给你一个VBA货币(可能会截断小数位)或VBA日期。
使用.Value或.Text通常是一个坏主意,因为你可能无法从单元格中获得真正的值,而且它们比.Value2慢
有关更广泛的讨论,请参阅我的文本vs值vs Value2
出于好奇,我想看看Value对Value2的执行情况。在进行了大约12次类似的测试后,我没有看到速度上有任何显著的差异,所以我总是推荐使用Value。我使用下面的代码运行了一些不同范围的测试。
如果有人看到任何与性能相反的东西,请发帖。
Sub Trial_RUN()
For t = 0 To 5
TestValueMethod (True)
TestValueMethod (False)
Next t
End Sub
Sub TestValueMethod(useValue2 As Boolean)
Dim beginTime As Date, aCell As Range, rngAddress As String, ResultsColumn As Long
ResultsColumn = 5
'have some values in your RngAddress. in my case i put =Rand() in the cells, and then set to values
rngAddress = "A2:A399999" 'I changed this around on my sets.
With ThisWorkbook.Sheets(1)
.Range(rngAddress).Offset(0, 1).ClearContents
beginTime = Now
For Each aCell In .Range(rngAddress).Cells
If useValue2 Then
aCell.Offset(0, 1).Value2 = aCell.Value2 + aCell.Offset(-1, 1).Value2
Else
aCell.Offset(0, 1).Value = aCell.Value + aCell.Offset(-1, 1).Value
End If
Next aCell
Dim Answer As String
If useValue2 Then Answer = " using Value2"
.Cells(Rows.Count, ResultsColumn).End(xlUp).Offset(1, 0) = DateDiff("S", beginTime, Now) & _
" seconds. For " & .Range(rngAddress).Cells.Count & " cells, at " & Now & Answer
End With
End Sub
除了Bathsheba的回答和MSDN信息之外:
value .Value2 。text
您可以分析下面的表,以更好地理解这三个属性之间的差异。
.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可能是更好的选择。
目标。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)检查变量的类型。