Estructuras de decisión
Es conveniente testear las decisiones específicas antes de ejecutar las instrucciones.
Las estructuras de decisión, llamadas también alternativas o bifurcaciones condicionales, permiten, tras una evaluación, optar por uno u otro bloque de código.
Se distinguen 2 bloques de bifurcación condicional:
- If… Then… Else
- Select… Case
La función If también se puede utilizar para definir un valor en función de una condición, por ejm: If(Cantidad < 100, 100, 0).
1. Instrucción If
La instrucción If permite ejecutar ciertas instrucciones en función del resultado de una condición.
If… Then
Si hay varias instrucciones, hay que separarlas por el signo de puntuación ‘: (2 puntos)’. Esta sintaxis se usa especialmente para pruebas cortas y simples.
Ejm
Si la celda A1 está vacía, emite un bip y muestra un mensaje
Sub Test_Celda_A1() If IsEmpty(Range("A1")) Then Beep: MsgBox "Olvidaste el título" End Sub
If… Then… End If
Su sintaxis es la siguiente
If <condición> Then <instrucción1> <instrucción2> ... End If
Ejm
Sub Test_Titulo() ’ Si la celda A1 no está vacía ’ entonces ponerla en negrita y pintarla de rojo If Not IsEmpty(Range("A1")) Then With Range("A1") .Font.Bold = True .Interior.ColorIndex = 3 End With End If End Sub
If…Then…Else…End If
Su sintaxis es
If <condición> Then <instrucciones> Else <instrucciones> End If
Ejm
Al cambiar la moneda (€ o US$) de la celda C3, modificar el formato del rango D6:F11.
Al cambiar la moneda (€ o US$) de la celda C3, modificar el formato del rango D6:F11.
Este procedimiento modifica el formato de las celdas en función de la moneda elegida.
Sub Aplicar_Formato() ’ Formato € o $ Range("D6:F11").NumberFormat = "0.00" If UCase(Range("C3")) = "EURO" Then Range("D6:F11").NumberFormat = "0.00 €" Else Range("D6:F11").NumberFormat = "0.00"" $""" End If End Sub
If… Then…ElseIf…Else…End If
La sintaxis es la siguiente
If <condición> Then <instrucciones> ElseIf <condición> Then <instrucciones> ElseIf <condición> Then <instrucciones> ... ... Else <instrucciones> End If
Ejm
Este procedimiento modifica los textos de las celdas seleccionadas, si la última letra es minúscula, pasa todo a mayúsculas, si no, pasa todo a minúsculas con la primera letra en mayúscula.
Sub Mayus_Minus() Dim oCelda As Range Dim iCodAscii As Integer ’ Recorre las celdas de la selección For Each oCelda In Selection If IsEmpty(oCelda) Then Beep MsgBox "La celda " & oCelda.Address & " está vacía" Else ’ Código Ascii de la última letra iCodAscii = Asc(Right(oCelda, 1)) ’ Si está en mayúsculas If iCodAscii >= 65 And iCodAscii <= 90 Then oCelda.Value = UCase(Left(oCelda, 1)) _ & LCase(Right(oCelda, Len(oCelda) - 1)) ’ Si está en minúsculas ElseIf iCodAscii >= 97 And iCodAscii <= 122 Then oCelda.Value = UCase(oCelda) Else MsgBox "El último carácter de la celda: " _ & oCelda.Address & " no es una letra" End If End If Next End Sub
2. Instrucción Select Case
Select Case
Ejecuta una secuencia de instrucciones específicas en función del valor de una expresión.
Su sintaxis es la siguiente
Select Case <ExpresiónTest> Case <ListaExpresiones> <instrucciones> Case <ListaExpresiones> <instrucciones> ... ... Case Else <instrucciones> End Select
<listaExpresiones> puede tomar una de las siguientes formas:
- Valor (ejemplo: Case 10)
- Lista de valores (ejemplo: Case 1, 5, 10)
- Rango de valores (ejemplo: Case 1 To 5)
- Expresión condicional (ejemplo: Case Is >= 5)
Ejm
Llamada a un procedimiento que determina la fórmula de cálculo del total en función de la cantidad, del precio y del flete.
Private Sub Calc_Total() ' LLAMA A LA FUNCIÓN TOTAL USANDO COMO PARÁMETROS ' LAS CELDAS Cant, Precio y Flete Range("D2") = Total(Range("A2"), Range("B2"), Range("C2")) End Sub
La función Total devuelve una fórmula de Excel. El flete es gratuito a partir de dos unidades pedidas; el porcentaje de descuento también depende de la cantidad pedida.
Function Total(oCant As Range, oPrecio As Range, oFlete As Range) _ As String ’ Determinación de la fórmula de cálculo del total ’ en función de la cantidad ordenada Select Case oCant Case 1 Total = "=" & oPrecio.Address & "+" & oFlete.Address Case 2 To 10 Total = "=" & oCant.Address & "*" & oPrecio.Address Case 11 To 100 Total = "=" & oCant.Address & "*" & oPrecio.Address & "* 0.95" Case 101 To 1000 Total = "=" & oCant.Address & "*" & oPrecio.Address & "* 0.9" Case Else Total = "Error en la cantidad" End Select End Function