Estructura de bucle
Las estructuras de bucle permiten ejecutar repetidamente una o varias líneas de código. Las estructuras de bucle soportadas por Visual Basic son:
1.Hacer...bucle
2.Para...Siguiente
3.Para cada...Siguiente
Hacer...bucle
Utilice un bucle Do para ejecutar repetidamente un bloque de declaraciones durante un número variable de veces. Hay varias variaciones de la instrucción Do...Loop, pero cada una evalúa una condición numérica para decidir si continúa la ejecución. Como If...Thencondition debe ser un valor numérico o una expresión cuyo valor sea Verdadero (distinto de cero) o Falso (cero). En el siguiente bucle Do...Loop, las declaraciones se ejecutan siempre que la condición sea Verdadera.
hacer mientras condición
declaraciones
Bucle
Cuando Visual Basic ejecuta este bucle Do, primero probará la condición. Si la condición es Falsa (cero), se omiten todas las declaraciones. Si la condición es Verdadera (distinta de cero), Visual Basic ejecuta la instrucción y luego recurre a la instrucción DoWhile para probar la condición nuevamente.
Por lo tanto, el bucle se puede ejecutar tantas veces como se desee siempre que la condición sea Verdadera o distinta de cero. Si la condición es Falsa desde el principio, la declaración no se ejecutará. Por ejemplo, el siguiente procedimiento contará el número de veces que aparece una cadena de destino en otra cadena y realizará un bucle cada vez que se encuentre la cadena de destino:
FunctionCountStrings(cadena larga,objetivo)
Diposición, conteo
posición=1
DoWhileInStr(posición,cadena larga,objetivo)
posición=InStr(posición,cadena larga,objetivo)_
1
contar = contar 1
Bucle
CountStrings=recuento
Función final
Si la cadena de destino no aparece en otra cadena, InStr devuelve 0 y el bucle ya no se ejecuta.
Otra variación de la instrucción Do...Loop es ejecutar la instrucción primero y luego probar la condición después de cada ejecución. Este formulario garantiza que las declaraciones se ejecuten al menos una vez:
Hacer
declaraciones
Condición de bucle mientras
Las otras dos variaciones son similares a las dos primeras, excepto que ejecutan el bucle siempre que la condición sea Falsa en lugar de Verdadera.
Para...Siguiente000
Cuando no sepa cuántas veces debe ejecutarse la declaración en el bucle, es apropiado utilizar un bucle Do. Sin embargo, cuando sepa cuántas veces desea ejecutar, es mejor usar un bucle For...Next. A diferencia del bucle Do, el bucle For utiliza una variable llamada contador. Cada vez que se repite el bucle, el valor de la variable del contador aumenta o disminuye. La sintaxis del bucle For es la siguiente:
Forcounter=startToend[Incremento de paso]
declaraciones
Siguiente[contador]
Los parámetros Contador, Inicio, Fin e Incremento son todos numéricos.
Tenga en cuenta que el parámetro de incremento puede ser positivo o negativo. Si el incremento es positivo, el inicio debe ser menor o igual que el final; de lo contrario, la instrucción dentro del bucle no se puede ejecutar. Si el incremento es negativo, el inicio debe ser mayor o igual que el final para que se pueda ejecutar el cuerpo del bucle. Si no se establece Paso, el valor predeterminado de incremento es 1.
Al ejecutar un bucle For, Visual Basic
1. Establezca el contador igual al inicio.
2. Pruebe si el contador es mayor que el final. Si es así, Visual Basic sale del bucle. (Si el incremento es negativo, Visual Basic prueba si el contador es menor que el final).
3. Ejecute la declaración.
4. El contador aumenta en uno o incrementa (si se especifica).
5. Repita los pasos 2 a 4.
El siguiente código imprime todos los nombres de fuentes de pantalla válidos:
PRIvateSubForm_Click()
DimIAsEntero
Fori=0ToScreen.FontCount
ImprimirPantalla.Fuentes(i)
Próximo
FinSub
En la aplicación de ejemplo VCR, el procedimiento HighlightButton utiliza un bucle For...Next para recorrer la colección de controles del formulario VCR y mostrar el control Shape apropiado:
Botón Subresaltado(MiControlComoVariante)
DimiAsInteger
Fori=0TofrmVCR.Controls.Count-1
IfTypeOffrmVCR.Controls(i)IsShapeThen
IffrmVCR.Controls(i).Nombre=MiControlEntonces
frmVCR.Controls(i).Visible=Verdadero
Demás
frmVCR.Controls(i).Visible=Falso
Fin si
Fin si
Próximo
FinSub
Para cada...Siguiente
El bucle ForEach...Next es similar al bucle For...Next, pero repite un conjunto de declaraciones para cada elemento en una matriz o colección de objetos, en lugar de repetir las declaraciones una determinada cantidad de veces. El bucle ForEach...Next es útil si no sabes cuántos elementos tiene una colección.
La sintaxis del bucle ForEach...Next es la siguiente:
ParaEachelementIngroup
declaraciones
elemento siguiente
Por ejemplo, la siguiente subrutina abre Biblio.mdb y agrega el nombre de cada tabla a un cuadro de lista.
SubListTableDefs()
DimobjDbAsBase de datos
DimMyTableDefasTableDef
SetobjDb=OpenDatabase(c:/vb/biblio.mdb,_
Verdadero, Falso)
ForEachMyTableDefInobjDb.TableDefs()
Lista1.AddItemMyTableDef.Name
SiguienteMyTableDef
FinSub
Tenga en cuenta algunas limitaciones al utilizar ForEach...Siguiente:
1. Para las colecciones, el elemento solo puede ser una variable variante, una variable de objeto general o un objeto enumerado en el "Explorador de objetos".
2. Para matrices, el elemento solo puede ser una variable variante.
3.ForEach...Next no se puede utilizar con matrices de tipos definidos por el usuario, porque Variant no puede contener tipos definidos por el usuario.
Utilice estructuras de control
Las estructuras de control anidadas colocan una estructura de control dentro de otra estructura de control (como un bloque If...Then en un bucle For...Next). Una estructura de control que contiene otra estructura de control se llama nido. En Visual Basic, no hay límite para la cantidad de niveles anidados de estructuras de control. Como regla general, para hacer que las estructuras de juicio y las estructuras de bucle sean más legibles, el texto de las estructuras de juicio o bucles siempre se escribe con sangría.
Por ejemplo, el siguiente proceso imprime todos los nombres de fuentes comunes a la impresora y la pantalla:
PrivadoSubForm_Click()
DimSFont,PFont
ForEachSFontInScreen.Fonts()
ForEachPFontInPrinter.Fonts()
SiSFont=PFontEntonces
ImprimirFuente
Fin si
SiguientePFont
SiguienteSFont
FinSub
Tenga en cuenta que el primer Next cierra el bucle For interno y el último For cierra el bucle For externo. Del mismo modo, en sentencias If anidadas, la sentencia EndIf se empareja automáticamente con la sentencia If anterior más cercana. Las estructuras anidadas de Do...Loop funcionan de la misma manera, con la instrucción Loop más interna coincidiendo con la instrucción Do más interna.
estructura de control de salida
Utilice la instrucción Exit para salir directamente del bucle For, bucle Do, subproceso o proceso de función. La sintaxis de la declaración Exit es muy simple: no hay límite para la cantidad de veces que ExitFor puede aparecer en el bucle For, y no hay límite para la cantidad de veces que ExitDo puede aparecer en el bucle Do.
Contador=de inicio a fin
[Incremento gradual]
[bloque de declaraciones]
[Salir para]
[bloque de declaraciones]
Siguiente[contador[,contador][,...]]
Hacer[{Mientras|Hasta}condición]
[bloque de declaraciones]
[SalirHacer]
[bloque de declaraciones]
Bucle
La declaración ExitDo se puede utilizar en todas las versiones de la sintaxis del bucle Do.
ExitFor y ExitDo son útiles porque a veces es apropiado salir de un bucle inmediatamente sin ejecutar más iteraciones o declaraciones dentro del bucle. Por ejemplo, en el ejemplo anterior de una fuente compartida entre la pantalla de impresión y la impresora, el programa siguió comparando la fuente de la impresora con una fuente de pantalla determinada, incluso después de haber encontrado una fuente de máquina de escribir coincidente. Existe una versión más eficiente de esta función que sale del bucle tan pronto como se encuentra una fuente coincidente:
PrivadoSubForm_Click()
DimSFont,PFont
ForEachSFontInScreen.Fonts()
ForEachPFontInPrinter.Fonts()
SiSFont=PFontEntonces
Imprimir fuente
ExitFor 'Salir del bucle interno.
Fin si
SiguientePFont
SiguienteSFont
FinSub
Como ilustra este ejemplo, las declaraciones Exit casi siempre aparecen dentro de declaraciones If o declaraciones SelectCase, que están anidadas dentro de bucles.
Cuando se interrumpe un bucle con una instrucción Exit, el valor de la variable del contador diferirá dependiendo de cómo se salga del bucle:
1. Cuando se completa el ciclo, el valor del contador es igual al valor del límite superior más el valor del paso.
2. Al salir anticipadamente del ciclo, la variable contador conserva su valor, sujeto a las reglas generales relativas a los rangos de valores.
3. Al iterar fuera de la colección, si la variable del contador es de tipo Objeto, su valor es Nada; si la variable del contador es de tipo Variante, su valor es Vacío;
Salir de una subrutina o procedimiento de función
También se puede salir de un procedimiento desde dentro de una estructura de control. La sintaxis de ExitSub y ExitFunction es similar a ExitFor y ExitDo en la sección anterior "Estructura de control de salida". ExitSub puede aparecer en cualquier parte del cuerpo del subproceso, tantas veces como sea necesario.
ExitSub y ExitFunction son útiles cuando el procedimiento ha completado cada tarea y puede regresar directamente. Por ejemplo, si desea cambiar el ejemplo anterior para que solo se imprima la primera fuente encontrada para la impresora y la pantalla, puede usar ExitSub:
PrivadoSubForm_Click()
DimSFont,PFont
ForEachSFontInScreen.Fonts()
ForEachPFontInPrinter.Fonts()
SiSFont=PFontEntonces
Imprimir fuente
ExitSub 'Salir del proceso.
Fin si
SiguientePFont
SiguienteSFont
FinSub
->