繁体   English   中英

Excel VBA:获取单元格的值,独立于单元格的格式

[英]Excel VBA: get value of cell, independent of cell's formatting

在 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:

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

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

工作表

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

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

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

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

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

重现 - 重新编辑 B2。

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

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

使用 VBA 和 Value 以及超过 4 个小数点的货币格式单元格的问题在 Dick 的博客上的这篇文章中得到了很好的介绍

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM