Excel VBA-silmukat-jokaiselle, seuraavaksi, Do While, Sissed & More

toimiaksesi tehokkaasti VBA: ssa, sinun täytyy ymmärtää silmukoita.

silmukoilla voi toistaa joukon koodilohkoa useita kertoja tai toistaa koodilohkon jokaiselle objektille objektijoukossa.

ensin näytämme muutaman esimerkin, jotka näyttävät, mihin silmukat pystyvät. Sitten opetamme sinulle kaiken silmukoista.

VBA Loop Quick Examples

jokaiselle silmukalle

jokaiselle silmukalle silmukan läpi jokaisen kokoelman objektin, kuten jokaisen työkirjan laskentataulukon tai jokaisen alueen solun.

kierrä kaikki työkirjan työarkit

tämä koodi kiertää kaikki työkirjan työarkit ja poistaa jokaisen levyn:

1
2
3
4
5
6
8
sub looptroughsheets ()
dim ws laskentataulukkona

kunkin työarkissa olevan ws
ws.Visible = true
Next
End Sub

Silmukka kaikkien alueella olevien solujen läpi

tämä koodi silmukoi solualueen läpi testaten, onko solun arvo negatiivinen, positiivinen vai nolla:

seuraaville silmukoille

toinen ”for” – silmukka on seuraava silmukka. For Next Loop voit silmukka läpi kokonaislukuja.

tämä koodi silmukoi kokonaislukujen 1-10 läpi näyttäen jokaisen viestikentällä:

1
2
3
4
5
6
sub forloop ()
Dim I kokonaislukuna
for I = 1-10
MsgBox I
next I
End Sub

do while loops will loop while the condition is met. Tämä koodi myös silmukka läpi kokonaislukuja 1-10, näytetään jokainen viestikenttään.

sub dowhileloop ()
DIM n kokonaislukuna
n = 1
do while n < 11
MsgBox n
N = N + 1
loop
End Sub

1
2
3
4
5
6
7
8

tee kunnes silmukat

käänteisesti, Tee kunnes silmukoita silmukka kunnes ehto täyttyy. Tämä koodi tekee saman kuin kaksi edellistä esimerkkiä.

sub dountilloop ()
DIM n kokonaislukuna
n = 1
back until n > 10
MsgBox n
N= N + 1
loop
End Sub

1
2
3
4
5
6
7
8

tästä keskustellaan alla, mutta sinä täytyy olla erittäin varovainen luodessaan tehdä vaikka tai tehdä kunnes silmukoita niin, että et luo loputon silmukka.

VBA Loop Builder

Tämä on kuvakaappaus ”Loop Builder” Premium VBA-Lisäosastolta: AutoMacro. Loop Builder voit nopeasti ja helposti rakentaa silmukoita silmukan läpi eri esineitä tai numeroita. Voit suorittaa toimintoja jokaiselle objektille ja / tai valita vain tiettyjä kriteerejä täyttäviä objekteja.

lisäosa sisältää myös monia muita koodinrakentajia, laajan VBA-koodikirjaston sekä valikoiman koodaustyökaluja. Se on oltava tahansa VBA Kehittäjä.

nyt käydään läpi eri silmukkatyypit perusteellisesti.

VBA seuraavalle silmukalle

silmukan syntaksille

seuraavan silmukan avulla voit toistaa koodilohkon tietyn määrän kertoja. Syntaksi on:

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 – kokonaislukumuuttuja, jolla lasketaan
  • alku – alkuarvo (ENT. 1)
  • loppu – loppuarvo (ENT. 10)
  • – voit laskea jokaisen n kokonaisluvun sijaan jokaisen 1 kokonaisluvun. Voit myös mennä Käänteinen negatiivinen arvo (ENT. Vaihe -1)
  • – koodi, joka toistaa
  • seuraavan Loppulauseen For Next Loopille. Voit sisällyttää laskurin tai ei. Suosittelen kuitenkin laskuria, koska se helpottaa koodin lukemista.

Jos se hämmentää, ei hätää. Käymme läpi joitakin esimerkkejä:

lasketaan arvoon 10

tämä koodi lasketaan arvoon 10 käyttäen seuraavaa silmukkaa:

sub foreach_counto10 ()
DIM n kokonaislukuna
for N = 1-10
MsgBox n
seuraava n

loppu sub
1
2
3
4
5
6
7
8

