TOP

VBA-Lección 7.1. Condiciones (Conditions)

Las condiciones son muy útiles en programación porque nos permiten realizar acciones según criterios establecidos (se utiliza el mismo principio que en la función IF Excel).


La función más importante que establece la condición es la IF y ahora veremos cómo funciona:

If [TÉRMINO AQUÍ] Then '=> SI la condición es verdadera ENTONCES
   'Instrucciones si es "verdadero"
Else '=> DE LO CONTRARIO
   'Instrucciones si "mentira"
End If

Seamos prácticos y volvamos al ejemplo que usamos en la lección de variables. El propósito de este procedimiento era mostrar un cuadro de diálogo que contendría el valor de la cadena especificada en la celda F5:

Si escribe una letra en la celda F5, se producirá un error. Queremos prevenir esto.

Sub variables()
   'Declaración de variables
   Dim last_name As String, first_name As String, age As Integer, row_number As Integer
       
   'Asignación de valores a las variables
   row_number = Range("F5") + 1
   
   last_name  = Cells(row_number, 1)
   first_name = Cells(row_number, 2)
   age        = Cells(row_number, 3)
   
   'Caja de diálogo
   MsgBox last_name & " " & first_name & ", " & age & "años"
End Sub

Agreguemos una condición que verificará si el valor ingresado en la celda F5 es un número antes de que se ejecute el código.

Usaremos la función IsNumeric para probar la condición:

Sub variables()
  'Si el valor entre paréntesis (celda F5) es numérico (por lo tanto, la condición SI es VERDADERA), entonces
  'ejecutar las instrucciones que siguen ENTONCES
   If IsNumeric(Range("F5")) Then
   
       'Declaración de variables
       Dim last_name As String, first_name As String, age As Integer, row_number As Integer
       
       'Asignación de valores a las variables
       row_number = Range("F5") + 1
       
       last_name  = Cells(row_number, 1)
       first_name = Cells(row_number, 2)
       age        = Cells(row_number, 3)
       
       'Caja de diálogo
       MsgBox last_name & " " & first_name & ", " & age & "años"
    End If
End Sub

También necesitamos escribir instrucciones si no se cumple la condición que establecimos:

Sub variables()
    If IsNumeric(Range("F5")) Then 'Si se cumple la condición
   
       'Declaración de variables
       Dim last_name As String, first_name As String, age As Integer, row_number As Integer
       
       'Asignación de valores a las variables
       row_number = Range("F5") + 1
       
       last_name  = Cells(row_number, 1)
       first_name = Cells(row_number, 2)
       age        = Cells(row_number, 3)
       
       'Caja de diálogo
       MsgBox last_name & " " & first_name & ", " & age & "años"
       
    Else 'Si no se cumple la condición
   
       'Cuadro de diálogo: advertencia
       MsgBox "valor ingresado" & Range("F5") & "¡no es verdad!"
       
       'Eliminar el contenido de la celda F5
       Range("F5").ClearContents
    End If
End Sub

Ahora, un valor no numérico no causará ningún problema.

Trabajando con nuestra matriz que contiene 16 filas de datos, nuestro próximo paso será verificar si la variable número_fila es: "mayor o igual a 2" y "menor o igual a 17".

Pero primero, veamos los operadores de comparación:

= exactamente
<> no exactamente
< menos que
<= Menos que o igual a
> más que
>= Mayor qué o igual a

y estos útiles operadores:

AND [condición1] AND [condición2] Se deben cumplir dos condiciones
OR[condición1] OR [condición2] Que se debe cumplir al menos 1 de las 2 condiciones
NOTNOT [condición1] No se debe cumplir la condición

Ahora agreguemos una de las condiciones AND anteriores entre los operadores de comparación:

Sub variables()
    If IsNumeric(Range("F5")) Then 'Si un valor numérico
    
        Dim last_name As String, first_name As String, age As Integer, row_number As Integer
        
        row_number = Range("F5") + 1

        If row_number >= 2 And row_number <= 17 Then 'si el numero correcto
        
            last_name  = Cells(row_number, 1)
            first_name = Cells(row_number, 2)
            age        = Cells(row_number, 3)
            
            MsgBox last_name & " " & first_name & ", " & age & "años"
            
        Else 'Si el número no es correcto
            MsgBox "Número ingresado" & Range("F5") & "¡no es correcto!"
            Range("F5").ClearContents
        End If
       
    Else 'Si no es un valor numérico
        MsgBox "valor ingresado" & Range("F5") & "¡no es verdad!"
        Range("F5").ClearContents
    End If
End Sub

Si queremos que nuestra macro sea más práctica, podemos reemplazar 17 con una variable que contenga el número de líneas. Esto nos permitiría agregar y eliminar filas de la matriz sin tener que cambiar este límite cada vez.

