VBA
Estructuras de control de flujo
Buscar..
Seleccione el caso
Select Case
puede usarse cuando son posibles muchas condiciones diferentes. Las condiciones se verifican de arriba a abajo y solo se ejecutará el primer caso que coincida.
Sub TestCase()
Dim MyVar As String
Select Case MyVar 'We Select the Variable MyVar to Work with
Case "Hello" 'Now we simply check the cases we want to check
MsgBox "This Case"
Case "World"
MsgBox "Important"
Case "How"
MsgBox "Stuff"
Case "Are"
MsgBox "I'm running out of ideas"
Case "You?", "Today" 'You can separate several conditions with a comma
MsgBox "Uuuhm..." 'if any is matched it will go into the case
Case Else 'If none of the other cases is hit
MsgBox "All of the other cases failed"
End Select
Dim i As Integer
Select Case i
Case Is > 2 '"Is" can be used instead of the variable in conditions.
MsgBox "i is greater than 2"
'Case 2 < Is '"Is" can only be used at the beginning of the condition.
'Case Else is optional
End Select
End Sub
La lógica del bloque Select Case
se puede invertir para admitir la prueba de diferentes variables, en este tipo de escenario también podemos usar operadores lógicos:
Dim x As Integer
Dim y As Integer
x = 2
y = 5
Select Case True
Case x > 3
MsgBox "x is greater than 3"
Case y < 2
MsgBox "y is less than 2"
Case x = 1
MsgBox "x is equal to 1"
Case x = 2 Xor y = 3
MsgBox "Go read about ""Xor"""
Case Not y = 5
MsgBox "y is not 5"
Case x = 3 Or x = 10
MsgBox "x = 3 or 10"
Case y < 10 And x < 10
MsgBox "x and y are less than 10"
Case Else
MsgBox "No match found"
End Select
Las declaraciones de casos también pueden usar operadores aritméticos. Cuando se usa un operador aritmético contra el valor de Select Case
, debe ir precedido por la palabra clave Is
:
Dim x As Integer
x = 5
Select Case x
Case 1
MsgBox "x equals 1"
Case 2, 3, 4
MsgBox "x is 2, 3 or 4"
Case 7 To 10
MsgBox "x is between 7 and 10 (inclusive)"
Case Is < 2
MsgBox "x is less than one"
Case Is >= 7
MsgBox "x is greater than or equal to 7"
Case Else
MsgBox "no match found"
End Select
Para cada bucle
La construcción de bucle For Each
es ideal para iterar todos los elementos de una colección.
Public Sub IterateCollection(ByVal items As Collection)
'For Each iterator must always be variant
Dim element As Variant
For Each element In items
'assumes element can be converted to a string
Debug.Print element
Next
End Sub
Utilice For Each
para iterar colecciones de objetos:
Dim sheet As Worksheet
For Each sheet In ActiveWorkbook.Worksheets
Debug.Print sheet.Name
Next
Evitar For Each
al iterar matrices; un bucle For
ofrecerá un rendimiento significativamente mejor con las matrices. Por el contrario, un bucle For Each
ofrecerá un mejor rendimiento al iterar una Collection
.
Sintaxis
For Each [item] In [collection]
[statements]
Next [item]
La palabra clave Next
puede ser seguida opcionalmente por la variable iterador; Esto puede ayudar a aclarar los bucles anidados, aunque hay mejores formas de aclarar el código anidado, como extraer el bucle interno en su propio procedimiento.
Dim book As Workbook
For Each book In Application.Workbooks
Debug.Print book.FullName
Dim sheet As Worksheet
For Each sheet In ActiveWorkbook.Worksheets
Debug.Print sheet.Name
Next sheet
Next book
Hacer bucle
Public Sub DoLoop()
Dim entry As String
entry = ""
'Equivalent to a While loop will ask for strings until "Stop" in given
'Prefer using a While loop instead of this form of Do loop
Do While entry <> "Stop"
entry = InputBox("Enter a string, Stop to end")
Debug.Print entry
Loop
'Equivalent to the above loop, but the condition is only checked AFTER the
'first iteration of the loop, so it will execute even at least once even
'if entry is equal to "Stop" before entering the loop (like in this case)
Do
entry = InputBox("Enter a string, Stop to end")
Debug.Print entry
Loop While entry <> "Stop"
'Equivalent to writing Do While Not entry="Stop"
'
'Because the Until is at the top of the loop, it will
'not execute because entry is still equal to "Stop"
'when evaluating the condition
Do Until entry = "Stop"
entry = InputBox("Enter a string, Stop to end")
Debug.Print entry
Loop
'Equivalent to writing Do ... Loop While Not i >= 100
Do
entry = InputBox("Enter a string, Stop to end")
Debug.Print entry
Loop Until entry = "Stop"
End Sub
Mientras bucle
'Will return whether an element is present in the array
Public Function IsInArray(values() As String, ByVal whatToFind As String) As Boolean
Dim i As Integer
i = 0
While i < UBound(values) And values(i) <> whatToFind
i = i + 1
Wend
IsInArray = values(i) = whatToFind
End Function
En bucle
El bucle For
se usa para repetir la sección adjunta del código un número determinado de veces. El siguiente ejemplo simple ilustra la sintaxis básica:
Dim i as Integer 'Declaration of i
For i = 1 to 10 'Declare how many times the loop shall be executed
Debug.Print i 'The piece of code which is repeated
Next i 'The end of the loop
El código anterior declara un entero i
. El bucle For
asigna cada valor entre 1 y 10 a i
y luego ejecuta Debug.Print i
, es decir, el código imprime los números del 1 al 10 en la ventana inmediata. Tenga en cuenta que la variable de bucle se incrementa con la Next
instrucción, es decir, después de que se ejecuta el código adjunto y no antes de que se ejecute.
De forma predeterminada, el contador se incrementará en 1 cada vez que se ejecute el bucle. Sin embargo, se puede especificar un Step
para cambiar la cantidad del incremento como un valor literal o de retorno de una función. Si el valor inicial, el valor final o el valor de Step
es un número de punto flotante, se redondeará al valor entero más cercano. Step
puede ser un valor positivo o negativo.
Dim i As Integer
For i = 1 To 10 Step 2
Debug.Print i 'Prints 1, 3, 5, 7, and 9
Next
En general, un bucle For
se usaría en situaciones en las que se sabe antes de que el bucle comience cuántas veces se ejecuta el código adjunto (de lo contrario, un bucle Do
o While
puede ser más apropiado). Esto se debe a que la condición de salida se corrige después de la primera entrada en el bucle, ya que este código demuestra:
Private Iterations As Long 'Module scope
Public Sub Example()
Dim i As Long
Iterations = 10
For i = 1 To Iterations
Debug.Print Iterations 'Prints 10 through 1, descending.
Iterations = Iterations - 1
Next
End Sub
Un bucle For
se puede salir antes con la instrucción Exit For
:
Dim i As Integer
For i = 1 To 10
If i > 5 Then
Exit For
End If
Debug.Print i 'Prints 1, 2, 3, 4, 5 before loop exits early.
Next