VBA
Flödeskontrollstrukturer
Sök…
Välj ärende
Select Case
kan användas när många olika förhållanden är möjliga. Villkoren kontrolleras från topp till botten och endast det första fallet som matchar kommer att genomföras.
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
Logiken för Select Case
blocket kan inverteras för att stödja testning av olika variabler också, i det här scenariot kan vi också använda logiska operatörer:
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
Ärenden kan också använda aritmetiska operatörer. När en aritmetisk operatör används mot Select Case
värdet bör det föregås med sökordet 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
För varje slinga
For Each
slingkonstruktion är idealisk för att upprepa alla element i en samling.
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
Använd For Each
vid iterering av objektsamlingar:
Dim sheet As Worksheet
For Each sheet In ActiveWorkbook.Worksheets
Debug.Print sheet.Name
Next
Undvik For Each
när iterating arrays; a For
loop kommer att erbjuda betydligt bättre prestanda med matriser. Omvänt kommer en For Each
slinga att erbjuda bättre prestanda när man upprepar en Collection
.
Syntax
For Each [item] In [collection]
[statements]
Next [item]
Next
nyckelord kan eventuellt följas av iteratorvariabeln; detta kan hjälpa till att förtydliga kapslade slingor, även om det finns bättre sätt att förtydliga kapslade koder, till exempel att extrahera den inre slingan till sin egen procedur.
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
Gör slingan
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
Medan slinga
'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
För slinga
For
slingan används för att upprepa den bifogade delen av koden ett visst antal gånger. Följande enkla exempel illustrerar grundsyntaxen:
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
Koden ovan deklarerar ett heltal i
. For
slingan tilldelar varje värde mellan 1 och 10 till i
och kör sedan Debug.Print i
- dvs koden skriver ut siffrorna 1 till 10 till det omedelbara fönstret. Observera att slingvariabeln ökas av Next
påstående, det vill säga efter att den bifogade koden körs i motsats till innan den körs.
Som standard kommer räknaren att ökas med 1 varje gång slingan körs. Ett Step
kan emellertid anges för att ändra mängden på inkrementet som antingen en bokstavlig eller som en återgångsvärde för en funktion. Om startvärdet, slutvärdet eller Step
är ett flytande punktnummer, kommer det att avrundas till närmaste heltal. Step
kan vara antingen ett positivt eller negativt värde.
Dim i As Integer
For i = 1 To 10 Step 2
Debug.Print i 'Prints 1, 3, 5, 7, and 9
Next
I allmänhet skulle en For
loop användas i situationer där det är känt innan loopen startar hur många gånger för att köra den bifogade koden (annars kan en Do
eller While
slinga vara mer lämplig). Detta beror på att utgångsvillkoret är fixerat efter den första inmatningen i slingan, eftersom denna kod visar:
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
En For
loop kan avslutas tidigt med Exit For
uttalande:
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