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