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

10

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

我如何获取单元格的实际基础值?

工作表

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

  • 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中访问这些值?


我正在使用Excel 2010,而且“B3”肯定是“FALSE”。 - Joe
猜测如果你只改变格式,它不会重新计算... - DJ.
2个回答

13

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

要重现 - 重新编辑B2。

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

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

4
使用VBA和值(Value)处理货币格式化单元格超过4个小数点的问题已经在迪克(Dick)博客的这篇文章中得到很好地解决。
如果您在Excel中的未格式化单元格中输入一个数字,那么该数字将存储在Double数据类型中。当您对该数字进行格式化时,您以特定的方式显示它,但并不更改该数字。例如,如果您将数字1格式化为逗号样式,则会得到1.00。底层数据仍然是1,只是以不同的方式显示出来。日期格式和货币格式是两个例外。
当您将某物格式化为日期或货币时,实际上会更改基础数据类型(存储在Value属性中的值)。当涉及到日期格式时,这是语义上的,因为您可以在不更改数据的情况下在日期和双精度(Double)数据类型之间切换。但货币数据类型则不同。货币仅支持四个小数位,因此将具有五个小数位的Double压入货币数据类型将导致不同的数字。

1
感谢您找到了这个解释。 - JMax

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接