我不是要求任何脚本的帮助,但我的问题是要澄清。最近我在Excel中做了很多VB脚本,所以我在这个问题上真的指的是Excel。 .text,.value和.value2有什么区别?我应该何时使用target.text,target.value和target.value2?我从未使用过value2选项,但仍想知道它的用途。
有时如果我使用.text,它会给我一个错误,当我只检查或操作单元格中的文本时,我需要使用.value。然后有时我认为我应该使用.value我得到一个错误,我需要使用.text。通常它接受或不接受问题,但有时它会产生影响。我知道必须有一些逻辑,但我似乎无法弄明白。
我还发现,如果你只是将它保留为目标而不指定.text或.value它最初会起作用,但是有人做的事情最终会导致脚本出错,因此最好使用a。它上面的东西。我想我要问的是,是否有人可以给我一些指导方针,经验法则,如何正确使用每一个以及何时需要使用它。
谢谢你们的解释。我更了解它。它们都是很好的解释。下面是我的一些代码的一个小例子。我认为它应该是target.text,但它会出错,所以当我使用target.value时它会起作用。
If LCase(Target.Value) = LCase("HLO") And Target.Column = 15 Then
Target.Value = "Higher Level Outage"
End If
我仍然有点困惑,因为当我想到价值或价值2时,特别是在你提供的答案之后,我认为它们只应该用于数字。但是,在我的例子中,我正在谈论严格的文本,这是我的脚本所指的很多内容(单元格中的文本,而不是数字)。
答案 0 :(得分:208)
.Text
为您提供一个字符串,表示单元格屏幕上显示的内容。使用.Text通常是一个坏主意,因为你可以得到####
.Value2
为您提供单元格的基础值(可以为空,字符串,错误,数字(双精度)或布尔值)
.Value
与.Value2相同,除非单元格格式为货币或日期,它为您提供VBA货币(可能会截断小数位)或VBA日期。
使用.Value或.Text通常是一个坏主意,因为你可能无法从单元格中获得实际值,并且它们比.Value2
慢。有关更广泛的讨论,请参阅我的Text vs Value vs Value2
答案 1 :(得分:51)
答案 2 :(得分:23)
target.Value
会为您提供Variant
类型
target.Value2
也会为您提供Variant
类型,但Date
会被强制转移到Double
target.Text
尝试强制转换为String
,如果基础Variant
无法强制转换为String
类型,则会失败
最安全的事情就像是
Dim v As Variant
v = target.Value 'but if you don't want to handle date types use Value2
在尝试显式强制之前,使用VBA.VarType(v)
检查变体的类型。
答案 3 :(得分:10)
关于C#中的约定。我们假设您正在阅读包含日期的单元格,例如2014年10月22日
使用时:
.Text
,您将获得日期的格式化表示形式,如屏幕上的工作簿中所示:
的 2014年10月22日即可。此属性的类型始终为string
,但可能无法始终返回令人满意的结果。
.Value
,编译器尝试将日期转换为DateTime
对象: {2014-10-22 00:00:00} 最有可能仅在阅读时有用日期。
.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
答案 4 :(得分:2)
.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可能是构建报告时更好的选择。
答案 5 :(得分:0)
出于好奇,我想看看Uncaught TypeError: Cannot read property 'enable' of undefined
at NewClass.addHooks (leaflet.draw.js:8)
at NewClass.enable (leaflet-src.js:5733)
at NewClass._enableLayerEdit (leaflet.draw.js:9)
at NewClass.eachLayer (leaflet.markercluster-src.js:494)
at NewClass.addHooks (leaflet.draw.js:9)
at NewClass.enable (leaflet-src.js:5733)
at NewClass.enable (leaflet.draw.js:9)
at HTMLAnchorElement.handler (leaflet-src.js:2660)
对Value
的表现。经过大约12个类似过程的试验,我发现速度没有任何显着差异,因此我总是建议使用Value2
。我使用以下代码运行了各种范围的测试。
如果有人发现与性能有任何相反之处,请发表。
Value