在Excel VBA中,Range("A1").Value
应返回工作表上范围A1的基础值。但是如果单元格格式化为Accounting,我会得到不同的值。
如何获得单元格的实际基础值?
工作表
制作新文档,在单元格中输入以下值:
正如您所期望的那样,A3会产生TRUE
。现在使用2个小数位将A2的格式更改为Accounting。 A2现在读取$ 0.00
,但基础值仍为0.00001
,因此A3仍为TRUE
。
VBA
制作一个新模块并添加以下功能:
Function f(addr As String)
f = Range(addr).Value
End Function
如您所见,这只是使用Value
对象的Range
方法获取范围的值。
工作表
返回工作表。输入以下值:
A1
和A2
具有相同的基础值,但B1
和B2
没有,即使它们都是使用Value
计算的A1
和A2
的方法。
A3
(=A1=A2
)中的表达式正在访问A1
和A2
的实际基础值。如何在VBA中访问这些值?
答案 0 :(得分:13)
它最初对我来说也是正确的,因为我在输入公式后添加了格式。
重新编辑B2。
要获取基础值,您需要使用VALUE2属性,这似乎忽略了格式:
Function f(addr As String)
f = Range(addr).Value2
End Function
答案 1 :(得分:4)
如果在Excel中的未格式化单元格中键入数字,则该数字为 存储在Double数据类型中。格式化该数字时,显示 它以特定的方式,但你不改变数字。例如, 如果将数字1格式化为逗号样式,则得到1.00。该 基础数据仍然是1,你只是以不同的方式显示它。该 日期格式和货币格式是此规则的两个例外。
当您将某些内容格式化为日期或货币时,实际上会更改 基础数据类型(存储在Value属性中的值)。 说到Date格式,这是语义,因为你可以 在Date和Double数据类型之间切换而不做任何更改 数据。与货币数据类型不同。货币仅限 支持四个小数位,所以用Double,例如五个来阻塞Double 将小数字转换为货币数据类型将导致不同的数字。