silmukkavaiheessa

lasketaan 10: een – vain parilliset luvut

tämä koodi lasketaan 10 vain laskemalla parilliset numerot:

sub foreach_counto10_even ()
DIM n kokonaislukuna
for N = 2-10 Step 2
MsgBox n
seuraava n

End Sub
1
2
3
4
5
6
7
8

notice we added the ”step 2”. Tämä kertoo For Loopin ”astuvan” laskurin läpi 2: lla. Voimme myös käyttää negatiivista askelarvoa astuaksemme taaksepäin:

Silmukkaaskel-käänteiselle

lähtölaskenta 10: stä

tämä koodi tulee lähtölaskenta 10: stä:

1
2
3
4
5
6
7
8
sub foreach_countdown_inverse ()
DIM n kokonaislukuna
for N = 10 to 1 step -1
MsgBox n
seuraava n
MsgBox ”lift off”
End Sub

poista Rivit jos solu on tyhjä

olen useimmiten käyttänyt negatiivista vaihetta silmukkaan silmukoidakseni solujen alueiden läpi, poistaen rivejä, jotka täyttävät tietyt kriteerit. Jos kierrät ylimmiltä riveiltä alimmille riveille, kun poistat rivejä, sotket laskurisi.

tässä esimerkissä poistetaan rivit, joissa on tyhjiä soluja (alariviltä alkaen):

sisäkkäisiä silmukalle

voit ”pesiä” yhden silmukalle toisen silmukan sisään. Käytämme sisäkkäisiä silmukoita luoda kertotaulu:

sub nested_foreach_multiplicationtable ()
Dim rivinä kokonaislukuna, Col kokonaislukuna

riveillä = 1-9
soluissa(rivi + 1, Col + 1).Arvo = rivi * col
Seuraava Col
seuraava rivi
loppu Sub
1
2
3
4
5
6
7
8
9
10
11

exit for

exit for statement voit poistua A: sta seuraavan silmukan osalta välittömästi.

käytät yleensä Exitiä If-lausekkeen kanssa poistuen seuraavasta silmukasta, jos tietty ehto täyttyy.

esimerkiksi voit käyttää For-silmukkaa solun löytämiseksi. Kun solu löytyy, voit poistua silmukasta nopeuttaaksesi koodiasi.

tämä koodi silmukoi rivien 1-1000 läpi ja etsii ”virhettä” sarakkeesta A. Jos se löytyy, koodi valitsee solun, ilmoittaa löydetystä virheestä ja poistuu silmukasta:

tärkeää: jos kyseessä on sisäkkäinen Silmukka, vain poistuu nykyinen silmukka, ei kaikki aktiiviset silmukat.

Jatka

VBA: lla ei ole Visual Basicistä löytyvää ”Jatka” – komentoa. Sen sijaan, sinun täytyy käyttää ”Exit”.

VBA jokaiselle silmukalle

jokaisen silmukan VBA kiertää kaikki kokoelman objektit:

  • kaikki alueen solut
  • kaikki työkirjan työkirjat
  • kaikki avoimet työkirjat

Voit myös käyttää sisäkkäisiä jokaiselle lenkille:

  • kaikki alueen solut kaikissa työkirjoissa
  • kaikki muodot kaikissa työkirjoissa
  • kaikki arkit kaikissa avoimissa työkirjoissa
  • li>ja niin edelleen…

syntaksi on:

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.Poista ”salasana”
Next ws

End Sub

jokaisen avoimen työkirjan osalta

tämä koodi tallentaa ja sulkee kaikki avoimet työkirjat:

1
2
3
4
5
6
7
8
sub foreachwb_inworkbooks ()
Dim WB työkirjana
kunkin WB työkirjoissa
WB.Sulje SaveChanges:=True
Next wb
End Sub

kunkin muodon osalta työarkissa

tämä koodi poistaa kaikki muodot aktiivisesta arkista.

sub foreachshape ()
Dim SHP muodossa

kunkin shp in activesheet.Shapes
shp.Delete
Next shp

End Sub
1
2
3
4
5
6
8
9

jokaiselle muodosta jokaisessa työkirjassa

voit myös pesiä jokaiselle silmukalle. Täällä me silmukoimme kaikki muodot kaikissa työarkeissa aktiivisessa työkirjassa:

sub foreachshape_inallworksheets ()
Dim SHP muotona, ws laskentataulukkona

