Anda di halaman 1dari 11

Ciclos usando Do While y Do Until

En el Do While, se ejecutan las instrucciones mientras sea cierta la


expresin de control.
Ej.:
Private Sub Command1_Click( )
Dim Control as Long
On Error Resume Next
Control = Text1.Text
Form1.BackColor = vbWhite
Do While Control <> 0
Label2.Caption = Valor: & Control
If Form1.BackColor = vbWhite Then
Form1.BackColor = vbRed
Else
Form1.BackColor = vbWhite
End If
Control = Text1.Text
DoEvents
Loop
MsgBox Loop completado
End Sub

En el ejemplo presentado, la forma cambiar de color blanco a rojo y


viceversa mientras el texto de Text1 sea diferente a cero (0). Tan pronto el
valor del texto sea igual a cero, el ciclo terminar su ejecucin. Se utiliza la
lnea On Error Resume Next para indicarle a Visual Basic que siga ejecutando la
forma, an cuando ocurra un error de ejecucin. Esta instruccin es necesaria
dado que en el ciclo Do While se lee continuamente el texto del Text1. Si la
lnea On Error Resume Next no se escribe y en algn momento se borra el texto
para escribir otro valor, Visual Basic dara error al leer el texto en ese instante.
En Do While Control <> 0, la expresin de control es Control <> 0. Esta es
la expresin que controla el ciclo. Al ser evaluada, solo puede tomar el valor
de True (cierto) o False (falso). Dependiendo de ese valor, es ejecutado el
ciclo. Si el valor es True, las instrucciones dentro del ciclo se ejecutan. Si el
valor es False, Visual Basic ejecuta la instruccin que le sigue a la lnea Loop.
Esta expresin de control tambin se conoce como boolean expression.
La lnea DoEvents es esencial, pues le indica a Visual Basic que en cada
loop o ciclo espere unos segundos para recibir mensajes a travs de Windows.
Sin esta lnea, el Do While se ejecutara tan rpido que no sera posible hacer
alguna entrada (input) al proyecto, asumiendo que sea necesario el input en
el ciclo (como en el ejemplo).
La lnea Loop indica el final de las instrucciones que estn dentro del Do
While loop. En este punto, Visual Basic regresa a la lnea donde comienza el
Do While y verifica la expresin de control. Si todava es cierta la expresin,
el ciclo se ejecuta nuevamente.
En el Do Until, se ejecutan las instrucciones hasta que la expresin de
control sea cierta.

Ej.:
Private Sub Command1_Click( )
Dim Control as Long
On Error Resume Next
Control = Text1.Text
Form1.BackColor = vbWhite
Do Until Control = 0
Label2.Caption = Valor: & Control
If Form1.BackColor = vbWhite Then
Form1.BackColor = vbRed
Else
Form1.BackColor = vbWhite
End If
Control = Text1.Text
DoEvents
Loop
MsgBox Loop completado
End Sub

En el ejemplo, las instrucciones dentro del Do Until se ejecutan hasta


que el valor entrado en el texto del Text1 sea igual a cero. Se debe notar que la
nica lnea que cambi fue la lnea del Do Until. Las otras instrucciones
explicadas en el Do While (On Error Resume Next, DoEvents y Loop) cumplen las
mismas funciones en el Do Until.
Es importante sealar la diferencia principal entre el Do While y el Do
Until; en el primero el ciclo se ejecuta mientras la expresin de control es
cierta, en el segundo el ciclo se ejecuta hasta que la expresin de control sea
cierta.
Una caracterstica en comn que tienen los dos ciclos presentados es
que la expresin de control se verifica antes de entrar al ciclo o loop. Si la
condicin para entrar al loop no se cumple, el ciclo no se ejecuta.
Ejercicio de prctica:
1. Crear una forma como la siguiente:

2. Do While:

En el comando Ciclo con While, escribir el cdigo del ejemplo de Do


While. Ejecutar el programa y observar que cuando se oprime ese
comando, la forma cambia de color continuamente. Escribir 0 (cero)
para terminar la ejecucin.
3. Do Until:
En el comando Ciclo con Until, escribir el cdigo del ejemplo de Do Until
(en realidad, en ambos cdigos slo cambia la lnea del Do).
Comprobar que la ejecucin es igual a la del Do While.

ExcelAvanzado.com
Un juego de nios ...

Pgina principal
Curso
Macros
Suscripcin

JUEVES, 9 DE JUNIO DE 2011

Estructuras repetitivas: Do While ... Loop

