2009-11-25 28 views
5

我正在尋找一個優雅的解決方案來確定一個變體是否是VBA中的整數。不幸的是,如果變體是從一個字符串創建的,我就卡住了。這裏有一個小測試腳本:如何確定變體是否爲VBA中的整數?

dim v as variant 
v = "42" 
if v <> round(v) then 
    msgBox("<>") 
end if 

這裏,MSGBOX彈出,可能是因爲該變種是從一個字符串創建,雖然我本來期望V至是= ROUND(V)。

+2

可能值得問問自己,如果你真的需要處理任何變體和任何整數。 1000字符串怎麼樣?在長範圍之外積分雙打怎麼樣?如果你確切地說明你需要什麼,然後編碼,那將會容易得多。這不是同一個問題,但看到這個答案由埃裏克利珀特在這裏的另一個問題在Stackoverflow:http://stackoverflow.com/questions/921180/c-round-up/926806#926806 – jtolle 2009-11-25 18:52:20

回答

9

你應該寫類似:

if cDbl(v) <> round(cDbl(v)) Then 

凡cDbl是一個函數的數據轉換爲雙類型號。在調用cDbl函數之前,您可能不得不使用isNumeric()函數將v轉換爲數字的情況。你甚至可以使用CInt函數爲您比較:

if isnumeric(v) then 
    if cDbl(v) - cInt(v) <> 0 Then 
    .... 
    endif 
else 
    debug.print "data cannot be converted to a number" 
endif 
+0

這在某些情況下不會工作,例如: Dim v As Currency v = -123456.0000006 – Fionnuala 2009-11-25 11:51:11

+1

嗯,我的主張更像'寫這樣的東西'而不是'這是有保證的防彈代碼',但主要想法在這裏,即使它需要一些額外的測試。 – 2009-11-25 15:09:00

+1

我很抱歉,但我不得不說-1,即使給出了關於「類似的事情」的警告。你編寫的任何答案都有錯誤。如果您提供代碼,它應該是正確的,不要將bug作爲練習。 – jtolle 2009-11-25 18:42:52

3
Sub test() 

    Dim v As Variant 
    v = "42" 
    If Val(v) <> Int(Val(v)) Then 
     MsgBox ("<>") 
    End If 

End Sub 

如果使用瓦爾(),它會盡力轉換爲數字。如果它不能,那麼它將返回零並且Val(v)將總是等於Int(Val(v))。

相關問題