kunkin työarkissa olevan WS: n osalta
kunkin WS: n osalta ws: ssä.Shapes
shp.Delete
Next shp
End Sub
1
2
3
4
5
6
7
8
9
10
11

jokaiselle – IF-silmukalle

kuten olemme aiemmin maininneet, voit käyttää If-lausetta silmukka, joka suorittaa toimia vain, jos tietyt kriteerit täyttyvät.

tämä koodi piilottaa kaikki tyhjät rivit alueella:

VBA Do kun taas silmukka

VBA Do While ja Do Until (katso seuraava kohta) ovat hyvin samanlaisia. Ne toistavat silmukan, kun (tai kunnes) ehto täyttyy.

Do While Loop toistaa silmukan, kun ehto täyttyy.

tässä on Do While Syntax:

1
2
3
Do kun taas kunto

silmukka

where:

  • condition – the condition to test
  • – the code block to repeat

voit myös asettaa do while Loopin, jossa on silmukan lopussa oleva ehto:

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:

sub dowhileloop ()
DIM n kokonaislukuna
n = 1
do while n < 11
MsgBox n
N = N + 1
loop
End Sub

1
2
3
4
5
6
7
8

Silmukka kun taas

nyt ajetaan sama menettely, paitsi siirrämme ehdon silmukan loppuun:

sub doloopwhile ()
DIM n kokonaislukuna
n = 1
Back
MsgBox n
N = N + 1
loop kun taas n < 11
End Sub

1
2
3
4
5
6
7
8

VBA do until loop

back until Silmukat toistavat silmukan, kunnes tietty ehto täyttyy. Syntaksi on periaatteessa sama kuin do-luupissa:

1
2
3
do until Condition

loop

ja vastaavasti kunto voi mennä lenkin alussa tai lopussa:

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 kokonaislukuna
n = 1
back until n >10
MsgBox n

+ 1

loop
End Sub

silmukka, kunnes

tämä silmukka, kunnes silmukka laskee arvoon 10:

sub doloopuntil ()
DIM n kokonaislukuna
n = 1
back
MsgBox n
N = N + 1
loop until n > 10
End Sub

1
2
3
4
5
6
7
8

Exit Do Loop

samalla tavalla kuin käytetään Exit for exit A For Loop, käytetään Exit Do-komentoa do Loopista poistumiseen välittömästi

exit do
1

tässä on esimerkki exit do: sta:

loppu-tai taukosilmukka

kuten edellä mainittiin, voit käyttää exit for or exit do: ta exit loopiin:

1
Exit For
1
Exit Do

However, these commands must be added to your code before you run sinun silmukkasi.

Jos yrität ”katkaista” käynnissä olevan silmukan, voit kokeilla näppäimistöllä Esc-tai CTRL + Pause Break-näppäintä. Tämä ei kuitenkaan välttämättä toimi. Jos se ei toimi, sinun täytyy odottaa silmukan loppua tai, jos kyseessä on loputon silmukka, käytä CTRL + ALT + Delete pakottaa sulje Excel.

tämän takia yritän välttää Do loopeja, on helpompaa vahingossa luoda loputon silmukka, joka pakottaa sinut käynnistämään Excelin uudelleen, mahdollisesti menettäen työsi.

lisää Silmukkaesimerkkejä

Silmukka rivien läpi

tämä silmukoi kaikkien sarakkeen rivien läpi:

Silmukka sarakkeiden läpi

tämä silmukka kiertää kaikkien sarakkeiden läpi rivissä:

Silmukka kansion tiedostojen läpi

tämä koodi kiertää kansion kaikkien tiedostojen läpi, luoden luettelon:

silmukka rivin läpi

tämä koodi silmukka läpi array ’arrlist’:

1
2
3
for I = lbound(arrlist) to ubound(arrlist)
MsgBox arrlist(i)
next I

lbound-funktio saa joukon ”alarajan” ja ubound ”ylärajan”.

luupit Access VBA: ssa

useimmat yllä olevista esimerkeistä toimivat myös Access VBA: ssa. Kuitenkin, Access, me silmukka kautta Recordset objekti sijaan Range objekti.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

8

sub looptroughrecords ()
on Error Resume Next
Dim DBS tietokantana
Dim rst tietueina
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



Vastaa

Sähköpostiosoitettasi ei julkaista.