[英]Excel VBA: get value of cell, independent of cell's formatting
在 Excel VBA 中, Range("A1").Value
应返回工作表上范围 A1 的基础值。 但如果单元格格式为会计,我会得到不同的值。
如何获得单元格的实际基础值?
工作表
创建一个新文档,在单元格中输入以下值:
如您所料,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
方法获取范围的值。
工作表
回到工作表。 输入以下值:
A1
和A2
具有相同的基础值,但B1
和B2
没有,即使它们都是使用A1
和A2
的Value
方法计算的。
A3
( =A1=A2
) 中的表达式正在访问A1
和A2
的实际基础值。 如何访问 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.