2009-11-25 81 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))。