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 |
NOT | NOT [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 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
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