2012-04-04 161 views
8

在Excel VBA中,Range("A1").Value應返回工作表上範圍A1的基礎值。但是,如果單元格被格式化爲會計,我會得到不同的值。Excel VBA:獲取單元格的值,與單元格的格式無關

我該如何獲得細胞的實際潛在價值?

工作表

創建一個新的文件,在單元格中輸入以下值:

  • 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 

正如你所看到的,這只是獲取使用Range對象的Value方法的一個範圍內的值。

工作表

返回到工作表。輸入下列值:

  • B1:= F( 「A1」)
  • B2:= F( 「A2」)
  • B3:= B1 = B2

A1A2具有相同的基礎價值,但B1B2不會,即使它們都使用A1A2Value方法計算。

A3=A1=A2)中的表達式正在訪問實際潛在價值A1A2。如何在VBA中訪問這些值?

+0

我使用的是Excel 2010,'B3'肯定會出現'FALSE'。 – Joe 2012-04-04 23:55:04

+0

猜猜它不會重新計算,如果你只改變格式... – 2012-04-05 00:02:54

回答

12

它最初對我來說也是TRUE,因爲我在輸入公式後添加了格式。

重新編輯B2。

得到你需要使用哪個似乎忽視了格式化Value2屬性的基本價值:

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

哦,這是鬼祟的。 – uotonyh 2012-04-04 23:59:12

+0

+1好洞察 – brettdj 2012-04-05 04:39:45

4

使用VBA和價值超過4個小數分貨幣格式的單元格的問題是由this post at Dick's blog覆蓋好

如果您在Excel中輸入未格式化的單元格中的數字,則該數字將存儲在Double數據類型中的 。當您格式化該號碼時,您會以特定方式顯示 ,但不會更改號碼。例如,如果您將數字1格式化爲逗號樣式,則爲 ,則會得到1.00。底層數據仍然是1,你只是以不同的方式展示它。日期格式和貨幣格式是此規則的兩個例外。

將某些內容設置爲日期或貨幣格式時,實際上會更改 底層數據類型(存儲在值屬性中的值的值)。 說到日期格式,這是語義,因爲您可以在日期和雙精度數據類型之間切換,而不會對 數據進行任何更改。與貨幣數據類型不太一樣。貨幣只有 支持小數點後第四位,因此將小數點後面的小數點後面堵上一個Double,例如五個小數點後面會顯示一個不同的數字。

+0

不錯的鏈接...... – 2012-04-05 04:38:11

+1

感謝您找到解釋 – JMax 2012-04-05 07:18:23