VBA If, ElseIf, Else (Guía definitiva de las sentencias If)
In this Article
Sentencia If
If – Then
Las sentencias If de VBA le permiten probar si las expresiones son Verdadero o Falso, ejecutando un código diferente basado en los resultados.
Veamos un ejemplo sencillo:
Sub si()
If Range("a2").Value > 0 Then Range("b2").Value = "Positivo"
End Sub
Se comprueba si el valor del rango A2 es mayor que 0. Si es así, se establece el rango B2 igual a «Positivo»
Nota: Al probar las condiciones utilizaremos los operadores de comparación =, >, <, <>, <=, >=. Los discutiremos con más detalle más adelante en el artículo.
Esta es la sintaxis para una simple sentencia If de una línea:
If [expresión_de_prueba] then [acción]
Para facilitar la lectura, puede utilizar un carácter de continuación de línea (guión bajo) para ampliar las sentencias If a dos líneas (como hicimos en la imagen anterior):
If [expresión_de_prueba] then _
[acción]
If Range("a2").Value > 0 then _
Range("b2").Value = "Positivo"
End If
La declaración «single-line» if anterior funciona bien cuando está probando una condición. Pero a medida que sus declaraciones IF se complican con múltiples condiciones, necesitará añadir un «End If» al final de la declaración if:
Sub si()
If Range("a2").Value > 0 Then
Range("b2").Value = "Positivo"
End If
End Sub
Aquí la sintaxis es
If [expresión_de_prueba] Then
[acción]
End If
El End If significa el final de la sentencia If.
Ahora vamos a añadir un ElseIf:
ElseIf – Condiciones múltiples
El ElseIf se añade a una sentencia If existente. ElseIf comprueba si una condición se cumple SÓLO si las condiciones anteriores no se han cumplido.
En el ejemplo anterior probamos si el valor de una celda es positivo. Ahora también probaremos si el valor de la celda es negativo con un ElseIf:
Sub If_ElseIf()
If Range("A2").Value > 0 Then
Range("B2").Value = "Positivo"
ElseIf Range("A2").Value < 0 Then
Range("B2").Value = "Negativo"
End If
End Sub
Puede usar múltiples ElseIfs para probar múltiples condiciones:
Sub If_MultiplesCondiciones()
If Range("a2").Value = "Gato" Then
Range("b2").Value = "Miau"
ElseIf Range("a2").Value = "Perro" Then
Range("b2").Value = "Guau"
ElseIf Range("a2").Value = "Pato" Then
Range("b2").Value = "Cuack"
End If
End Sub
Ahora añadiremos un Else:
Else
El Else se ejecutará si no se cumplen otras condiciones anteriores. Terminaremos nuestro ejemplo utilizando un Else para indicar que si el valor de la celda no es positivo o negativo, entonces debe ser cero:
Sub else_()
If Range("a2").Value > 0 Then
Range("b2").Value = "Positivo"
ElseIf Range("a2").Value < 0 Then
Range("b2").Value = "Negativo"
Else
Range("b2").Value = "Cero"
End If
End Sub
If-Else
El tipo más común de sentencia If es un simple If-Else:
Sub If_Else()
If Range("a2").Value > 0 Then
Range("b2").Value = "Positvo"
Else
Range("b2").Value = "No Negativo"
End If
End Sub
IFs anidados
También puede «anidar» las sentencias if unas dentro de otras.
Sub Ifs_Anidados()
If Range("a2").Value > 0 Then
Range("b2").Value = "Positivo"
Else
If Range("a2").Value < 0 Then
Range("b2").Value = "Negativo"
Else
Range("b2").Value = "Cero"
End If
End If
End Sub
IF – Or, And, Xor, Not
A continuación hablaremos de los operadores lógicos: Or, And, Xor, Not.
If – Or
El operador Or comprueba si se cumple al menos una condición. El siguiente código probará si el valor en el Rango A2 es menor a 5,000 o mayor a 10,000:
Sub If_Or()
If Range("a2").Value < 5000 Or Range("a2").Value > 10000 Then
Range("b2").Value = "Fuera de rango"
End If
End Sub
Puede incluir varios Ors en una línea:
Sub If_Varios_Or()
If Range("a2").Value < 5000 Or Range("a2").Value > 10000 Or Range("a2").Value = 9999 Then
Range("b2").Value = "Fuera de rango"
End If
End Sub
Si va a utilizar varios Ors, se recomienda utilizar un carácter de continuación de línea para que su código sea más fácil de leer:
Sub If_Varios_Or()
If Range("a2").Value < 5000 Or _
Range("a2").Value > 10000 Or _
Range("a2").Value = 9999 Then
Range("b2").Value = "Fuera de Rango"
End If
End Sub
If And
El operador And permite comprobar si se cumplen TODAS las condiciones.
Sub If_And()
If Range("a2").Value >= 5000 And Range("a2").Value <= 10000 Then
Range("b2").Value = "En Rango"
End If
End Sub
If Xor
El operador Xor permite comprobar si se cumple exactamente una condición. Si se cumplen cero condiciones, Xor devolverá FALSE, Si se cumplen dos o más condiciones, Xor también devolverá false. Rara vez he visto el uso de Xor en la programación VBA.
If Not
El operador Not se utiliza para convertir FALSE en TRUE o TRUE en FALSE:
Sub IF_Not()
MsgBox Not (True)
End Sub
Observe que el operador Not requiere paréntesis alrededor de la expresión a cambiar. El operador Not también puede aplicarse a las sentencias If:
Sub if_not_ii()
If Not (Range("a2").Value >= 5000 And Range("a2").Value <= 10000) Then
Range("b2").Value = "Fuera de Rango"
End If
End Sub
Comparaciones If
Cuando se realizan comparaciones, normalmente se utiliza uno de los operadores de comparación:
Operador de Comparación | Explicación |
---|---|
= | Igual a |
<> | No es igual a |
> | Mayor que |
>= | Mayor o igual que |
< | Menos que |
<= | Menor o igual que |
Sin embargo, también puede utilizar cualquier expresión o función que dé como resultado TRUE o FALSE
If – Función booleana
Cuando construya expresiones para sentencias If, también puede utilizar cualquier función que genere TRUE o FALSE. VBA tiene algunas de estas funciones:
Función | Descripción |
---|---|
IsDate | Devuelve TRUE si la expresión es una fecha válida |
IsEmpty | Comprueba si hay celdas en blanco o variables no definidas |
IsError | Comprueba si hay valores de error |
IsNull | Comprueba si hay un valor NULL |
IsNumeric | Comprueba si el valor es numérico |
Pueden ser llamadas así:
If IsEmpty(Range("A1").Value) Then MsgBox "Celda Vacía"
Excel también tiene muchas funciones adicionales que pueden ser llamadas usando WorksheetFunction. Aquí hay un ejemplo de la función IsText de Excel
:
If Application.WorksheetFunction.IsText(Range("a2").Value) Then _
MsgBox "La celda es texto"
También puede crear sus propias Funciones Definidas por el Usuario (UDFs). A continuación crearemos una simple función booleana que devuelva TRUE. Luego llamaremos a esa función en nuestra sentencia If:
Sub If_Funcion()
If FuncionVerdadero Then
MsgBox "True"
End If
End Sub
Function FuncionVerdadero() As Boolean
FuncionVerdadero = True
End Function
Comparación de texto
También puede comparar texto de forma similar a la comparación de números:
Msgbox "a" = "b"
Msgbox "a" = "a"
Al comparar texto, debe tener en cuenta si el (Case) tipo de letra (mayúsculas o minúsculas). Por defecto, VBA considera que las letras con diferentes (Case) no coinciden. En otras palabras, «A» <> «a».
Si desea que VBA ignore las mayúsculas y minúsculas, debe añadir la declaración de Opción de Comparación de Texto
en la parte superior de su módulo:
Option Compare Text
Después de hacer esa declaración «A» = «a»:
Option Compare Text
Sub If_Text()
MsgBox "a" = "A"
End Sub
VBA If Like
El Operador Like de VBA le permite hacer comparaciones inexactas de texto. Haga clic en el enlace «Operador Like» para aprender más, pero mostraremos un ejemplo básico a continuación:
Dim nombre String
nombre = "Mr. Charles"
If nombre Like "Mr*" Then
MsgBox "True"
Else
MsgBox "False"
End If
Aquí estamos usando un comodín de asterisco «*». El * representa cualquier número de caracteres. Así que la declaración If anterior devolverá TRUE. El operador Like es una herramienta extremadamente poderosa, pero a menudo subutilizada, para tratar con texto.
Bucles If
Los bucles de VBA le permiten repetir acciones. La combinación de IF-ELSEs con bucles es una gran manera de procesar rápidamente muchos cálculos. Continuando con nuestro ejemplo de Positivo / Negativo, agregaremos un Bucle For Each para recorrer un rango de celdas:
Sub If_Bucle()
Dim Celda As Range
For Each Celda In Range("A2:A6")
If Celda.Value > 0 Then
Celda.Offset(0, 1).Value = "Positivo"
ElseIf Celda.Value < 0 Then
Celda.Offset(0, 1).Value = "Negativo"
Else
Celda.Offset(0, 1).Value = "Cero"
End If
Next Celda
End Sub
Ejemplos de If Else
Ahora veremos algunos ejemplos más específicos.
Comprobar si la celda está vacía
Este código comprobará si una celda está vacía. Si está vacía ignorará la celda. Si no está vacía, enviará el valor de la celda a la celda de la derecha:
Sub If_Celda_Vacia()
If Range("a2").Value <> "" Then
Range("b2").Value = Range("a2").Value
End If
End Sub
Comprobar si la celda contiene un texto específico
La función Instr
comprueba si una cadena de texto se encuentra en otra cadena. Utilícela con una sentencia If para comprobar si una celda contiene un texto específico:
If Instr(Range("A2").value,"texto") > 0 Then
Msgbox "Texto Encontrado"
End If
Comprobar si la celda contiene texto
Este código comprobará si una celda es texto:
Sub If_Celda_Es_Texto()
If Application.WorksheetFunction.IsText(Range("a2").Value) Then
MsgBox "Celda contiene texto"
End If
End Sub
If Goto
Puede utilizar el resultado de una sentencia If para «Ir a» otra sección de código.
Sub IfGoTo()
If IsError(Cell.Value) Then
GoTo Skip
End If
'Algo de código
Skip:
End Sub
Borrar fila si la celda está en blanco
Usando Ifs y bucles puede probar si una celda está en blanco y si es así borrar toda la fila
Sub borrarFilaSiCeldaEsBlanco()
Dim Celda As Range
For Each Celda In Range("A2:A10")
If Celda.Value = "" Then Celda.EntireRow.Delete
Next Celda
End Sub
If MessageBox Sí / No
Con los cuadros de mensaje de VBA
puede pedir al usuario que seleccione entre varias opciones. La Caja de Mensajes Si/No le pide al usuario que seleccione Si o No. Usted puede agregar una Caja de Mensajes Si/No a un procedimiento para preguntarle al usuario si le gustaría continuar ejecutando el procedimiento o no. Usted maneja la entrada del usuario usando una sentencia If.
Aquí está el Cuadro de Mensajes Sí/No en la práctica:
Sub MsgBoxVariable()
Dim respuesta As Integer
respuesta = MsgBox("Quiere continuar?", vbQuestion + vbYesNo)
If respuesta = vbYes Then
MsgBox "Si"
Else
MsgBox "No"
End If
End Sub
VBA If, ElseIf, Else en Access VBA
Las funciones If, ElseIf y Else funcionan exactamente igual en Access VBA que en Excel VBA. Puede utilizar una sentencia If para comprobar si hay registros en un Recordset.