Está en la página 1de 15

ESTRUCTURA DE REPETICIÓN FOR...

NEXT


Introducción a las estructuras de control repetitivas



Cómo detener la ejecución de un programa



Instrucción FOR...NEXT

1.9.1 - Introducción a estructuras de control repetitivas
En los siguientes temas vamos a ver las instrucciones que existen en la
ProgramaciónEstructurada para conseguir que un bloque de instrucciones se puedan ejecutar
más de unavez sin necesidad de escribirlas repetidas en el listado del código fuente del
programa.En lenguaje ensamblador y en las versiones antiguas da BASIC se usan instrucciones
de tipoGOTO que continúan la ejecución del programa en otra parte, pero esto da lugar a
programasmuy reliados (Código "espagueti") que son muy difíciles de depurar y pueden
contener errores.Para solucionar el problema en la Programación Estructuradas existen
estructuras de controlque encierran un conjunto de instrucciones (con una instrucción al
principio y otra al final) y loque hacen es ejecutar el bloque de instrucciones entero un número
determinado de veces,mientras se cumpla una condición o hasta que se cumpla una condición,
según sea laestructura. A estas estructuras también se las conoce como "Bucles" o "Lazos".
Cómo detener un programa
Al usar estas estructuras nos podemos encontrar con el problema de que si el programa
noestá escrito correctamente nunca se salga de la estructura de control produciéndose el
efectollamado "Bucle infinito" que puede llegar a bloquear el ordenador.En un programa
normal ya compilado y terminado que se ejecute bajo Windows puede pasarque el ordenador
se bloquee y aparezca una pantalla azul recuerdo de Bill Gates de tipo "Elsistema está ocupado
o no responde...", con lo que casi seguro que vamos a tener que reiniciarel ordenador.En los
entornos de programación esto normalmente no llegará a ocurrir. En caso de quenuestro
programa se bloquee puede que se agoten los recursos del sistema y el programa sedetenga
dando un error de tiempo de ejecución y volviendo al editor de código.Si el programa se queda
bloqueado se puede pulsar la siguiente combinación de teclas:
Control + Pausa
para detener la ejecución del programa y volver al editor de código donde habrá que repasar
elcódigo para que esto no ocurra y el programa funcione siempre bien. En algunos casos
traspulsar esta combinación de teclas habrá que pulsar una vez la tecla ENTER para
desbloquearel programa.
Instrucción FOR...NEXT
Empecemos con un ejemplo como siempre. Vamos a escribir un programa que escriba
losnúmeros del 1 al 5 usando las instrucciones que ya conocemos.
CLSPRINT 1PRINT 2

PRINT 3PRINT 4PRINT 5
Como se puede ver es un programa bastante tonto. Hay cinco instrucciones casi iguales.
Solocambia el valor de la expresión que cada vez vale lo que en la instrucción anterior más
uno, porlo tanto también podíamos haber hecho esto:
CLSn = 0n = n + 1PRINT nn = n + 1PRINT nn = n + 1PRINT nn = n + 1PRINT nn = n + 1PRINT n
Se puede comprobar que el resultado es el mismo que en el programa anterior y ahora sí
quetenemos cinco pares de instrucciones completamente idénticos. Vamos a hacer el
mismoprograma con la nueva instrucción FOR ("Para" en castellano):
CLSFOR n = 1 TO 5PRINT nNEXT
Ya está. Mira que sencillo, pero ahora viene la explicación.Esto lo que hace es que se ejecute lo
que hay entre el FOR y el NEXT cinco veces siguiendoestos pasos:

La primera vez n vale 1, como pone en la instrucción.

Se ejecuta el bloque de instrucciones con n valiendo 1

AUTOMÁTICAMENTE n se incrementa en 1, pasando a valer 2

Se comprueba que n es menor o igual que 5, y como lo es se sigue.

Se ejecuta el bloque de instrucciones con n valiendo 2

AUTOMÁTICAMENTE n se incrementa en 1, pasando a valer 3

Se comprueba que n es menor o igual que 5, y como lo es se sigue.

Se ejecuta el bloque de instrucciones con n valiendo 3

AUTOMÁTICAMENTE n se incrementa en 1, pasando a valer 4

Se comprueba que n es menor o igual que 5, y como lo es se sigue.

Se ejecuta el bloque de instrucciones con n valiendo 4

AUTOMÁTICAMENTE n se incrementa en 1, pasando a valer 5

Se comprueba que n es menor o igual que 5, y como lo es se sigue.

Se ejecuta el bloque de instrucciones con n valiendo 5

AUTOMÁTICAMENTE n se incrementa en 1, pasando a valer 6

Se comprueba que n es menor o igual que 5, y como ya no lo es se sale del bucley se ejecuta la
siguiente instrucción que venga detrás del NEXT.Todo esto puede parecer muy complicado,
pero con la práctica conseguiremos que esta seauna de las instrucciones más fáciles de
entender de la programación, sólo habrá que detenersea pensar en estos pasos cuando algún
programa no haga lo que queremos y no demos con elerror
bjetivo.

