Excel VBA Loops-för varje, för nästa, gör medan, kapslade & mer
för att fungera effektivt i VBA måste du förstå loopar.
loopar låter dig upprepa ett kodblock ett visst antal gånger eller upprepa ett kodblock på varje objekt i en uppsättning objekt.
först visar vi dig några exempel för att visa vilka slingor som kan. Då lär vi dig allt om loopar.
VBA Loop snabb exempel
för varje loopar
för varje loopar slinga genom varje objekt i en samling, till exempel varje kalkylblad i arbetsboken eller varje cell i ett intervall.
Loop genom alla kalkylblad i arbetsboken
denna kod kommer att loop genom alla kalkylblad i arbetsboken, unhiding varje ark:
1
2
3
4
5
6
7
8
|
sub loopthroughsheets()
dim ws som kalkylblad
för varje ws i kalkylblad
ws.Visible = True
nästa
End Sub
|
Loop genom alla celler i intervallet
denna kod kommer att slinga genom ett cellområde, testa om cellvärdet är negativt, positivt eller noll:
för nästa slinga
en annan typ av ”för” – slinga är för nästa slinga. För nästa slinga låter dig slinga genom heltal.
den här koden går igenom heltal 1 till 10 och visar var och en med en meddelanderuta:
1
2
3
4
5
6
|
sub forloop()
dim I som heltal
för i = 1 till 10
MsgBox i
nästa i
End Sub
|
gör medan loopar
gör medan loopar kommer slinga medan villkoret är uppfyllt. Denna kod kommer också att slinga genom heltal 1 till 10 och visa var och en med en meddelanderuta.
1
2
3
4
5
6
7
8
|
sub dowhileloop()
dim n som heltal
n = 1
gör medan n < 11
MsgBox n
n = n + 1
loop
End Sub
|
gör tills slingor
omvänt, Gör tills slingorna slingrar tills ett villkor är uppfyllt. Denna kod gör samma sak som de två föregående exemplen.
1
2
3
4
5
6
7
8
|
sub dountilloop()
dim n som heltal
n = 1
tillbaka till n >= 10
MsgBox n
n = n + 1
loop
End Sub
|
vi kommer att diskutera detta nedan, men du måste vara extremt försiktig när du skapar gör medan eller gör tills slingor så att du inte skapar en oändlig slinga.
VBA Loop Builder
detta är en skärmdump av” Loop Builder ” från vårt Premium VBA-tillägg: AutoMacro. Med Loop Builder kan du snabbt och enkelt bygga slingor för att slinga genom olika objekt eller siffror. Du kan utföra åtgärder på varje objekt och / eller välja endast objekt som uppfyller vissa kriterier.
tillägget innehåller också många andra kodbyggare, ett omfattande VBA-kodbibliotek och ett sortiment av kodningsverktyg. Det är ett måste för alla VBA-Utvecklare.
nu kommer vi att täcka de olika typerna av slingor i djupet.
VBA för nästa slinga
för Loopsyntax
för nästa slinga låter dig upprepa ett kodblock ett visst antal gånger. Syntaxen är:
1
2
3
4
5
|
For Counter = Start to End
Next
|
Where the items in brackets are optional.
- – Declares the counter variable. Required if Option Explicit is declared at the top of your module.
- Counter – en heltalsvariabel som används för att räkna
- Start-startvärdet (Ex. 1)
- End-slutvärdet (Ex. 10)
- – låter dig räkna varje n heltal istället för varje 1 heltal. Du kan också gå bakåt med ett negativt värde (ex. Steg -1)
- – koden som kommer att upprepa
- nästa-avslutande uttalande till för nästa slinga. Du kan inkludera räknaren eller inte. Jag rekommenderar dock starkt att du inkluderar räknaren eftersom det gör din kod lättare att läsa.
om det är förvirrande, oroa dig inte. Vi kommer att granska några exempel:
räkna till 10
denna kod räknas till 10 med en for-Next Loop:
1
2
3
4
5
6
7
8
|
sub foreach_countto10()
dim n som heltal
för N = 1 till 10
MsgBox n
nästa n
slut sub
|
för Loop steg
räkna till 10 – endast jämna tal
detta koden räknas till 10 bara räknar jämna nummer:
1
2
3
4
5
6
7
8
|
sub foreach_countto10_even()
dim n som heltal
för N = 2 till 10 steg 2
MsgBox n
nästa n
slut sub
|
lägg märke till att vi lade till ”steg 2”. Detta berättar för slingan att ”steg” genom räknaren med 2. Vi kan också använda ett negativt stegvärde för att gå i omvänd:
för Loop steg-invers
nedräkning från 10
denna kod kommer nedräkning från 10:
1
2
3
4
5
6
7
8
9
|
sub foreach_countdown_inverse()
dim n som heltal
för N = 10 till 1 steg -1
MsgBox n
nästa n
MsgBox ”lyft av”
slut sub
|
radera Rader om cellen är tom
Jag har oftast använt ett negativt steg för-Loop för att slinga genom cellområden, radera rader som uppfyller vissa kriterier. Om du slingrar från de övre raderna till de nedre raderna, när du tar bort rader kommer du att förstöra din räknare.
detta exempel tar bort rader med tomma celler (från den nedre raden):
kapslad för Loop
Du kan ”bo” en för Loop inuti en annan för Loop. Vi kommer att använda kapslade för loopar för att skapa en multiplikationstabell:
1
2
3
4
5
6
7
8
9
10
11
|
sub nested_foreach_multiplicationtable()
dim rad som heltal, kol som heltal
för rad = 1 till 9
för kol = 1 till 9
celler(rad + 1, kol + 1).Värde = rad * kol
nästa kol
nästa rad
slut Sub
|
exit for
exit for-satsen låter dig avsluta A för nästa slinga omedelbart.
Du brukar använda Exit för tillsammans med ett If-uttalande, avsluta för nästa slinga om ett visst villkor är uppfyllt.
Du kan till exempel använda en for-slinga för att hitta en cell. När den cellen har hittats kan du avsluta slingan för att påskynda din kod.
den här koden går igenom raderna 1 till 1000 och letar efter ”fel” i kolumn A. Om den hittas kommer koden att välja cellen, varna dig för det hittade felet och avsluta slingan:
viktigt: i fallet med kapslade för slingor, avslutar Exit For only strömmen för slinga, inte alla aktiva slingor.
Fortsätt för
VBA har inte kommandot ”Fortsätt” som finns i Visual Basic. Istället måste du använda”Exit”.
VBA för varje slinga
VBA för varje slinga går igenom alla objekt i en samling:
- alla celler i ett intervall
- alla kalkylblad i en arbetsbok
- alla former i ett kalkylblad
- alla öppna arbetsböcker
Du kan också använda kapslade för varje slinga till:
- alla celler i ett intervall på alla kalkylblad
- alla former på alla kalkylblad
- alla ark i alla öppna arbetsböcker
- och så vidare…
syntaxen är:
1
2
3
|
For Each Object in Collection
Next
|
Where:
For Each Cell in Range
This code will loop through each cell in a range:
For Each Worksheet in Workbook
This code will loop through all worksheets in a workbook, unprotecting each sheet:
1
2
3
4
5
6
7
8
9
|
Sub ForEachSheet_inWorkbook()
Dim ws As Worksheet
For Each ws In Worksheets
ws.Avskydda” lösenord ”
nästa ws
avsluta Sub
|
för varje öppen arbetsbok
den här koden sparar och stänger alla öppna arbetsböcker:
1
2
3
4
5
6
7
8
9
|
sub foreachwb_inworkbooks()
dim WB som arbetsbok
för varje WB i arbetsböcker
WB.Stäng SaveChanges:= True
nästa wb
avsluta Sub
|
för varje form i kalkylbladet
den här koden tar bort alla former i det aktiva arket.
1
2
3
4
5
6
7
8
9
|
sub foreachshape()
dim shp som form
för varje shp i activesheet.Former
shp.Ta bort
nästa shp
slut Sub
|
för varje form i varje kalkylblad i arbetsbok
Du kan också bo för varje loop. Här går vi igenom alla former i alla kalkylblad i den aktiva arbetsboken:
1
2
3
4
5
6
7
8
9
10
11
|
sub foreachshape_inallworksheets()
dim shp som form, ws som kalkylblad
för varje ws i kalkylblad
för varje shp i ws.Former
shp.Ta bort
nästa shp
nästa ws
avsluta Sub
|
för varje – IF-slinga
som vi har nämnt tidigare kan du använda ett If-uttalande inom en slinga som endast utför åtgärder om vissa kriterier är uppfyllda.
den här koden döljer alla tomma rader i ett intervall:
VBA gör medan Loop
VBA gör medan Och Gör tills (se nästa avsnitt) är mycket lika. De kommer att upprepa en slinga medan (eller tills) ett villkor är uppfyllt.
Do While Loop kommer att upprepa en slinga medan ett villkor är uppfyllt.
Här är Do While Syntax:
1
2
3
|
gör medan villkor
loop
|
där:
- villkor – villkoret för att testa
- – kodblocket för att upprepa
Du kan också ställa in en do while-slinga med villkoret i slutet av slingan:
1
2
3
|
Do
Loop While Condition
|
We will demo each one and show how they differ:
Do While
Here is the Do While loop example we demonstrated previously:
1
2
3
4
5
6
7
8
|
sub dowhileloop()
dim n som heltal
n = 1
gör medan n < 11
MsgBox n
n = n + 1
loop
End Sub
|
Loop medan
låt oss nu köra samma procedur, förutom att vi flyttar villkoret till slutet av slingan:
1
2
3
4
5
6
7
8
|
sub doloopwhile()
dim n som heltal
n = 1
tillbaka
MsgBox n
n = n + 1
slinga medan n < 11
slut sub
|
VBA gör tills loop
tillbaka tills Slingor kommer att upprepa en slinga tills ett visst villkor är uppfyllt. Syntaxen är i huvudsak densamma som do While loops:
1
2
3
|
gör tills villkoret
loop
|
och på samma sätt kan villkoret gå i början eller slutet av slingan:
1
2
3
|
Do
Loop Until Condition
|
Do Until
This do Until loop will count to 10, like our previous examples
1
2
3
4
5
6
7
8
|
Sub DoUntilLoop()
Dim n som heltal
n = 1
tillbaka tills n > 10
MsgBox n
n = n + 1
loop
End Sub
|
slinga tills
denna slinga tills slinga räknas till 10:
1
2
3
4
5
6
7
8
|
sub doloopuntil()
dim n som heltal
n = 1
tillbaka
MsgBox n
n = n + 1
slinga tills n > 10
slut sub
|
Exit Do Loop
På samma sätt som att använda Exit For för att avsluta en For Loop använder du kommandot Exit Do för att avsluta en Do Loop omedelbart
1
|
avsluta göra
|
här är ett exempel på exit do:
end or break loop
som vi nämnde ovan kan du använda Exit For eller exit do för att avsluta loopar:
1
|
Exit For
|
1
|
Exit Do
|
However, these commands must be added to your code before you run din loop.
Om du försöker ”bryta” en slinga som för närvarande körs kan du försöka trycka på ESC eller CTRL + Pause Break på tangentbordet. Detta kanske dock inte fungerar. Om det inte fungerar måste du vänta på att din slinga slutar eller, om det är en oändlig slinga, använd CTRL + ALT + Delete för att tvinga stäng Excel.
det är därför jag försöker undvika att göra slingor, det är lättare att oavsiktligt skapa en oändlig slinga som tvingar dig att starta om Excel, vilket kan förlora ditt arbete.
fler Loop exempel
Loop genom rader
detta kommer att loop genom alla rader i en kolumn:
Loop genom kolumner
detta kommer att loop genom alla kolumner i rad:
Loop genom filer i en mapp
denna kod kommer att loop genom alla filer i en mapp, skapa en lista:
Loop genom Array
array ’arrlist’:
1
2
3
|
för i = lbound(arrlist) till ubound(arrlist)
MsgBox arrlist(i)
nästa i
|
lbound-funktionen får ”nedre gränsen” i matrisen och ubound får ”övre gränsen”.
loopar i Access VBA
de flesta av exemplen ovan fungerar också i Access VBA. I Access slingrar vi emellertid genom Postuppsättningsobjektet snarare än Områdesobjektet.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
sub loopthroughrecords()
vid fel återuppta nästa
dim DBS som databas
dim rst som postmängd
ställ in DBS = currentdb
Set rst = dbs.OpenRecordset(”tblClients”, dbOpenDynaset)
With rst
.MoveLast
.MoveFirst
Do Until .EOF = True
MsgBox (rst.Fields(”ClientName”))
.MoveNext
Loop
End With
rst.Close
Set rst = Nothing
Set dbs = Nothing
End Sub
|