编辑 2017/01/28 以适应一些非布尔条件参数
注意:如果您只需要根据布尔值选择一个字符串,请使用 Polinominal 的 answer 中的代码。它比这个答案中的代码更简单、更快。
对于一个简单但更“灵活”的解决方案,此代码(此答案中的原始代码)应处理通常的基本场景
Function IIf( Expression, TruePart, FalsePart)
Dim bExpression
bExpression = False
On Error Resume Next
bExpression = CBool( Expression )
On Error Goto 0
If bExpression Then
If IsObject(TruePart) Then
Set IIf = TruePart
Else
IIf = TruePart
End If
Else
If IsObject(FalsePart) Then
Set IIf = FalsePart
Else
IIf = FalsePart
End If
End If
End Function
If 使用Cbool 函数尝试将传递的Expression 参数转换为布尔值,并接受TrueValue 和FalseValue 参数中的任何类型的值。对于一般用途,这是快速、安全且完全符合记录的 VBScript 行为。
此代码的唯一“问题”是CBool 的行为对于某些数据类型并不完全“直观”,至少对于那些我们在 vbscript 和 javascript 之间不断变化。虽然数值是一致的(0 是 False,任何其他数值都是 True),但非数值类型会生成运行时错误(在前面的代码中处理为 false),除非它是带有数字内容,或者可以在英语或操作系统区域设置中解释为真或假值。
如果您需要它,VBScript 版本 “等效” 到 ? javascript 三元运算符是
Function IIf( Expression, TruePart, FalsePart )
Dim vType, bExpression
vType = VarType( Expression )
Select Case vType
Case vbBoolean : bExpression = Expression
Case vbString : bExpression = Len( Expression ) > 0
Case vbEmpty, vbNull, vbError : bExpression = False
Case vbObject : bExpression = Not (Expression Is Nothing)
Case vbDate, vbDataObject : bExpression = True
Case Else
If vType > 8192 Then
bExpression = True
Else
bExpression = False
On Error Resume Next
bExpression = CBool( Expression )
On Error Goto 0
End If
End Select
If bExpression Then
If IsObject( TruePart ) Then
Set IIf = TruePart
Else
IIf = TruePart
End If
Else
If IsObject( FalsePart ) Then
Set IIf = FalsePart
Else
IIf = FalsePart
End If
End If
End Function
但与使用的版本无关,请注意,您正在调用一个函数,而不是使用三元运算符。您在 FalsePart 的 TruePart 中放入的任何代码或函数调用都将独立于条件值执行。所以这段代码
value = IIf( 2 > 3 , DoSomething(), DontDoSomething() )
将执行这两个函数。只有正确的值才会返回到value var。