Para hacer esto, necesitamos crear una variable nb_rows y agregar esta función.

En este caso, usaremos la función WorksheetFunction.CountA, que es análoga a la función COUNTA en Excel.

Queremos que esta función cuente el número de celdas no vacías en la primera columna y escriba el valor resultante en la variable nb_rows:

Sub variables()
    If IsNumeric(Range("F5")) Then 'SI NÚMERO
    
        Dim last_name As String, first_name As String, age As Integer, row_number As Integer
        Dim nb_rows As Integer
       
        row_number = Range("F5") + 1
        nb_rows    = WorksheetFunction.CountA(Range("A:A")) 'La función de contar el número de líneas.
       
        If row_number >= 2 And row_number <= nb_rows Then 'SI NÚMERO VáLIDO
        
            last_name  = Cells(row_number, 1)
            first_name = Cells(row_number, 2)
            age        = Cells(row_number, 3)
            
            MsgBox last_name & " " & first_name & ", " & age & "años"
            
        Else 'SI EL NÚMERO ES INCORRECTO
            MsgBox "Número ingresado" & Range("F5") & "¡no es correcto!"
            Range("F5").ClearContents
        End If

    Else 'SI NO NUMERO
        MsgBox "valor ingresado" & Range("F5") & "¡no es verdad!"
        Range("F5").ClearContents
    End If
End Sub

ElseIf

ElseIf le permite agregar condiciones adicionales después del comando IF:

If [CONDICIÓN 1] Then '=> SI la condición 1 es verdadera ENTONCES
   'Instrucciones 1
ElseIf [CONDICIÓN 2] Then '=> SI la condición 1 es falsa pero la condición 2 es verdadera ENTONCES
   'Instrucciones 2
Else '=> DE LO CONTRARIO
   'Instrucciones 3
End If

Si la CONDICIÓN 1 es verdadera, la instrucción 1 se ejecutará y saldrá de la instrucción IF (que comienza con IF y termina con End If). Si la CONDICIÓN 2 devuelve falso, se ejecutará la Declaración 2 y, si devuelve falso, se ejecutará la Declaración 3 (bajo Else).

Aquí hay un ejemplo con las calificaciones del 1 al 6 en la celda A1 y un comentario sobre esas calificaciones en la celda B1:

Sub scores_comment()
    'Variables
    Dim note As Integer, score_comment As String
    
    note = Range("A1")
   
    'Comentarios basados en la puntuación recibida
    If note = 6 Then
        score_comment = "¡Gran puntuación!"
    ElseIf note = 5 Then
        score_comment = "Buen punto"
    ElseIf note = 4 Then
        score_comment = "Puntuación satisfactoria"
    ElseIf note = 3 Then
        score_comment = "puntuación insatisfactoria"
    ElseIf note = 2 Then
        score_comment = "mala puntuación"
    ElseIf note = 1 Then
        score_comment = "Puntuación terrible"
    Else
        score_comment = "puntuación cero"
    End If
   
    'Comentar en la celda B1
    Range("B1") = score_comment
End Sub

Seleccionar

Existe una alternativa al uso de If con muchas declaraciones ElseIf, a saber, el comando Select, que es más adecuado para este tipo de situación.

Considere un ejemplo de una macro con el operador Select:

Sub scores_comment()
    'Variables
    Dim note As Integer, score_comment As String
    
    note = Range("A1")
   
    'Comentarios basados en la puntuación recibida
    Select Case note    '=> puntuación de la prueba (puntos)
    Case Is = 6         '=> si valor = 6
       score_comment = "¡Gran puntuación!"
    Case Is = 5         '=> si valor = 5
       score_comment = "Buen punto"
    Case Is = 4         '=> si valor = 4
       score_comment = "Puntuación satisfactoria"
    Case Is = 3         '=> si valor = 3
       score_comment = "puntuación insatisfactoria"
    Case Is = 2         '=> si valor = 2
       score_comment = "mala puntuación"
    Case Is = 1         '=> si valor = 1
       score_comment = "Puntuación terrible"
    Case Else           '=> si el valor no es igual a ninguno de los anteriores
       score_comment = "puntuación cero"
    End Select
   
    'Comentar en la celda B1
    Range("B1") = score_comment
End Sub

Vale la pena señalar que también podríamos usar otros operadores de comparación:

Case Is >= 6         'si valor >= 6

Ejemplos con diferentes significados:

Case Is = 6, 7       'si valor = 6 o 7
Case Is <> 6, 7      'si el valor no es igual a 6 o 7
Case 6 To 10         'si valor = cualquier número del 6 al 10