2012-04-04 234 views
8

在Excel VBA中,Range("A1").Value应返回工作表上范围A1的基础值。但是,如果单元格被格式化为会计,我会得到不同的值。Excel VBA:获取单元格的值,与单元格的格式无关

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

工作表

创建一个新的文件,在单元格中输入以下值:

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

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

VBA

创建一个新的模块,并添加以下功能:

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

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

工作表

返回到工作表。输入下列值:

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

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

A3=A1=A2)中的表达式正在访问实际潜在价值A1A2。如何在VBA中访问这些值?

+0

我使用的是Excel 2010,'B3'肯定会出现'FALSE'。 – Joe 2012-04-04 23:55:04

+0

猜猜它不会重新计算,如果你只改变格式... – 2012-04-05 00:02:54

回答

12

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

重新编辑B2。

得到你需要使用哪个似乎忽视了格式化Value2属性的基本价值:

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

哦,这是鬼祟的。 – uotonyh 2012-04-04 23:59:12

+0

+1好洞察 – brettdj 2012-04-05 04:39:45

4

使用VBA和价值超过4个小数分货币格式的单元格的问题是由this post at Dick's blog覆盖好

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

将某些内容设置为日期或货币格式时,实际上会更改 底层数据类型(存储在值属性中的值的值)。 说到日期格式,这是语义,因为您可以在日期和双精度数据类型之间切换,而不会对 数据进行任何更改。与货币数据类型不太一样。货币只有 支持小数点后第四位,因此将小数点后面的小数点后面堵上一个Double,例如五个小数点后面会显示一个不同的数字。

+0

不错的链接...... – 2012-04-05 04:38:11

+1

感谢您找到解释 – JMax 2012-04-05 07:18:23