For hver, for næste, gør mens, indlejret & mere
for at arbejde effektivt i VBA, skal du forstå sløjfer.
sløjfer giver dig mulighed for at gentage en kodeblok et bestemt antal gange eller gentage en kodeblok på et hvert objekt i et sæt objekter.
først vil vi vise dig et par eksempler for at vise dig, hvilke sløjfer der er i stand til. Så lærer vi dig alt om sløjfer.
VBA Loop hurtige eksempler
for hver Loops
for hver Loops loop gennem hvert objekt i en samling, såsom hvert regneark i projektmappe eller hver celle i et område.
Loop gennem alle regneark i projektmappe
denne kode løber gennem alle regneark i projektmappen og fjerner hvert ark:
1
2
3
4
5
7
8
|
sub loopthroughsheets ()
dim vs som regneark
for hver VS i regneark
vs.
næste
End Sub
|
Loop gennem alle celler i området
denne kode vil løbe gennem en række celler, teste om celleværdien er negativ, positiv eller nul:
for næste sløjfer
en anden type “For” Loop er for næste loop. For næste Loop giver dig mulighed for at løbe gennem heltal.
denne kode løber gennem heltal 1 til 10 og viser hver med en meddelelsesboks:
1
2
3
4
5
6
|
sub forloop()
Dim i som heltal
for i = 1 til 10
msgboks i
næste i
End Sub
|
gør mens sløjfer
gør mens sløjfer løber, mens betingelsen er opfyldt. Denne kode løber også gennem heltal 1 til 10 og viser hver med en meddelelsesboks.
1
2
3
4
5
6
8
|
sub diveloop ()
dim n som heltal
n = 1
gør mens n <11
n = n + 1
loop
end sub
|
gør indtil sløjfer
omvendt, Gør indtil sløjfer løber, indtil en betingelse er opfyldt. Denne kode gør det samme som de to foregående eksempler.
1
2
3
4
5
6
8
|
sub dountilloop ()
dim n som heltal
n = 1
tilbage indtil n >= 10
n = n + 1
loop
End Sub
|
vi vil diskutere dette nedenfor, men du skal være yderst forsigtig, når du opretter gør mens eller gør indtil sløjfer, så du ikke opretter en uendelig løkke.
VBA Loop Builder
Dette er et skærmbillede af “Loop Builder” fra vores Premium VBA-tilføjelse: AutoMacro. Loop Builder giver dig mulighed for hurtigt og nemt at bygge sløjfer til at løbe gennem forskellige objekter eller tal. Du kan udføre handlinger på hvert objekt og / eller kun vælge objekter, der opfylder bestemte kriterier.tilføjelsesprogrammet indeholder også mange andre kodebyggere, et omfattende VBA-kodebibliotek og et udvalg af kodningsværktøjer. Det er et must have for enhver VBA Udvikler.
nu dækker vi de forskellige typer løkker i dybden.
VBA til næste Loop
til Loop syntaks
For næste Loop giver dig mulighed for at gentage en blok kode et bestemt antal gange. Syntaksen er:
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.
- tæller-en heltalsvariabel, der bruges til at tælle
- Start – startværdien (f.eks. 1)
- End – slutværdien (eks. 10)
- – giver dig mulighed for at tælle hver n heltal i stedet for hver 1 heltal. Du kan også gå omvendt med en negativ værdi (f.eks. Trin -1)
- – koden, der gentager
- næste afsluttende sætning til For næste sløjfe. Du kan medtage tælleren eller ej. Jeg anbefaler dog stærkt at inkludere tælleren, da det gør din kode lettere at læse.
Hvis det er forvirrende, skal du ikke bekymre dig. Vi vil gennemgå nogle eksempler:
Tæl til 10
denne kode tæller til 10 ved hjælp af en for-næste sløjfe:
1
2
3
4
5
6
8
|
sub foreach_countto10 ()
dim n som heltal
for n = 1 til 10
næste n
End Sub
|
for loop step
tæl til 10 – kun lige tal
dette kode vil tælle til 10 kun tælle lige tal:
1
2
3
4
5
6
8
|
sub foreach_countto10_even ()
dim n som heltal
for n = 2 til 10 trin 2
næste n
end sub
|
Bemærk vi tilføjede “trin 2″. Dette fortæller For Loop at” træde ” gennem tælleren med 2. Vi kan også bruge en negativ trinværdi til at træde i omvendt:
For Loop Step – invers
nedtælling fra 10
denne kode nedtælles fra 10:
1
2
3
4
5
6
8
|
sub foreach_count_inverse ()
dim n som heltal
for N = 10 til 1 trin -1
næste n
msgboks “lift off”
End Sub
|
slet Rækker, hvis cellen er tom
Jeg har oftest brugt et negativt trin for-Loop til at løbe gennem celleområder og slette rækker, der opfylder visse kriterier. Hvis du løber fra de øverste rækker til de nederste rækker, når du sletter rækker, vil du ødelægge din tæller.
dette eksempel sletter rækker med tomme celler (startende fra den nederste række):
indlejret til Loop
Du kan “rede” en til Loop inde i en anden til Loop. Vi bruger indlejret til sløjfer til at oprette en multiplikationstabel:
1
2
3
4
5
6
8
9
10
|
sub nested_foreach_multiplicationtable ()
dim række som heltal, Col som heltal
for række = 1 til 9
celler(række + 1, Col + 1).Værdi = række * col
næste col
næste række
End Sub
|
Afslut for
udgangen til sætning giver dig mulighed for at afslutte en til næste sløjfe med det samme.
Du vil normalt bruge Afslut til sammen med en if-sætning, forlader For næste Loop, hvis en bestemt betingelse er opfyldt.
Du kan f.eks. bruge en for-sløjfe til at finde en celle. Når cellen er fundet, kan du afslutte sløjfen for at fremskynde din kode.
denne kode løber gennem rækker 1 til 1000 og leder efter “fejl” i kolonne A. Hvis den findes, vælger koden cellen, advarer dig om den fundne fejl og afslutter sløjfen:
vigtigt: i tilfælde af indlejret for sløjfer, Afslut for kun afslutter strømmen for Loop, ikke alle aktive sløjfer.
Fortsæt for
VBA har ikke kommandoen “Fortsæt”, der findes i Visual Basic. I stedet skal du bruge “Afslut”.
VBA for hver sløjfe
VBA for hver sløjfe løber gennem alle objekter i en samling:
- alle celler i et område
- alle regneark i en projektmappe
- Alle figurer i et regneark
- alle åbne projektmapper
Du kan også bruge indlejrede for hver sløjfer til:
- alle celler i et område på alle regneark
- Alle figurer på alle regneark
- Alle ark i alle åbne projektmapper
- og så videre…
syntaksen er:
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.Fjern ” adgangskode “
næste vs
End Sub
|
for hver åben projektmappe
denne kode gemmer og lukker alle åbne projektmapper:
1
2
3
4
5
6
8
9
|
subforeachb_inarbejdsbøger ()
dim som projektmappe
for hvert arbejdsprogram i projektmapper
vb.Luk SaveChanges:=True
End Sub
|
for hver figur i regneark
denne kode sletter alle figurer i det aktive ark.
1
2
3
4
5
6
8
|
sub foreachshape ()
dim SHP som form
for hver SHP i ActiveSheet.Former
shp.Slet
næste shp
|
For hver figur i hvert regneark i projektmappen
Du kan også rede for hver løkke. Her løber vi gennem alle figurer i alle regneark i den aktive projektmappe:
1
2
3
4
5
6
8
9
10
|
sub foreachshape_inallarbejdsark ()
dim SHP som form, vs som regneark
for hver vs i regneark
for hver vs.Former
shp.Slet
næste shp
næste vs
|
for hver – if Loop
som vi har nævnt før, kan du bruge en if-sætning inden for en løkke, udfører handlinger kun, hvis visse kriterier er opfyldt.
denne kode skjuler alle tomme rækker i et område:
VBA gør Mens Loop
VBA gør mens og gør indtil (se næste afsnit) er meget ens. De gentager en løkke, mens (eller indtil) en betingelse er opfyldt.
Do Mens Loop gentager en loop, mens en betingelse er opfyldt.
Her er gør mens syntaks:
1
2
3
|
gør mens tilstand
loop
|
hvor:
- betingelse – betingelsen for at teste
- – kodeblokken for at gentage
Du kan også oprette en do mens loop med tilstanden i slutningen af sløjfen:
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
8
|
sub diveloop ()
dim n som heltal
n = 1
gør mens n <11
n = n + 1
loop
end sub
|
Loop Mens
lad os nu køre den samme procedure, undtagen vi vil flytte tilstanden til slutningen af sløjfen:
1
2
3
4
5
6
8
|
sub doloopmens ()
dim n som heltal
n = 1
tilbage
msgboks n
n = n + 1
Loop Mens n <11
end sub
|
VBA gør indtil loop
tilbage indtil Loops gentager en løkke, indtil en bestemt betingelse er opfyldt. Syntaksen er i det væsentlige den samme som do mens loops:
1
2
3
|
loop
|
og på samme måde kan tilstanden gå i starten eller slutningen af sløjfen:
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
8
|
Sub DoUntilLoop ()
Dim n som heltal
n = 1
tilbage til N >10
n = n + 1
loop
end sub
|
loop indtil
denne loop indtil loop tæller til 10:
1
2
3
4
5
6
8
|
sub doloopuntil ()
dim n som heltal
n = 1
tilbage
msgboks n
n = n + 1
loop indtil n >10
End Sub
|
Afslut Do Loop
svarende til at bruge Afslut til for at afslutte en For Loop bruger du kommandoen Afslut Do til at afslutte en Do Loop med det samme
1
|
Afslut do
|
Her er et eksempel på Afslut do:
end or break Loop
som vi nævnte ovenfor, kan du bruge udgangen til eller afslutte do for at afslutte loops:
1
|
Exit For
|
1
|
Exit Do
|
However, these commands must be added to your code before you run din løkke.
Hvis du prøver at “bryde” en løkke, der kører i øjeblikket, kan du prøve at trykke på ESC eller CTRL + Pause Pause på tastaturet. Dette fungerer muligvis ikke. Hvis det ikke virker, skal du vente på, at din løkke slutter, eller i tilfælde af en endeløs løkke skal du bruge CTRL + Alt + Delete for at tvinge luk.det er lettere at ved et uheld oprette en endeløs løkke, der tvinger dig til at genstarte, hvilket potentielt mister dit arbejde.
flere Loopeksempler
Loop gennem rækker
dette løber gennem alle rækkerne i en kolonne:
Loop gennem kolonner
dette løber gennem alle kolonner i en række:
Loop gennem filer i en mappe
denne kode løber gennem alle filer i en mappe og opretter en liste:
Loop gennem Array
denne kode løber gennem array ‘arrlist’:
1
2
3
|
for i = lbound(arrlist) til ubound(arrlist)
msgboks arrlist(i)
næste i
|
lbound-funktionen får “nedre grænse” af arrayet, og ubound får “øvre grænse”.
sløjfer i Access VBA
de fleste af eksemplerne ovenfor fungerer også i Access VBA. I Access løber vi imidlertid gennem Recordset-objektet snarere end Områdeobjektet.
1
2
3
4
5
6
8
9
10
11
12
13
14
15
16
17
|
sub loopthroughrecords ()
on error genoptag næste
dim DBS som database
dim rst som Recordset
set 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
|