我无法理解为什么这有效:
Function ToNumber(ByVal sVal As String) As Double
sVal = Replace(sVal, ",", ".")
If IsNumeric(sVal) Then
ToNumber = CDbl(sVal)
Else
ToNumber = 0
End If
End Function
虽然这个没有(我得到类型不匹配):
Function ToNumber(ByVal sVal As String) As Double
sVal = Replace(sVal, ",", ".")
ToNumber = IIf(IsNumeric(sVal), CDbl(sVal), 0)
End Function
正式地说它们应该是等同的。谢谢。
答案 0 :(得分:1)
不幸的是,VBA将评估Iif
中的两个参数。在您的情况下,CDbl(sVal)
会为您提供类型不匹配,因为即使IsNumeric(sVal)
为False
,也会对其进行评估。
您最好的选择是保留If
,Else
,End If
结构。或者,你可以这样做(保留评论,因为代码很复杂):
Function ToNumber(ByVal sVal As String) As Double
'note that (1) the error handling is reset to that in the caller
' when the function exits.
' (2) ToNumber is zero by default
On Error Resume Next
ToNumber = CDbl(Replace(sVal, ",", "."))
End Function
(这与Java,C和C ++中的三元不同,其中只评估其中一个表达式。)
答案 1 :(得分:0)
在语句IIf(IsNumeric(sVal), CDbl(sVal), 0)
中,无论IsNumeric的结果如何,都会评估CDbl(sVal)
,并导致类型与运行时错误不匹配。