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

如您所见,这只是使用对象的Value方法获取范围的值Range

工作表

回到工作表。输入以下值:

  • B1: =f("A1")
  • B2: =f("A2")
  • B3:=B1=B2

A1并且A2具有相同的基础价值,但B1B2不具有相同的基础价值,即使它们都是使用 和 的Value方法计算A1A2

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

4

2 回答 2

13

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

复制 - 重新编辑 B2。

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

Function f(addr As String)
    f = Range(addr).Value2
End Function
于 2012-04-04T23:58:26.240 回答
4

Dick 博客上的这篇文章很好地涵盖了将 VBA 和 Value 与超过 4 个小数点的货币格式单元格一起使用的问题

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

当您将某些内容格式化为日期或货币时,您实际上更改了基础数据类型(存储在 Value 属性中的值)。对于 Date 格式,这是语义,因为您可以在 Date 和 Double 数据类型之间切换,而无需对数据进行任何更改。与货币数据类型无关。Currency仅支持四位小数,因此将带有五位小数的 Double 插入 Currency 数据类型将导致不同的数字。

于 2012-04-05T01:57:27.503 回答