Excel VBA:获取单元格的值,与单元格的格式无关

在Excel VBA中, Range("A1").Value应返回工作表上范围A1的基础值。 但是,如果单元格格式为“会计”,则会得到不同的值。

我如何获得细胞的实际潜在价值?

工作表

创build一个新文档,在单元格中input以下值:

  • A1:0.00001
  • A2:= A1
  • A3:= A1 = A2

如你所料,A3结果为TRUE 。 现在将A2的格式更改为“记帐”,使用两位小数。 A2现在读取$ 0.00 ,但底层值仍然是0.00001 ,所以A3仍然是TRUE

VBA

新build一个模块并添加以下function:

 Function f(addr As String) f = Range(addr).Value End Function 

正如你所看到的,这只是使用Range对象的Value方法获取范围的Value

工作表

回到工作表。 input以下值:

  • B1:= f(“A1”)
  • B2:= f(“A2”)
  • B3:= B1 = B2

A1A2具有相同的底层值,但是B1B2不会,即使它们都是使用A1A2Value方法计算的。

A3=A1=A2 )中的expression式正在访问A1A2的实际底层值。 如何在VBA中访问这些值?

它最初对我来说也是TRUE,因为我在input公式后添加了格式。

重新编辑B2。

要获得基础值,您需要使用似乎忽略格式的VALUE2属性:

 Function f(addr As String) f = Range(addr).Value2 End Function 

使用VBA和Value与货币格式化单元格超过4位小数点的问题在Dick博客的这篇文章中有很好的介绍

如果您在Excel中的未格式化的单元格中键入一个数字,该数字存储在Double数据types。 当您格式化该号码时,您将以特定方式显示该号码,但不会更改号码。 例如,如果您将数字1格式化为逗号样式,则会得到1.00。 底层的数据仍然是1,你只是以不同的方式显示。 date格式和货币格式是这个规则的两个例外。

当您将某些东西格式化为date或货币时,您实际上会更改基础数据types(存储在Value属性中的值)。 当涉及到date格式时,这是语义的,因为您可以在数据types之间切换date和双精度,而不会对数据进行任何更改。 与货币数据types不太一样。 货币只支持小数点后四位 ,因此在一个货币数据types中干扰Double,例如五位小数将导致不同的数字。