Las condicionales son bastante útiles en programación dado que nos permiten ejecutar acciones basadas en criterios particulares (es el mismo principio que la función IF).

La función condicional más relevante es If, y en seguida veremos cómo funciona:

If [CONDICIÓN] Then ' =>  Si la condición se valida, LUEGO
    'Instrucciones si se cumplen
Else ' => SI NO ES ASÍ
    'Instrucciones, si [CONDICIÓN] no se cumple.
End If

Vamos a la práctica y volvamos al ejemplo que hemos utilizado en la lección acerca de variables. El propósito de este procedimiento era visualizar un cuadro de diálogo con los datos de la fila cuyo número se indica en la celda D1:



Si introducimos una letra en la celda D1,provocará un error. Queremos evitar que eso ocurra.

Sub variables()
    'Declarando variables
    Dim apellido As String, nombre As String, edad As Integer, nuemro_De_Fila As Integer
        
    'Asignación de valores a las variables
    nuemro_De_Fila = Range("D1") + 1
    apellido = Cells(nuemro_De_Fila1)
    nombre = Cells(nuemro_De_Fila2)
    edad = Cells(nuemro_De_Fila3)
    
    'Cuadro de diálogo
    MsgBox apellido & " " & nombre & "" & edad & " años de edad"
End Sub

Para comenzar, añadiremos una condición que compruebe que el valor de la celda D1 es numérico antes de ejecutar el código.

Usaremos la función "IsNumeric" para evaluar esta condición:

Sub variables()

    'Si el valor entre paréntesis (celda F5) es numérico (Y POR LO TANTO SI LA CONDICIÓN ES VERDADERA) entonces
    'ejecuta las instrucciones que siguen "THEN"
    If IsNumeric(Range("D1")) Then
    
        'Declarando variables
        Dim apellido As String, nombre As String, edad As Integer, nuemro_De_Fila As Integer
        'Valores de las variables
        nuemro_De_Fila = Range("D1") + 1
        apellido = Cells(nuemro_De_Fila1)
        nombre = Cells(nuemro_De_Fila2)
        edad = Cells(nuemro_De_Fila3)
        'Cuadro de diálogo
        MsgBox nombre & " " & apellido & "" & edad & " years old"
        
    End If
    
End Sub

Además, debemos añadir instrucciones que se ejecuten en caso de que no se cumplan las condiciones:

Sub variables()

    If IsNumeric(Range("D1")) Then 'Si condición es verdadera
    
        'Declarando variables
        Dim apellido As String, nombre As String, edad As Integer, nuemro_De_Fila As Integer
        'Valores de las variables
        nuemro_De_Fila = Range("D1") + 1
        apellido = Cells(nuemro_De_Fila1)
        nombre = Cells(nuemro_De_Fila2)
        edad = Cells(nuemro_De_Fila3)
        'Cuadro de diálogo
        MsgBox apellido & " " & nombre & "" & edad & " years old"
        
    Else 'Si condición es FALSA
    
        'Cuadro de diálogo: advertencia
        MsgBox Tu entrada " & Range("D1") & " No es valida!"
        'Borrar el contenido de la celda D1
        Range("D1").ClearContents
    
    End If
    
End Sub

A partir de ahora, los valores no numéricos no ocasionarán ningún problema.

Al trabajar con nuestra matriz, que contiene 20 filas de datos, el próximo paso será verificar si la variable número_de_fila: "es mayor o igual que 2" y "es menor o igual que 21".

Antes, revisa esta lista de operadores de comparación:

=es igual a
<>diferente de
<menor que
<=menor o igual a
>mayor que
>=mayor o igual a

Además, estos otros operadores útiles:

AND[Condición 1] Y [Condición 2] 
 Las dos condiciones deben ser verdaderas
OR[Condición 1] O [Condición 2]
 Al menos una de las 2 condiciones debe ser verdad
