IIf(), es una función muy cómoda de vb, pero no es recomendable usarla en bucles o si se necesita especial agilidad porque es leeeenta.
La mía funciona exactamente igual, con la ventaja de que los argumentos en caso de ser Falso o Verdadero son opcionales.
Código
Option Explicit Public Static Function IIfEx(ByVal bolExpresion As Boolean, _ Optional ByRef varTruePart As Variant, _ Optional ByRef varFalsePart As Variant) As Variant If bolExpresion Then IIfEx = varTruePart Else IIfEx = varFalsePart End If End Function
Un pequeño ejemplo de velocidad usando CTiming.cls :
Código
Option Explicit Private Sub Form_Load() Dim t As New CTiming Dim x As Long Dim ret As Variant Const s As String = "holaa" Const sCorrect As String = s Const sIncorrect As String = sCorrect & "a" Const lngLoops As Long = 100000 If App.LogMode = 0 Then MsgBox "Compile it stupid!", vbCritical End End If Me.AutoRedraw = True Me.Print "True part" Me.Print t.Reset For x = 1 To lngLoops ret = IIf((s = sCorrect), 123, 1233) Next Me.Print "IIf", t.sElapsed t.Reset For x = 1 To lngLoops ret = IIfEx((s = sCorrect), 123, 1233) Next Me.Print "IIfEx", t.sElapsed Me.Print String$(20, "-") Me.Print "False part" Me.Print t.Reset For x = 1 To lngLoops ret = IIf((s = sIncorrect), 123, 1233) Next Me.Print "IIf", t.sElapsed t.Reset For x = 1 To lngLoops ret = IIfEx((s = sIncorrect), 123, 1233) Next Me.Print "IIfEx", t.sElapsed End Sub
Resultado (IIfEx = IIIf ; que le cambié el nombre ) :
Nota: Aún así si se necesita especial velocidad mejor usar If.
DoEvents!