Descargar el fichero: do_while_loop.xlsm


Versin 2003: do_while_loop.xls

uando conocemos cuantas veces se ha de repetir el bucle usamos la

estructura FOR ... NEXT, pero cuando desconocemos el nmero de veces que se
ha de repetir el bucle debemos ir a una estructura del tipo DO WHILE ... LOOP, o
alguna de sus variantes. Esto es lo que vamos a ver en esta ocasin.

Do While ... Loop


Hacer mientras se cumpla la condicin.
La sintaxis de esta estructura es la siguiente:
Do While condicin
....

....
Loop
Esta estructura permite hacer un bucle que se repetir mientras se siga
cumpliendo la condicin. El flujo del programa se ejecuta de arriba hacia abajo. Al
llegar a la linea superior del bucle se analiza la condicin y si es verdadera se
ejecutan las lneas interiores del bucle. Al llegar al Loop se devuelve el flujo del
programa al inicio, y se vuelve a analizar la condicin. Este proceso se repite
mientras la condicin sea verdadera, por tanto, en algn momento se debe
producir algn cambio en las sentencias interiores del bucle que hagan que la
condicin se transforme en falsa para que no se siga repitiendo el bucle de forma
indefinida. En el momento en el que la condicin es falsa el bucle ya no se ejecuta
y se devuelve el control del flujo del programa a las sentencias que se encuentres
debajo del Loop.
Hemos diseado un ejemplo donde generamos nmeros aleatorios entre 1 y 100, y
se los asignamos a la variable i.
i = Int(Rnd * 100) + 1
Con la variable s vamos a sumar los valores que va tomando i. Esto es lo que se
denomina un ACUMULADOR, que va aadiendo valores a la variable s.
s=s+i
Esta expresin no se debe interpretar como lo haramos en matemticas. En
programacin el signo igual indica que lo que hay a la derecha se va a asignar a la
variable que hay a la izquierda.
La interpretacin correcta es que tomamos el antiguo valor de la variable s y le
sumamos lo que vale i, y esa suma se asigna al nuevo valor que ahora toma la
variable s.
Los valores que van tomando las variables i y s se escriben en las columnas 2 y 3,
que son las columnas B y C.
Para que la fila vaya cambiando en el instruccin Cells(fila, columna) hemos
creado una variable que precisamente se llama fila y que dentro del bucle, y al final
de ste, incrementa uno.
fila=fila+1
De esta forma, la filas se van incrementando de uno en uno a medida que el bucle
va haciendo sus ciclos. Esto es lo que en informtica se llama CONTADOR.
La condicin que hace que se repita el bucle es s<1000, lo que provoca que el
bucle se repita MIENTRAS se cumpla que s, que es el acumulado de la variable i,
sea inferior a 1000.

El resultado es que disponemos de dos columnas con nmeros aleatorios. En la


columna B los nmeros aleatorios son enteros entre 1 y 100, y en la columna C se
encuentran sus acumulados. El ltimo nmero de la columna C ser un nmero
entre 1000 y 1099, que al ser mayor o igual a 1000, har que la macro se detenga.
Necesitamos borrar el rango que hemos escrito en las columnas B y C, para que al
generar una nueva serie ve valores se haga sobre una zona limpia. Esto se hace
con la macro Borra.

Do ... Loop While


Do
....
....
Loop While condicin

Esta estructura es similar a la anterior pero la condicin se evala al final. La


consecuencia inmediata de esto es que el flujo del programa entra en el bucle
directamente la primera ver que se ejecuta. Al final se evala la condicin y se
decide si se repite el bucle, pero al menos se ha ejecutado una vez.

Do ... Loop Until


Hacer hasta que se cumpla la condicin
Do
....
....
Loop Until condicin

La condicin se evala y el bucle se repite hasta que se cumpla la condicin.


Hemos tenido que cambiar la condicin para obtener resultados similares. Ahora la
condicin es s>=1000 ya que el bucle se repite hasta que se cumpla la condicin.
Tambin podramos haber puesto el comando NOT, sin necesidad de tocar la
condicin. Quedara as:
Loop Until Not (s < 1000)

Hoja 2
En la Hoja2 disponemos de una tabla y deseamos desplazarnos por ella hasta que
encontremos una celda vaca.
Sub Desplaza()
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Activate
Loop
End Sub