El cometido de esta práctica es el aprendizaje, por parte del alumno, de la sintaxis y el
funcionamiento de las estructuras de repetición (bucles) de que dispone el lenguaje Visual
Basic, además de profundizar en la utilización de estructuras condicionales, variables y objetos.



Ejercicio 1.

· Crear un procedimiento Sub en Excel.

· El procedimiento leerá un dato numérico tecleado por el usuario.

· Si el dato no es numérico (función IsNumeric(·)) aparecerá un mensaje de error.

· En caso de que se trate de un número, si es negativo se mostrará un nuevo mensaje de
error.

· En caso de tener un número positivo, se llamará a una función que calculará el factorial
del mismo (en caso de que no sea entero habrá que extraer su parte entera mediante Int(·)).

· Finalmente, el factorial se mostrará al usuario en un cuadro de mensaje. Además, se
escribirá dicho resultado en la celda B1 del libro creado, utilizando para ello la propiedad Value
(valor) del objeto Selection, del siguiente modo:

Range("B1").Select

Selection.Value=...




Ejercicio 2.

· Escribir un procedimiento en Excel que realice el seguimiento de un objeto que se deja
caer desde una determinada altura.

· La altura del lanzamiento será introducida por el usuario; en caso de que sea negativa, se
mostrará el correspondiente mensaje de error.

· En los segundos pares, se indicará la velocidad que alcanza el cuerpo y el espacio
recorrido. Estos datos se mostrarán en una cuadrícula de la hoja de cálculo que tendrá el
siguiente formato:



Tiempo

Velocidad

Espacio

0

0

0

1

9.8

4.9

...

...

...



· Utilizar las fórmulas para el movimiento uniformemente acelerado v=at y e=at2 /2.





Ejercicio 3.

La fórmula D = nos indica la distancia a la que llega un proyectil que es lanzado desde el suelo
siguiendo una trayectoria parabólica, donde v es la velocidad de salida y a es el ángulo con el
que sale el proyectil.

· Escribir un procedimiento VBA en que se teclee la distancia a la que queremos lanzar un
proyectil. Después tendremos cinco intentos, en cada uno de los cuales teclearemos qué
velocidad queremos imprimir al proyectil y qué ángulo de salida.

· Si en cada uno de estos intentos nos alejamos más de un 10% del objetivo, se mostrará el
mensaje “Disparo fallido”.

· En caso contrario aparecerá un cuadro indicando la distancia a la que hemos llegado,
finalizando la ejecución del procedimiento aunque no se hayan agotado los intentos.


Ejercicio 4.

· Abrir cualquier documento de Word, y escribir en él un procedimiento de Visual Basic que
muestre las 10 primeras palabras del documento en otros tantos cuadros de mensaje. Utilizar
para ello la instrucción

ActiveDocument.Range.Words(i).Text

o más abreviada

ActiveDocument.Range.Words(i)

donde i representa la i-ésima palabra del documento activo.



Ejercicio 5.

· Abrir cualquier documento de Word, y escribir en él un procedimiento VBA que cuente el
número de secciones (Sections), párrafos (Paragraphs), líneas (Sentences) y palabras (Words)
que contiene; para ello, se puede utilizar la instrucción

vVariable = ActiveDocument.Range.Words.Count

aplicada a la colección que se desee analizar y asignándola a cualquier variable.

· Posteriormente, repetir el contenido del documento en el mismo, pero invirtiendo el
orden; es decir, aparecerá, al final del texto original, una repetición del mismo pero
comenzando por la última palabra; a la hora de escribir en el documento, se puede utilizar la
instrucción

ActiveDocument.Words(i).InsertAfter Text:=texto

que inserta el texto indicado tras la palabras i-ésima del documento activo, o bien

ActiveDocument.Range.InsertAfter Text:=texto

que inserta el texto especificado al final del documento activo
ESTRUCTURAS DE REPETICIÓN (BUCLES) CON VISUAL BASIC

Vamos a ver cómo materializar con Visual Basic estructuras de repetición que permitirán que en nuestros
programas se realice un proceso n veces. En concreto veremos las instrucciones Desde … Siguiente (For …
Next) con su cláusula Paso (Step), la instrucción Mientras … Hacer (Do While … Loop) y la instrucción
Hacer … Repetir Mientras (Do … Loop While).




Muchas veces podremos optar indistintamente por usar una instrucción u otra. En otros casos, es
recomendable decantarse por una de ellas por hacer el programa más legible o sencillo que usando otras
opciones.


INSTRUCCIÓN DESDE ... SIGUIENTE (FOR ... NEXT) Y CLÁUSULA PASO (STEP)

La sintaxis a emplear con Visual Basic es la siguiente:

