如果正在工作,等效的Iif不会

时间:2014-04-10 10:49:13

标签: excel-vba excel-2010 vba excel

我无法理解为什么这有效:

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

正式地说它们应该是等同的。谢谢。

2 个答案:

答案 0 :(得分:1)

不幸的是,VBA将评估Iif中的两个参数。在您的情况下,CDbl(sVal)会为您提供类型不匹配,因为即使IsNumeric(sVal)False,也会对其进行评估。

您最好的选择是保留IfElseEnd 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),并导致类型与运行时错误不匹配。