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



Lämna ett svar

Din e-postadress kommer inte publiceras.