¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Macros y lenguaje VBA
  3. Bucles
Extrait - Macros y lenguaje VBA Descubra la programación en Excel (nueva edición)
Extractos del libro
Macros y lenguaje VBA Descubra la programación en Excel (nueva edición) Volver a la página de compra del libro

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 5 
   MsgBox "Todo va a salir bien" 
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 5, por lo que tomará sucesivamente los valores 1, 2, 3, 4 y 5. 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 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 i 
Next...

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: 

images/cap09_img_01.png

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:

images/cap09_img_02.png

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)

Bucle For Next 
For i=1 To 10 
... 
Next i 
Bucle Do Until 
Loop 
Do Until Condición 
... 
Loop 
Bucle Do Loop 
Until 
Do 
... 
Loop Until Condición 
Bucle For Each Next 
Bucle Do While 
Loop 
Do While Condición 
... 
Loop 
Bucle Do Loop While 
Do 
... 
Loop While 
Condición 

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 Capitulo09_Ejercicio1A.

Esta macro deberá mostrar los valores de 5 a 10.

 Ejecute la macro Capitulo09_Ejercicio1A.

Deberá ver los valores del 5 al 10 en sucesión.

En incrementos de 2 en 2

 Cree la macro Capitulo09_Ejercicio1B.

Esta macro deberá mostrar los valores de 20 a 30 en incrementos de 2 en 2.

 Ejecute la macro Capitulo09_Ejercicio1B.

Deberá ver los valores pares entre el 20 y el 30.

Decrementando

 Cree la macro Capitulo09_Ejercicio1C.

Esta macro deberá mostrar los valores de 30 a 10 decrementando de 5 en 5.

 Ejecute la macro Capitulo09_Ejercicio1C.

Deberá ver sucesivamente los valores 30, 25, 20, 15 y 10.

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 Capitulo09_Ejercicio1D.

La macro llamará al procedimiento BucleIncrementalConParametros 3 veces. Le pasará sucesivamente los valores 1,5 y 1, luego 5, 10 y 2 y finalmente 5, 10 y -2.

 Ejecute la macro Capitulo09_Ejercicio1D.

Debería ver sucesivamente los valores del 1 al 5 y luego 5, 7 y 9, ya que el último conjunto...