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

Chr*_*ris 166 excel vba

我不是要求任何脚本的帮助,但我的问题是要澄清.最近我在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
Run Code Online (Sandbox Code Playgroud)

我仍然有点困惑,因为当我想到价值或价值2时,特别是在你提供的答案之后,我认为它们只应该用于数字.但是,在我的例子中,我正在谈论严格的文本,这是我的脚本所指的很多(单元格中的文本,比数字更多).

Cha*_*ams 221

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

.Value2 为您提供单元格的基础值(可以为空,字符串,错误,数字(双精度)或布尔值)

.Value 给出与.Value2相同的除外,如果单元格被格式化为货币或日期,它会为您提供VBA货币(可能会截断小数位)或VBA日期.

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

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

  • 我可能会使用Format来控制数字如何转换为字符串:var = Format(Range("a1").Value2,"#") (5认同)
  • 很抱歉醒来这个oooooold帖子,但是当你需要的是一个`Date`时,我没有看到将`Date`强制转换为`Double`(使用`.Value2`)的优势.当您查看"Date"值时,不应该将`.Value`优于`.Value2`吗?链接的文章也没有那么清楚.性能因为没有转换?当然,但是如果你的VBA代码正在使用'Date`,那么你将失去自己,隐式或明确执行转换的优势...... [(上下文 - 随意加权)](https:// github.com/rubberduck-vba/Rubberduck/issues/3320) (3认同)
  • 我希望这不是一个单独的问题,而是:默认值是什么?OP模糊地声称遗漏text / value / value2是有问题的,但是可以肯定它默认为其中一个吗? (2认同)
  • @Mat's Mug - 问题是Excel没有真正的Date数据类型 - excel日期和时间只是双倍,取决于用户应用或更改的任何格式,以显示为日期,时间或货币或只是数.所以Value强制将Excel加倍到VBA日期,但是Value2没有做任何强制...对于将双精度强制转换为日期的日期可能不会造成任何损害,只要代码知道它依赖于可变格式:专业版并且有任何一种方式 - 我们真正需要的是更多本机Excel数据类型以避免此问题. (2认同)
  • 如果我想在不进行类型转换的情况下将一个单元格值设置为等于另一个单元格(例如,不将存储为文本的数字转换为数字),则使用以下格式:`Format $(Range.Value2,Range.NumberFormat)。 (2认同)

Kaz*_*wor 53

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

.Value
.Value2 .文字

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

在此输入图像描述

  • @Chris,始终使用`.Value`作为标准属性 - 用于文本和数字.当你想到日期和一些数字时,请使用`.Value2`.如果您需要在单元格/范围内保留任何格式,请始终使用`.Text`.所以,你的问题例子是否正确! (4认同)
  • 为什么日期从 10:12 更改为 10:05?错字? (2认同)
  • 我认为这只是生成结果和制作屏幕截图之间的时间 (2认同)

Bat*_*eba 24

target.Value会给你一个Variant类型

target.Value2会给你一个Variant类型,但是a会Date被强制给你Double

target.Text试图强制转换为a String并且如果底层Variant证书不能强制转换为String类型,则会失败

最安全的事情是这样的

Dim v As Variant
v = target.Value 'but if you don't want to handle date types use Value2
Run Code Online (Sandbox Code Playgroud)

VBA.VarType(v)在尝试显式强制之前,请检查变体的类型.


sil*_*ire 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
Run Code Online (Sandbox Code Playgroud)