VBA
Struktury kontroli przepływu
Szukaj…
Wybierz Case
Select Case
można zastosować, gdy możliwych jest wiele różnych warunków. Warunki są sprawdzane od góry do dołu i zostanie wykonany tylko pierwszy przypadek pasujący.
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
Logikę bloku Select Case
można odwrócić, aby obsługiwać testowanie różnych zmiennych, w tym scenariuszu możemy również użyć operatorów logicznych:
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
Instrukcje przypadków mogą również korzystać z operatorów arytmetycznych. W przypadku użycia operatora arytmetycznego względem wartości Select Case
należy go poprzedzić słowem kluczowym 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
Dla każdej pętli
Konstrukcja pętli For Each
jest idealna do iteracji wszystkich elementów kolekcji.
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
Użyj opcji For Each
podczas iteracji kolekcji obiektów:
Dim sheet As Worksheet
For Each sheet In ActiveWorkbook.Worksheets
Debug.Print sheet.Name
Next
Unikaj For Each
podczas iteracji tablic; Pętla For
zapewni znacznie lepszą wydajność w przypadku tablic. I odwrotnie, pętla For Each
zapewni lepszą wydajność podczas iteracji Collection
.
Składnia
For Each [item] In [collection]
[statements]
Next [item]
Opcjonalnie po słowie kluczowym Next
może następować zmienna iteratora; może to pomóc w wyjaśnieniu zagnieżdżonych pętli, chociaż istnieją lepsze sposoby wyjaśnienia zagnieżdżonego kodu, takie jak wyodrębnienie wewnętrznej pętli do własnej procedury.
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
Zrób pętlę
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
Podczas pętli
'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
Dla pętli
Pętla For
służy do powtarzania zamkniętej sekcji kodu określoną liczbę razy. Poniższy prosty przykład ilustruje podstawową składnię:
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
Powyższy kod deklaruje liczbę całkowitą i
. Pętla For
przypisuje każdą wartość od 1 do 10 do i
a następnie wykonuje Debug.Print i
- tj. Kod drukuje liczby od 1 do 10 do bezpośredniego okna. Zauważ, że zmienna pętli jest zwiększana przez instrukcję Next
, czyli po wykonaniu załączonego kodu, a nie przed wykonaniem.
Domyślnie licznik będzie zwiększany o 1 przy każdym uruchomieniu pętli. Można jednak określić Step
aby zmienić wielkość przyrostu jako literał lub wartość zwracaną funkcji. Jeśli wartość początkowa, końcowa lub wartość Step
jest liczbą zmiennoprzecinkową, zostanie ona zaokrąglona do najbliższej liczby całkowitej. Step
może być wartością dodatnią lub ujemną.
Dim i As Integer
For i = 1 To 10 Step 2
Debug.Print i 'Prints 1, 3, 5, 7, and 9
Next
Zasadniczo pętla For
byłaby używana w sytuacjach, w których przed uruchomieniem pętli wiadomo, ile razy wykonać załączony kod (w przeciwnym razie bardziej odpowiednia byłaby pętla Do
lub While
). Wynika to z faktu, że warunek wyjścia jest ustalany po pierwszym wejściu do pętli, ponieważ kod ten pokazuje:
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
Pętlę For
można Exit For
wcześniej z instrukcją 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