Bucles
Objetivos
En este capítulo, descubrirá una parte importante de la programación VBA: los bucles. Vamos a abordar algunas definiciones y situaciones de la vida real para, a continuación, ver los diferentes tipos de bucles.
Aprenderá a estructurar sus bucles y a salir de ellos de manera anticipada.
Al final del capítulo encontrará ejercicios para practicar.
Situaciones de uso de los bucles
En VBA, cuando se quiere ejecutar el mismo conjunto de instrucciones una y otra vez, el método de copiar las mismas líneas n veces no es una solución viable, especialmente cuando se trata de escribir un programa, como, por ejemplo:
Sub FormaIncorrectaDeCodificar()
MsgBox "Buenos días"
MsgBox "Buenos días"
MsgBox "Buenos días"
...
MsgBox "Buenos días"
End Sub
Ejemplo 1: forma incorrecta de codificar una instrucción repetitiva
Del mismo modo, si quiere mostrar el mensaje hasta que el usuario escriba uno de los valores que usted desea (1 o 0, por ejemplo), no sabrá cuándo continuar con el resto de su programa, como ocurre con el siguiente código.
Sub OtraFormaIncorrectaDeCodificar()
Dim Respuesta As Integer
Respuesta = InputBox("Introduzca un valor entre 1 y 0")
If Respuesta <> 0 And Respuesta <> 1 Then
Respuesta = InputBox("Introduzca un valor entre 1 y 0")
End If
If Respuesta <> 0 And Respuesta <> 1 Then
Respuesta = InputBox("Introduzca un valor...
¿Qué es un bucle?
Un bucle en VBA es una serie de palabras clave que delimitan una serie de instrucciones que pueden ejecutarse varias veces, según condiciones que usted puede establecer, como mostrar tres veces el mismo mensaje o realizar el mismo tratamiento en varias filas de la misma hoja de Excel.
Hay varios tipos de bucles, cada uno de los cuales tiene su propio interés en función de sus necesidades. Sus nombres están estrechamente relacionados con las palabras clave que se utilizan para delimitar las instrucciones que se repiten.
Un bucle es una estructura de código compuesta de tres partes:
[Inicio del Bucle] [vinculado a una condición]
Instrucciones
[Iterar] [vinculado a una condición]
Para saber qué tipo de bucle hay que utilizar, al final del capítulo se presenta una tabla recapitulativa por caso.
Diferentes tipos de bucles
Bucles For Next
Cuando ya sabe cuántas veces quiere ejecutar un grupo de instrucciones, el bucle For Next es la opción indicada.
La sintaxis general de un bucle de este tipo es la siguiente:
For Contador=ValorInicial To ValorFinal
Instrucciones
Next Contador
Ejemplo 3: sintaxis general de un bucle For Next
He aquí un ejemplo de bucle For Next:
Dim i As Long
For i = 1 To 10
MsgBox "Es el día de la marmota"
Next i
Ejemplo 4: usar un bucle For Next
Las palabras clave For y Next explican su uso.
En este tipo de bucle se utiliza un contador que varía desde un valor inicial hasta uno final.
En nuestro ejemplo anterior, nuestro contador es la variable i, de tipo entero, que variará de 1 a 10, por lo que tomará sucesivamente los valores 1, 2, 3, 4, 5, 6, 7, 8, 9 y 10. Una vez alcanzado el valor final, decimos que «salimos del bucle», y el programa continúa ejecutando las líneas que seguirán después de él.
Lo práctico de este tipo de bucle es que puede utilizar el valor de la variable i dentro del bucle para que usted pueda manipularla.
Así que puede mostrarle al usuario los valores del 1 al 5 con estas 3 líneas:
For i = 1 To 5
MsgBox i
Next i
Ejemplo 5: otro uso de un bucle For Next
Pero también puede utilizar esta variable para leer los valores de las celdas A1 a A5, por ejemplo, con:
For i = 1 To 5
MsgBox Range("A" & i).Value
Next i
Ejemplo 6: usar la variable i en un bucle For Next
Pero eso no es todo: también puede indicar el incremento del programa para pasar desde el valor inicial hasta el valor final. Por ejemplo, si quiere mostrar los valores impares del 1 al 9 incrementando de 2 en 2 (1, 3, 5, 7 y 9), utilizará la palabra clave Step, seguida del valor, de esta forma:
For i=1 To 9 Step 2
MsgBox...
Bucle infinito y otros tipos de errores relacionados con los bucles
Bucle infinito
Tenga cuidado: cuando se utilizan los bucles Do Loop o While Wend es usual equivocarse en los criterios de entrada/salida del bucle y caer en un «bucle infinito», lo que hará que su aplicación se ejecute indefinidamente (resultando en una pantalla congelada), que no le dejará otra opción más que detenerla y reiniciarla.
He aquí un ejemplo de bucle infinito (la condición siempre será falsa/False):
Do Until False
Instrucciones
Loop
Ejemplo 19: bucle infinito con Do Until Loop
Para detener el programa mientras se está ejecutando, puede utilizar las teclas Ctrl + [Pausa] simultáneamente. También se puede usar la tecla [esc]. Aparecerá la siguiente ventana:
Después, podrá continuar el programa (Continuar), detener el programa (Finalizar), acceder al código (Depurar) o acceder a la ayuda en línea de Microsoft.
Superar la capacidad
También puede ocurrir que, al utilizar bucles, la variable que usa como contador sobrepase los límites que permite su tipo; por ejemplo, si utiliza el tipo Integer para un contador, el valor máximo admitido es 32 767. Si intenta ejecutar su programa más allá de este valor, aparecerá una ventana con el siguiente mensaje de error:
Salir de un bucle
Aunque no es recomendable cuando se es nuevo en la programación con bucles de VBA, debe saber que se puede salir de un bucle antes de tiempo, es decir, salir del bucle antes de que se alcance el valor máximo o de que la condición de salida sea verdadera. La instrucción de salida anticipada tendrá la palabra clave Exit (Salir) asociada al tipo de bucle del que se desea salir. Esta declaración le ahorra tiempo, pero hará más difícil la depuración de su código más tarde. Por lo tanto, se recomienda utilizarla con moderación.
Salir de un bucle For - Exit For
Para salir de los bucles de tipo For Next o For Each Next, la sintaxis de salida anticipada se realiza utilizando las palabras clave Exit For.
Por ejemplo, si se recorren los primeros 50 renglones de la columna A para comprobar que el valor ENI está disponible:
Dim bENIEstaPresente As Boolean 'sirve para saber si el valor ENI
se encuentra
bENIEstaPresente = False 'inicializar nuestra variable
Dim i As Integer
For i = 1 To 50
If Range("A" & i).Value = "ENI" Then 'Si la celda contiene ENI, entonces
bENIEstaPresente = True 'cambiamos la variable a Verdadero/True
Exit For 'y salimos del bucle
End If
Next...
Resumen según el caso
Aunque hay varios tipos de bucles a su disposición, no todos serán igual de eficaces. Así pues, para ayudarle a entender qué estructura de código debe utilizar en cada caso, he aquí una tabla recapitulativa.
Caso en el que N (número de veces que se ejecutarán las instrucciones) es: |
||
Conocido de antemano |
Desconocido (de 0 a N veces) |
Desconocido (1 vez o más) |
|
|
|
|
|
|
La experiencia en programación le permitirá adaptarse según su soltura y comprensión del programa.
Ejercicios
Bucles For Next
En incrementos de 1 en 1
Cree la macro MostrarDe15a20.
Esta macro deberá mostrar los valores de 15 a 20.
Ejecute la macro MostrarDe15a20.
Deberá ver los valores del 15 al 20 en sucesión.
En incrementos de 2 en 2
Cree la macro MostrarDe10a20.
Esta macro deberá mostrar los valores de 10 a 20 en incrementos de 2 en 2.
Ejecute la macro MostrarDe10a20.
Deberá ver los valores pares entre el 10 y el 20.
Decrementando
Cree la macro MostrarDe40a20De5En5.
Esta macro deberá mostrar los valores de 40 a 20 decrementando de 5 en 5.
Ejecute la macro MostrarDe40a20De5En5.
Deberá ver sucesivamente los valores 40, 35, 30, 25 y 20.
En incrementos por medio de un parámetro
Escriba un procedimiento BucleIncrementalConParametros que tome como parámetros tres valores enteros, llamados respectivamente LimiteA, LimiteB e Incremento.
Este procedimiento deberá mostrar los valores comprendidos entre LimiteA y LimiteB según el incremento definido en Incremento.
Cree la macro LlamadaBucleIncrementalConParametros.
La macro llamará al procedimiento BucleIncrementalConParametros 3 veces. Le pasará sucesivamente los valores 2,7 y 1, luego 5, 10 y 2 y finalmente 5, 10 y -2.
Ejecute la macro LlamadaBucleIncrementalConParametros.
Debería ver sucesivamente los valores del 2 al 7 y luego 5, 7 y 9, ya que el último conjunto...