Nos situamos en una celda que contiene datos, por ejemplo, la celda B4 y
ejecutamos la macro. al finalizar la ejecucin el cursor aparecer en la primera
celda vaca que encuentre en la columna B.
La lnea
ActiveCell.Offset(1, 0).Activate
lo que hace es desplaze el cursor una celda hacia abajo respecto a su posicin
actual. Como esta lnea esta dentro de un bucle se ejecutar repetidamente hasta
que el flujo del programa se salga de bucle.

El bucle se repite mientras la celda activa no sea una celda vaca. Esto supone,
que el cursor se vaya desplazando por la columna donde se dejara inicialmente y
que no pare de bajar hasta que se encuentre con una celda vaca.
Este bucle es muy til para encontrar en una base de datos el final de la tabla.
Para ello, debemos situar el cursor en la columna donde se encuentre el campo
llave o campo clave. Esto ha de ser as ya que sabemos que al tratarse de una
variable sin espacios vacos el cursor bajar hasta el final.

Prctica (Hoja 3)
Le invitamos a crear un cdigo que se desplace hacia arriba y que se site en una
tabla en la cabecera de la columna donde se entrontrara inicialmente el cursor.

En la Hoja3, site el cursor en la celda B24. El objetivo es que la macro desplace


el cursor de forma ascendente hasta la celda que hace el papel de cabecera de
esta columna, en nuestro caso, la celda B3.

Estructuras de control de ciclos o bucles


Gambas/Estructuras de control de ciclos o bucles

Diseo de Aplicaciones con Gambas


TEMA ANTERIOR

Estructuras de contro

NDIC

Una de las razones por las que escribimos un programa es para automatizar la ejecucin
de tareas repetitivas segn alguna condicion. Esta funcionalidad es provista por las
estructuras de control de ciclos o repeticin. Estas estructuras hacen posible que una parte
del programa se repita un nmero determinado de veces, dependiendo de alguna
condicin.
Contenido
[ocultar]

1 FOR NEXT

2 FOR EACH IN

3 DO LOOP

4 REPEAT UNTIL

5 WHILE - WEND

FOR NEXT[editar]
Se repite un numero predeterminado de veces.

Sintaxis

FOR Variable = Expression TO Expression [STEP Expression] ... NEXT 'Counter loop.
FOR iCount = 1 TO 20 STEP 3
PRINT iCount & " ";
NEXT

FOR EACH IN[editar]


Se repite para cada uno de los miembros de una coleccin de elementos.

Sintaxis

FOR EACH Variable IN Expression ... NEXT


'Enumeration loop.
FOR EACH Element IN Dict
PRINT Element;
NEXT

DO LOOP[editar]
Este estructura de control de ciclosse repetir mientras que una determinada condicin
sea cierta. La condicin puede ser evaluada al inicio o al final de la estructura dependiendo
si se usa DO WHILE - LOOP o DO - LOOP UNTIL. Si la condicin se evala al comienzo
de la estructura (condicin de entrada) el bloque de instrucciones pude no ejecutarse
ninguna vez, si la condicin de entrada es inicialmente falsa. Por el contrario, si la
condicin se evala al final de la estructura (condicin de salida) el bloque de instrucciones
se ejecutar al menos una vez, aunque la condicin de salida ya sea cierta al entrar en la
estructura.

Sintaxis

DO [WHILE Condition] ... [BREAK|CONTINUE] ... LOOP [UNTIL Condition]


'Infinite loop.
DO WHILE a <= 5
PRINT "Hello World"; a
INC a
LOOP
' The same effect with UNTIL
DO
PRINT "Hello World"; a
INC a
LOOP UNTIL a = 6

REPEAT UNTIL[editar]
El bloque de acciones se repetir hasta que una determinada condicin sea cierta. La
condicin se evala al final de la estructura (condicin de salida). Esto implica que el
bloque de instrucciones se ejecutar al menos una vez, aunque la condicin de salida ya
sea cierta al entrar en la estructura.

Sintaxis

REPEAT ... UNTIL Condition


'Loop with an exit test at the end.
REPEAT
PRINT Timer 'The repeat loop is always executed at least once,
even if the UNTIL value is initially false.
UNTIL Timer > 10

WHILE - WEND[editar]
El bloque de acciones se repetir mientras que una determinada condicin sea cierta. La
condicin se evala al comienzo de la estructura (condicin de entrada). Esto implica que
el bloque de instrucciones pude no ejecutarse ninguna vez, si la condicin de entrada es
inicialmente falsa.

Sintaxis

WHILE Condition ... WEND


'Loop with an exit test at the beginning
WHILE a \<= 10
PRINT "Hello World"; a
INC a
WEND

Anda mungkin juga menyukai