For VAR = Vi To Vf
Instrucción 1
Instrucción 2
·
·
·
Instrucción n
Next VAR


El incremento que sufre el contador es, por defecto, unitario. Es decir, el primer valor que toma VAR en el
bucle será Vi, el segundo Vi + 1, el tercero (Vi + 1) + 1, etc. La modificación de dicho valor de incremento
la realizaremos a través de la cláusula Step después del valor Vf. Step 2 implicará que en cada repetición
del bucle el contador se incremente en dos unidades, Step 5 implicará que en cada repetición del bucle el
contador se incremente en cinco unidades. Un paso negativo del tipo Step -1 supone que el contador
decrece en vez de incrementarse. Si el paso es negativo, Vi necesariamente habrá de ser mayor que Vf, ya
que en caso contrario no se producirá la entrada en el bucle.

Con este código se nos muestra en pantalla 3 veces hola, gracias a que se ha invertido el sentido del
bucle:

Option Explicit
Dim VAR As Integer
Dim Vi As Integer
Dim Vf As Integer

Private Sub Form_Load()
Show
Vi = 1
Vf = 3
For VAR = Vf To Vi Step –1
'[También supondría tres repeticiones For VAR =
Vi to Vf]
Print "hola"
Next VAR
End Sub



Con Visual Basic resulta admisible usar Next sin indicar la variable que está sirviendo de guía del bucle,
pues todo bucle ha de tener un cierre. Sin embargo, no lo creemos recomendable pues puede dificultar la
lectura y depuración de los programas.

La instrucción For ... Next es anidable dentro de sí misma o dentro de otros tipos de bucles o estructuras,
debiendo seguir las pautas que ya hemos comentado.


EJERCICIO

Transformar en código el siguiente planteamiento: queremos generar un programa que pida un número
del 1 al 10 y nos muestre la “tabla de multiplicar” correspondiente.


SOLUCIÓN

Hemos realizado la pregunta relativa al número cuya tabla se desea conocer utilizando un InputBox.
Igualmente válido hubiera sido hacerlo con un Label contenedor de la pregunta y un TextBox donde el
usuario introduce la información.

Option Explicit
Dim T As Integer
Dim i As Integer

Private Sub Form_Load()
Show
Form1.Caption = "Tabla"
T = Val(InputBox("¿Qué tabla quiere conocer?" &
vbCrLf & _
"(Introduzca un número de 1 a 10)", "¿Número?"))
Labeltabla.FontBold = True
Labeltabla.Alignment = 2
Labeltabla = "TABLA DEL " & T & vbCrLf & vbCrLf
For i = 1 To 10
Labeltabla = Labeltabla & T & " * " & i & " = " & T *
i & vbCrLf
Next i
End Sub



Aspecto gráfico:







EJERCICIO

Transformar en código el siguiente planteamiento: queremos generar un programa que muestre todos los
enteros comprendidos entre un número definido por el usuario y 100.


SOLUCIÓN

Option Explicit
Dim Num As Integer
Dim i As Integer

Private Sub Form_Load()
Show
Form1.Caption = "Enteros"
Num = Val(InputBox("Introduzca un número entero comprendido entre 1 y 99",
"¿Número?"))
Labeltabla.Alignment = 2
Labeltabla.FontBold = True
Labeltabla = "ENTEROS ENTRE " & Num & " y 100" & vbCrLf & vbCrLf
For i = Num To 100
Labeltabla = Labeltabla & i & " "
Next i
End Sub



Aspecto gráfico:








INSTRUCCIÓN MIENTRAS ... HACER (DO WHILE ... LOOP)

La sintaxis que hemos de seguir es la siguiente:


Do While [condición]
Instrucción 1
Instrucción 2
.
.
.
Instrucción n
Loop



Las instrucciones tipo Do While son anidables dentro de sí mismas o dentro de otras estructuras. Es
importante verificar que los bucles diseñados con esta instrucción dispongan de una condición de salida
válida.


INSTRUCCIÓN HACER ... REPETIR MIENTRAS (DO ... LOOP WHILE)

La sintaxis a utilizar es:


Do
Instrucción 1
Instrucción 2
.
.
.
Instrucción n
Loop While
[condición]



Un Do ... Loop While es anidable dentro de sí mismo o dentro de otras estructuras. Es importante verificar
que los bucles diseñados con esta instrucción dispongan de una condición de salida válida.




Visual Basic admite además de la cláusula While, usar el término Until, como
equivalente
a "hasta que se cumpla que". Así Loop Until i >= 3 significaría "Repetir hasta que i sea
mayor o igual que 3". En un bucle en el que i parte de un valor cero y se incrementa
unitariamente Do While i < 3 sería equivalente a Do Until i >= 3, y Loop Until i >= 3 sería
equivalente a Loop While i < 3. Dado que podemos valernos de equivalencias, puede
evitar confundirnos el usar preferentemente un mismo tipo de expresión, sabiendo que
disponemos de otra equivalente.