Estructuras en ciclo

Las estructuras en ciclo o repetitivas permiten repetir la ejecución de un conjunto de instrucciones.

Se distinguen varios tipos de estructuras en ciclo:

  • Do… Loop
  • While… Wend
  • For… Next
  • For Each… Next

Do…Loop y While…Wend repiten las operaciones en función de una cierta condición, mientras que For…Next repite las operaciones una cantidad de veces determinada por un contador.

For Each…Next permite recorrer los elementos de una colección.

1. Instrucción Do…Loop

Ejecuta un bloque de instrucciones un número indeterminado de veces.

Sintaxis 1

Las instrucciones se ejecutan, mientras que la condición devuelve el valor True.

Do While <Condición>
<Instrucciones>
Loop

Sintaxis 2

Las instrucciones se ejecutan una primera vez sin condición y, luego, mientras la condición devuelva True.

Su sintaxis es la siguiente

Do
<Instrucciones>
Loop While <Condición>

Ejm

El siguiente código solicita al usuario que escriba un número mientras que el valor introducido no sea numérico o superior a 100.

Sub Introducir_numero()
Dim VRespuesta As Variant
Do
VRespuesta = InputBox("Introduce un número > 100")
Loop While (Not IsNumeric(VRespuesta) Or VRespuesta <= 100)
End Sub

Sintaxis 3

Las instrucciones se ejecutan hasta que la condición toma el valor True (mientras que la condición devuelva el valor False).

Su sintaxis es

Do Until <Condición>
<Instrucciones>
Loop

Sintaxis 4

Las instrucciones se ejecutan una primera vez sin condición y luego hasta que la condición devuelva el valor True.

Do
<Instrucciones>
Loop Until <Condición>

Ejm

El siguiente código solicita al usuario que escriba un número hasta que el valor introducido sea numérico y mayor que 100.

Sub Introducir_Numero()
Dim vResponse as Variant
Do
vResponse = InputBox("Introduzca un número > 100")
Loop Until (IsNumeric(vResponse) And vResponse > 100)
End Sub

2. Instrucción While…Wend

Ejecuta una serie de instrucciones en un ciclo mientras se cumple la condición especificada.

Su sintaxis es la siguiente

While <condición>
<instrucciones>
Wend

Ejm

Sub Introducir_Precio()
' PIDE LA INTRODUCCIÓN DE UN PRECIO MIENTRAS
' SEA VACÍO O INCORRECTO

While IsEmpty(Range("C9")) Or Not IsNumeric(Range("C9"))
Range("C9") = InputBox("Introduce el precio del producto")
Wend
End Sub

3. Instrucción For…Next

Ejecuta un bloque de instrucciones según el valor de un contador.

For <contador>=<inicio> To <fin> [Step <incremento>]
<instrucciones>
Next

Ejm

El siguiente código muestra un procedimiento que inserta los totales trimestrales en una matriz de resultados mensuales, además, el procedimiento elimina los totales si ya los había.

Sub Totales_Trimestrales()
Dim iTrim As Integer
Dim i As Integer
Dim oCelda as Range
’ Inserta los totales trimestrales cada 3 meses,
’ los pone en negrita con un borde
iTrim = 1
For i = 5 To 17 Step 4
If Left(Cells(2, i), 4) <> "Trim" Then
Cells(2, i).EntireColumn.Insert
Cells(2, i) = "Trim. " & iTrim
iTrim = iTrim + 1
Range(Cells(3, i), Cells(11, i)).Select
Selection.FormulaR1C1 = "=SUM(RC[-3]:RC[-1])"
Range(Cells(2, i), Cells(11, i)).Font.Bold = True
For Each oCelda In Range(Cells(2, i), Cells(11, i))
oCelda.BorderAround ColorIndex:=1, Weight:=xlThin
Next oCelda
End If
Range("A1").Activate
Next
End Sub
________________________________________________________________
Sub Suprime_Totales_Trimestrales()
Dim i As Integer
’ Suprime los totales trimestrales si ya los había
For i = 5 To 17
If Left(Cells(2, i), 4) = "Trim" Then
Cells(2, i).EntireColumn.Delete
End If
Next i
End Sub

El siguiente procedimiento muestra en la hoja de cálculo “Colores” los diferentes colores de relleno y el valor de la propiedad ColorIndex correspondiente.

Sub Muestra_Colores()
Dim i As Integer
With Sheets("Colores")
For i = 1 To 56
Cells(i, 1).Interior.ColorIndex = i
Cells(i, 2) = i
Next i
End With
End Sub

4. Instrucción For Each…Next

Ejecuta un bloque de instrucciones para cada elemento de una colección de objetos o de una matriz.

Su sintaxis es la siguiente

For Each <elemento> In <Grupo>
<Instrucciones>
Next <elemento>

Ejm

Este procedimiento aplica un color de letra a las celdas en función de su contenido.

Sub Colores_Celda()
Dim oZonaaModificar As Range
Dim oCelda As Range
’ Aplica un color en función del valor de la celda
Set oZonaaModificar = Range("B3:Q11")
For Each Celda In oZonaaModificar
Select Case oCelda
Case Is < 1000
oCelda.Font.Color = RGB(150, 150, 250)
Case Is < 5000
oCelda.Font.Color = RGB(90, 100, 250)
Case Is < 10000
oCelda.Font.Color = RGB(10, 20, 250)
Case Is < 20000
oCelda.Font.Color = RGB(5, 10, 175)
Case Else
oCelda.Font.Color = RGB(5, 5, 100)
End Select
Next
End Sub

Ejecución de varias acciones sobre un objeto

Su sintaxis sería

With objeto
<Instrucciones>
End With

Ejm

Sub Paginacion()
’ Define la paginación de la hoja activa
’ Redimensiona las columnas y procede con la impresión
With ActiveSheet
With .PageSetup
.Orientation = xlLandscape
.LeftMargin = Application.InchesToPoints(0.5)
.RightMargin = Application.InchesToPoints(0.5)
.TopMargin = Application.InchesToPoints(0.5)
.BottomMargin = Application.InchesToPoints(0.5)
.LeftHeader = ""
.CenterHeader = "&A"
.RightHeader = ""
.LeftFooter = ""
.CenterFooter = "Page &P"
.RightFooter = ""
End With
.Columns("A:Q").EntireColumn.AutoFit
.PrintOut
End With
End Sub

5. Salir de las estructuras de control

La instrucción Exit For permite salir directamente de un ciclo For o For Each, mientras que Exit Do sale directamente de un ciclo Do.

Sub Introducir_Fecha()
Dim vValor as Variant
’ Fuerza la introducción de una fecha en la celda A1
’ Si no se introduce ningún valor: se sale del ciclo
Range("A1") = ""
Do While Not IsDate(Range("A1"))
strVal = InputBox("Escriba una fecha")
If vVal <> "" Then
If IsDate(vVal) Then Range("A1") = vVal
Else
Exit Do
End If
Loop
End Sub