Este tutorial explicará cómo usar IIF en VBA
La función VBA IIF es similar a usar la función IF en Excel. Prueba si se cumple una condición, devolviendo un valor (o cálculo) si es VERDADERO, otro valor (o cálculo) si es FALSO.
Es similar a la declaración If de VBA, muchos lo consideran un atajo para usar este método, ya que solo necesita escribir una línea de código para obtener el resultado deseado en lugar de usar un Si … Entonces … Else … Fin Si rutina. Sin embargo, debe usarse correctamente ya que puede ocasionar problemas en su código.
Sintaxis IIF
La función IFF consta de 3 partes: la prueba lógica, la parte verdadera y la parte falsa.
- Expresión:La prueba lógica que se va a realizar.
- Parte verdadera: El resultado que se devolverá si la prueba lógica es VERDADERA.
- Parte falsa: El resultado que se devolverá si la prueba lógica es FALSA.
Escribir un procedimiento de función IIF
123 | Función GetNames (strName como cadena) como cadenaGetNames = IIf (strName = "John", "El nombre es John", "El nombre no es John")Función final |
En la función anterior, podemos usar un subprocedimiento para probar y ver si la variable que pasamos a la función es la cadena "John"
123 | Sub TestGetNamaes ()MsgBox GetNames ("John")End Sub |
Si tuviéramos que ejecutar el subprocedimiento TestGetNames, llamaría a la función GetNames y devolvería un cuadro de mensaje.
Si hubiéramos utilizado el método If en su lugar, el código se habría visto así:
1234567 | Función GetNames (strName como cadena) como cadenaSi (strName = "John") EntoncesGetNames = "El nombre es John"DemásGetNames = "El nombre no es John"Terminara siFunción final |
Hemos escrito efectivamente una línea de código en lugar de 5 líneas de código, ¡impresionante!
¿Por qué usar If en su lugar?
Considera lo siguiente
123 | Función GetNames (strName como cadena) como cadenaGetNames = IIf (strName = "John", MsgBox ("El nombre es John"), MsgBox ("El nombre no es John"))Función final |
Ahora, si ejecuta el siguiente subprocedimiento para llamar a su función
123 | Sub TestGetNames ()GetNames ("John")End Sub |
Obtendría el mismo cuadro de mensaje que antes, pero inmediatamente después de eso, ¡obtendría el siguiente cuadro de mensaje!
La función IIF ejecuta las secciones VERDADERO y FALSO de la línea de código; no sale del código una vez que ha encontrado que la condición es verdadera; también ejecuta la sección falsa, lo que nos da un mensaje falso en el segundo cuadro de mensaje. Si hubieras usadoSi … Entonces … Else … Fin Si - esto no habría ocurrido - la función SI solo ejecuta la sección VERDADERO o FALSO del código - dependiendo de la lógica que se pasa al código.
El código está mal diseñado (¡a propósito!) Y los cuadros de mensaje se mantienen dentro de la línea de código en la que se encuentra la instrucción IIF en lugar de después del código o en la subrutina. Como la función IIF ejecuta las secciones VERDADERO y FALSO de la declaración, se devuelven ambos mensajes.
Podríamos corregir este error moviendo el cuadro de mensaje debajo de la línea de función IIF, como en el código a continuación, o moviendo el cuadro de mensaje al Subprocedimiento como en el primer ejemplo de este artículo.
1234 | Función GetNames (strName como cadena) como cadenaGetNames = IIf (strName = "John", "El nombre es John", "El nombre no es John")MsgBox (GetNames)Función final |
Si tiene cuidado al escribir su código, la función IIF puede ahorrarle muchas líneas de código y escribir más.
IIF anidados
Podemos anidar la función IIF de manera similar a anidar la función SI, pero una vez más, todo se hace en una línea.
123 | Función GetDiscount (dblPrice As Double) As DoubleGetDiscount = IIf (dblPrice> = 500, 10, IIf (dblPrice> = 250, 5, IIf (dblPrice> = 100, 2.5, 0)))Función final |
Entonces podríamos llamar a esta función desde un subprocedimiento
12345 | Sub FindDiscount ()Dim dblP como dobledblP = 899MsgBox ("El descuento que puede obtener es" & GetDiscount (dblP) & "%")End Sub |
o puede llamarlo desde Excel, usándolo como una UDF (función definida por el usuario)