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

时间:2012-04-04 23:39:43

标签: excel vba

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

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

工作表

制作新文档,在单元格中输入以下值:

  • A1:0.00001
  • A2:= A1
  • A3:= A1 = A2

正如您所期望的那样,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方法获取范围的值。

工作表

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

  • B1:= f(“A1”)
  • B2:= f(“A2”)
  • B3:= B1 = B2

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

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

2 个答案:

答案 0 :(得分:13)

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

重新编辑B2。

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

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

答案 1 :(得分:4)

this post at Dick's blog

涵盖了使用超过4位小数点的货币格式化单元格的VBA和值的问题
  

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

     

当您将某些内容格式化为日期或货币时,实际上会更改   基础数据类型(存储在Value属性中的值)。   说到Date格式,这是语义,因为你可以   在Date和Double数据类型之间切换而不做任何更改   数据。与货币数据类型不同。货币仅限   支持四个小数位,所以用Double,例如五个来阻塞Double   将小数字转换为货币数据类型将导致不同的数字。