NOTNO [Condición
 La condición debe ser falsa


Vamos a añadir ahora las condiciones que hemos mencionado anteriormente, utilizando "AND" junto con los operadores de comparación indicados anteriormente:

Sub variables()
    If IsNumeric(Range("D1")) Then 'SI ES NUMÉRICO
        Dim apellido As String, nombre As String, edad As Integer, numero_De_Fila As Integer
        numero_De_Fila = Range("D1") + 1

        If numero_De_Fila >= 2 And numero_De_Fila <= 21 Then 'SI EL NÚMERO ES CORRECTO
            apellido = Cells(numero_De_Fila1)
            nombre = Cells(numero_De_Fila2)
            edad = Cells(numero_De_Fila3)
            MsgBox nombre & " " & apellido & "" & edad & " años de edad"
        Else 'SI EL NÚMERO ES INCORRECTO
            MsgBox "Tu entrada " & Range("D1") & " No es un número válido!"
            Range("D1").ClearContents
        End If
        
    Else 'SI NO ES NUMÉRICO
        MsgBox "Tu entrada " & Range("D1") & " No es válido !"
        Range("D1").ClearContents
    End If
End Sub

En caso de que quisiéramos hacer nuestra macro un poco más práctica, en lugar de 21 podríamos poner una variable que contuviera el número de líneas. Esto dejaría que añadamos o eliminemos filas de nuestra matriz sin necesidad de cambiar este límite cada vez.

Con el fin de hacer esto, tenemos que crear una variable nb_filas y adicionar esta función:

Aquí usaremos "WorksheetFunction.CountA" que es la función "COUNTA" con la que seguro ya estás familiarizado...

Función counta vba Excel - Función para contar en vba excel

Necesitamos que esta función cuente el número de celdas no vacías en la primera columna y que sustituya 21 por nb_filas:

Sub variables()
    If IsNumeric(Range("D1")) Then 'SI ES NUMÉRICO
        Dim apellido As String, nombre As String, edad As Integer, numero_De_Fila As Integer
        Dim nb_filas As Integer
        
        numero_De_Fila = Range("D1") + 1
        nb_filas = WorksheetFunction.CountA(Range("A:A")) ' Función NBVAL
        
        If numero_De_Fila >= 2 And numero_De_Fila <= nb_filas Then 'SI EL NÚMERO ES CORRECTO 
            apellido = Cells(numero_De_Fila1)
            nombre = Cells(numero_De_Fila2)
            edad = Cells(numero_De_Fila3)
            MsgBox nombre & " " & apellido & "" & edad & " años de edad"
        Else 'SI EL NÚMERO ES INCORRECTO
            MsgBox "Tu entrada " & Range("D1") & " no es un número válido!"
            Range("D1").ClearContents
        End If

    Else 'SI NO ES NUMÉRICO
        MsgBox "Su entrada " & Range("D1") & " no es válida !"
        Range("D1").ClearContents
    End If
End Sub


ELSEIF

"ElseIf" hace posible añadir más condiciones después del comando IF:

If [CONDICIÓN 1Then ' => SI la condición 1 es verdadera, ENTONCES
    'Instrucciones 1
ElseIf [CONDICIÓN 2Then ' => SI condición 1 es Falsa, Pero condición 2 es verdadera, Luego
    'Instrucciones 2
Else ' => SI NO ES ASÍ
    'Instrucciones 3
End If

Si la condición 1 es verdadera, se ejecutará la instrucción 1 y saldremos del comando If (que comienza con If y termina con End If). Si la condición 1 es falsa, continuamos con la condición 2. Si esta condición es verdadera, se ejecutarán las Instrucciones 2, y si es falsa, se ejecutarán las Instrucciones 3 (en Else).

Veamos un ejemplo, con una puntuación entre 1 y 6 en la celda A1 (sin decimales en este caso) y una puntuaciones_comentarios en la celda "B1" basado en la puntuación:

Sub puntuaciones_comentarios()
    'Variables
    Dim nota As Integer, punt_coment As String
    nota = Range("A1")
    
    'Comentarios basados en "nota"
    If nota = 6 Then
        punt_coment = "Excelente puntuación!"
     Range("B1").Font.Color = vbGreen
    ElseIf nota = 5 Then
        punt_coment = "Buena puntuación"
    ElseIf nota = 4 Then
        punt_coment = "Puntuación satisfactoria"
    ElseIf nota = 3 Then
        punt_coment = "Puntuación insatisfactoria"
    ElseIf nota = 2 Then
        punt_coment = "Mala puntuación"
    ElseIf nota = 1 Then
        punt_coment = "Puntuación terrible"
    Else
        punt_coment = "Puntuación cero"
Range("B1").Font.Color = vbred
    End If
    
    'Comentarios en B1
    Range("B1") = punt_coment
    Range("B1").Font.Bold = True
End Sub


Else if vba excel


SELECT

Hay una alternativa al uso de If con muchas instrucciones ElseIf: el comando Select, que se adapta mejor a este tipo de situaciones.

El siguiente es un ejemplo de la misma macro escrita con Select:

Sub puntuaciones_comentarios()
    'Variables
    Dim note As Integer, punt_coment As String
    note = Range("A1")
    
    'Comentarios basados en "nota"
    Select Case note    ' <= el valor a probar (la puntuación, en este caso)
    Case Is = 6         ' <=  si el valor = 6
        punt_coment = "Excelente puntuación!"
Range("B1").Font.Color = vbGreen
    Case Is = 5         ' <=  si el valor = 5
        punt_coment = "Buena puntuación"
    Case Is = 4         ' <= si el valor = 4
        punt_coment = "Puntuación satisfactoria"
    Case Is = 3         ' <= si el valor = 3
        punt_coment = "Puntuación insatisfactoria"
    Case Is = 2         ' <= si el valor = 2
        punt_coment = "Mala puntuación"
    Case Is = 1         ' <= si el valor = 1
        punt_coment = "Puntuación terrible"
    Case Else           ' <= <= si el valor no es igual a ninguno de los valores anteriores
        punt_coment = "Puntuación cero"
Range("B1").Font.Color = vbred
    End Select
    
    'Comentarios en B1
    Range("B1") = punt_coment
End Sub

Recuerda que también podríamos haber empleado otros operadores de comparación, por ejemplo:

Case Is >= 6         'si el valor es >= 6

Son ejemplos con distintos valores:

Case Is = 67       'si el valor es = 6 o 7
Case Is <> 67      'si el valor es diferente de 6 o 7
Case 6 To 10         'si el valor es = cualquier número entre 6 y 10


Colaborar para publicar más al yape de Aly aquí adjunto su número: +51 959 729 180