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_Fila, 1)
nombre = Cells(nuemro_De_Fila, 2)
edad = Cells(nuemro_De_Fila, 3)
'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_Fila, 1)
nombre = Cells(nuemro_De_Fila, 2)
edad = Cells(nuemro_De_Fila, 3)
'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_Fila, 1)
nombre = Cells(nuemro_De_Fila, 2)
edad = Cells(nuemro_De_Fila, 3)
'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 |
| NOT | NO [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_Fila, 1)
nombre = Cells(numero_De_Fila, 2)
edad = Cells(numero_De_Fila, 3)
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...
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_Fila, 1)
nombre = Cells(numero_De_Fila, 2)
edad = Cells(numero_De_Fila, 3)
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 1] Then ' => SI la condición 1 es verdadera, ENTONCES
'Instrucciones 1
ElseIf [CONDICIÓN 2] Then ' => 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
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 = 6, 7 'si el valor es = 6 o 7
Case Is <> 6, 7 '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
0 Comentarios