Jotta voit työskennellä tehokkaasti VBA: ssa, sinun on ymmärrettävä silmukat.
Silmukoiden avulla voit toistaa koodilohkon tietyn määrän kertoja tai toistaa koodilohkon jokaisen objektin joukossa.
Ensin näytämme sinulle muutamia esimerkkejä, jotka osoittavat, mihin silmukat pystyvät. Sitten opetamme sinulle kaiken silmukoista.
VBA -silmukan pikaesimerkkejä
Jokaiselle silmukalle
Jokaiselle silmukalle kierretään kokoelman jokainen objekti, kuten työkirjan jokainen laskentataulukko tai alueen jokainen solu.
Käy läpi kaikki työkirjan laskentataulukot
Tämä koodi kiertää kaikki työkirjan laskentataulukot ja näyttää jokaisen taulukon:
12345678 | Osa LoopThroughSheets ()Dim ws laskentataulukkonaJokaiselle viikolle laskentataulukoissaws.Visible = TottaSeuraavaEnd Sub |
Kierrä kaikki alueen solut läpi
Tämä koodi kiertää solualueen läpi ja testaa, onko solun arvo negatiivinen, positiivinen vai nolla:
1234567891011121314 | Sub If_Loop ()Dim -solu alueenaJokaiselle alueen solulle ("A2: A6")Jos solun arvo> 0 SittenSolu.Siirto (0, 1) .Value = "Positiivinen"ElseIf Solun arvo <0 SittenSolu.Poikkeama (0, 1) .Value = "Negatiivinen"MuuCell.Offset (0, 1) .Value = "Nolla"Loppu JosSeuraava soluEnd Sub |
Seuraavia silmukoita varten
Toinen ”For” -silmukan tyyppi on For For Loop. For For Next Loop voit kiertää kokonaislukuja.
Tämä koodi kulkee kokonaislukujen 1-10 läpi ja näyttää jokaisessa viestikentän:
123456 | Sub ForLoop ()Dim i Kuten kokonaislukuI = 1-10MsgBox iSeuraavaksi minäEnd Sub |
Tee silmukoita
Tee samalla silmukat silmukoi, kun ehto täyttyy. Tämä koodi kiertää myös kokonaislukuja 1–10, näyttäen jokaisessa viestiruudun.
12345678 | Sub DoWhileLoop ()Dim n kokonaislukunan = 1Tee kun n <11MsgBox nn = n + 1SilmukkaEnd Sub |
Tee kunnes silmukat
Päinvastoin, tee kunnes silmukat silmukoi, kunnes ehto täyttyy. Tämä koodi toimii samalla tavalla kuin kaksi edellistä esimerkkiä.
12345678 | Sub DoUntilLoop ()Dim n kokonaislukunan = 1Tee kunnes n> = 10MsgBox nn = n + 1SilmukkaEnd Sub |
Keskustelemme tästä alla, mutta sinun on oltava äärimmäisen varovainen luodessasi Do While- tai Do Before -silmukoita, jotta et luo loputonta silmukkaa.
VBA -silmukanrakentaja
Tämä on kuvakaappaus “Loop Builderista” Premium VBA -laajennuksestamme: AutoMacro. Loop Builderin avulla voit nopeasti ja helposti rakentaa silmukoita eri objektien tai numeroiden läpi. Voit suorittaa toimintoja kullekin objektille ja/tai valita vain objektit, jotka täyttävät tietyt ehdot.
Lisäosa sisältää myös monia muita koodinrakentajia, laajan VBA-koodikirjaston ja valikoiman koodaustyökaluja. Se on pakollinen jokaiselle VBA -kehittäjälle.
Nyt tarkastelemme syvällisesti erilaisia silmukoita.
VBA seuraavaan silmukkaan
Silmukkasyntaksi
For For Next Loop voit toistaa koodilohkon tietyn määrän kertoja. Syntaksi on:
12345 | [Dim Counter kokonaislukuna]Laskuri = alusta loppuun [vaihearvo][Tee jotain]Seuraava [laskuri] |
Jos suluissa olevat kohteet ovat valinnaisia.
- [Himmennyslaskuri yhtä pitkä] - Ilmoittaa laskurin muuttujan. Pakollinen, jos Option Explicit on ilmoitettu moduulin yläosassa.
- Laskuri - Kokonaislukumuuttuja, jota käytetään laskemiseen
- alkaa - Aloitusarvo (esim. 1)
- Loppu - Loppuarvo (esim. 10)
- [Vaiheen arvo] - Voit laskea jokaisen n kokonaisluvun jokaisen kokonaisluvun sijasta. Voit myös mennä taaksepäin negatiivisella arvolla (esim. Vaihe -1)
- [Tee jotain] - Koodi, joka toistuu
- Seuraava [laskuri] - Päätös For Next Loopille. Voit sisällyttää laskurin tai et. Suosittelen kuitenkin vahvasti laskurin sisällyttämistä, koska se helpottaa koodin lukemista.
Jos se on hämmentävää, älä huoli. Tarkastelemme joitain esimerkkejä:
Laske 10: een
Tämä koodi lasketaan kymmeneen For-Next Loop -sovelluksella:
12345678 | Sub ForEach_CountTo10 ()Dim n kokonaislukunaN = 1-10MsgBox nSeuraava nEnd Sub |
Loop Stepille
Laske kymmeneen - vain parilliset numerot
Tämä koodi lasketaan kymmeneen vain parillisia numeroita laskettaessa:
12345678 | Sub ForEach_CountTo10_Even ()Dim n kokonaislukunaN = 2-10 Vaihe 2MsgBox nSeuraava nEnd Sub |
Huomaa, että lisäsimme vaiheen 2. Tämä kertoo For Loopille ”askeleen” laskurin läpi kahdella. Voimme myös käyttää negatiivista askelarvoa taaksepäin:
Loop Step - käänteinen
Laskenta alkaen 10
Tämä koodi laskee 10: stä:
123456789 | Sub ForEach_Countdown_Inverse ()Dim n kokonaislukunaN = 10 To 1 Vaihe -1MsgBox nSeuraava nMsgBox "Nosta pois"End Sub |
Poista rivit, jos solu on tyhjä
Olen useimmiten käyttänyt negatiivista For-Loop -silmukkaa kiertämään solualueita ja poistamaan tietyt kriteerit täyttävät rivit. Jos siirryt yläriveiltä alimmille riveille, kun poistat rivit, sotket laskurin.
Tämä esimerkki poistaa rivit, joissa on tyhjiä soluja (alimmalta riviltä alkaen):
12345678910 | Sub ForEach_DeleteRows_BlankCells ()Dim n kokonaislukunaN = 10 To 1 Vaihe -1Jos Alue ("a" & n) .Arvo = "" SittenAlue ("a" & n) .EntireRow.DeleteLoppu JosSeuraava nEnd Sub |
Nested For Loop
Voit "liittää" yhden silmukan toiseen silmukkaan. Käytämme Nested For Loops -sovellusta kertolaskun luomiseen:
1234567891011 | Sub Nested_ForEach_MultiplicationTable ()Himmennä rivi kokonaislukuna, sarake kokonaislukunaRivi = 1-9Väri = 1-9Solut (rivi + 1, sarake + 1) Arvo = rivi * sarakeSeuraava sarakeSeuraava riviEnd Sub |
Lopeta
Exit For -lausekkeen avulla voit poistua For For Next -silmukasta välittömästi.
Käytät yleensä Exit For -toimintoa If -lausekkeen ohella poistumalla For Next Loop -sivulle, jos tietty ehto täyttyy.
Voit esimerkiksi etsiä solun For Loop -sovelluksella. Kun solu on löydetty, voit poistua silmukasta nopeuttaaksesi koodiasi.
Tämä koodi kiertää rivejä 1–1000 ja etsii sarakkeesta A ”virhettä”. Jos se löytyy, koodi valitsee solun, varoittaa löydetystä virheestä ja poistuu silmukasta:
12345678910111213 | Sub ExitFor_Loop ()Dim i Kuten kokonaislukuI = 1 - 1000Jos Alue ("A" & i) .Arvo = "virhe" SittenAlue ("A" & i) .ValitseMsgBox "Virhe löytyi"LopetaLoppu JosSeuraavaksi minäEnd Sub |
Tärkeää: Jos kyseessä on Nested For Loops, Exit For sulkee vain nykyisen For Loop -silmukan, ei kaikki aktiiviset silmukat.
Jatka
VBA: lla ei ole Visual Basicissa olevaa "Jatka" -komentoa. Sen sijaan sinun on käytettävä Exit -näppäintä.
VBA jokaiselle silmukalle
Kunkin silmukan VBA kiertää kokoelman kaikkien objektien läpi:
- Kaikki solut alueella
- Kaikki laskentataulukot työkirjassa
- Kaikki muodot laskentataulukossa
- Kaikki avoimet työkirjat
Voit myös käyttää Nested For Every Loops -sovellusta seuraaviin tarkoituksiin:
- Kaikki solut alueella kaikilla laskentataulukoilla
- Kaikki muodot kaikilla laskentataulukoilla
- Kaikki taulukot kaikissa avoimissa työkirjoissa
- ja niin edelleen…
Syntaksi on:
123 | Jokaiselle kokoelman kohteelle[Tee jotain]Seuraava [objekti] |
Missä:
- Esine - Muuttuja, joka edustaa aluetta, laskentataulukkoa, työkirjaa, muotoa jne. (Esim. Rng)
- Kokoelma - Esineiden kokoelma (esim. Alue ("a1: a10")
- [Tee jotain] - Koodilohko suoritettava jokaisessa objektissa
- Seuraava [objekti] - Päätöslauselma. [Objekti] on valinnainen, mutta erittäin suositeltava.
Jokaiselle alueen solulle
Tämä koodi kiertää jokaisen alueen solun läpi:
123456789 | Sub ForEachCell_inRange ()Himmennä solu alueenaJokaiselle alueen solulle ("a1: a10")solu.arvo = solu.Siirto (0,1). arvoSeuraava soluEnd Sub |
Jokaiselle työkirjan laskentataulukolle
Tämä koodi kiertää kaikki työkirjan laskentataulukot ja poistaa jokaisen taulukon suojauksen:
123456789 | Osa ForEachSheet_inWorkbook ()Dim ws laskentataulukkonaJokaiselle viikolle laskentataulukoissaws.Suojaa salasanaSeuraava wsEnd Sub |
Jokaista avointa työkirjaa varten
Tämä koodi tallentaa ja sulkee kaikki avoimet työkirjat:
123456789 | Sub ForEWW_inWorkbooks ()Dim wb TyökirjanaJokaiselle wb: lle työkirjoissawb.Sulje SaveChanges: = TottaSeuraava wbEnd Sub |
Jokaiselle muodolle laskentataulukossa
Tämä koodi poistaa kaikki aktiivisen taulukon muodot.
123456789 | Sub ForEachShape ()Dim shp kuten muotoJokaiselle ActiveSheet.Shapesin shp: lleshp. PoistaSeuraava shpEnd Sub |
Jokaiselle muodolle työkirjan jokaisessa laskentataulukossa
Voit myös sisäistää jokaiselle silmukalle. Täällä käymme läpi kaikki muodot aktiivisen työkirjan kaikissa laskentataulukoissa:
1234567891011 | Sub ForEachShape_inAllWorksheets ()Dim shp kuten muoto, ws kuin laskentataulukkoJokaiselle viikolle laskentataulukoissaJokaiselle shp: lle ws.Shapesshp. PoistaSeuraava shpSeuraava wsEnd Sub |
Jokaiselle - IF -silmukka
Kuten aiemmin mainitsimme, voit käyttää If -lauseketta silmukan sisällä ja suorittaa toimintoja vain, jos tietyt ehdot täyttyvät.
Tämä koodi piilottaa alueen kaikki tyhjät rivit:
12345678910 | Sub ForEachCell_inRange ()Himmennä solu alueenaJokaiselle alueen solulle ("a1: a10")Jos cell.Value = "" Sitten _cell.EntireRow.Hidden = TottaSeuraava soluEnd Sub |
VBA Tee kun silmukka
VBA Do While ja Do till (katso seuraava osa) ovat hyvin samankaltaisia. He toistavat silmukan, kun (tai kunnes) ehto täyttyy.
Do While Loop toistaa silmukan, kun ehto täyttyy.
Tässä on Do while -syntaksi:
123 | Tee kunto -ehto[Tee jotain]Silmukka |
Missä:
- Kunto - Testattava ehto
- [Tee jotain] - Toistettava koodilohko
Voit myös määrittää Do While -silmukan ehdolla silmukan lopussa:
123 | Tehdä[Tee jotain]Silmukka kunto |
Esittelemme jokaisen ja esittelemme niiden erot:
Tehdä, kun
Tässä on esimerkki Do While -silmukasta, jonka olemme aiemmin osoittaneet:
12345678 | Sub DoWhileLoop ()Dim n kokonaislukunan = 1Tee kun n <11MsgBox nn = n + 1SilmukkaEnd Sub |
Toista silmukka
Suorita nyt sama menettely, paitsi että siirrämme ehdon silmukan loppuun:
12345678 | Sub DoLoopWhile ()Dim n kokonaislukunan = 1TehdäMsgBox nn = n + 1Silmukka kun n <11End Sub |
VBA Tee kunnes silmukka
Tee kunnes silmukat toistaa silmukan, kunnes tietty ehto täyttyy. Syntaksi on pohjimmiltaan sama kuin Do While -silmukat:
123 | Tee kuntoon asti[Tee jotain]Silmukka |
ja samoin ehto voi mennä silmukan alkuun tai loppuun:
123 | Tehdä[Tee jotain]Silmukka kuntoon asti |
Tee asti
Tämä Tee kunnes -silmukka lasketaan kymmeneen, kuten aiemmat esimerkit
12345678 | Sub DoUntilLoop ()Dim n kokonaislukunan = 1Tee kunnes n> 10MsgBox nn = n + 1SilmukkaEnd Sub |
Silmukka asti
Tämä Loop till -silmukka lasketaan 10: ksi:
12345678 | Sub DoLoopUltil ()Dim n kokonaislukunan = 1TehdäMsgBox nn = n + 1Silmukka kunnes n> 10End Sub |
Poistu Do Loopista
Samanlainen kuin Exit For -toiminnon käyttäminen For Loop -silmukasta poistumiseen, Exit Do -komento poistuu Do Loop -silmukasta välittömästi
1 | Lopeta Do |
Tässä on esimerkki Exit Do: sta:
123456789101112131415 | Sub ExitDo_Loop ()Dim i Kuten kokonaislukui = 1Tee kunnes i> 1000Jos Alue ("A" & i) .Arvo = "virhe" SittenAlue ("A" & i) .ValitseMsgBox "Virhe löydetty"Lopeta DoLoppu Josi = i + 1SilmukkaEnd Sub |
Lopeta tai katkaise silmukka
Kuten edellä mainittiin, voit poistua silmukoista Exit For- tai Exit Do -toiminnolla:
1 | Lopeta |
1 | Lopeta Do |
Nämä komennot on kuitenkin lisättävä koodiin ennen silmukan suorittamista.
Jos yrität "katkaista" silmukan, joka on käynnissä, voit yrittää painaa POISTU tai CTRL + Tauko näppäimistöllä. Tämä ei kuitenkaan välttämättä toimi. Jos se ei toimi, sinun on odotettava silmukan päättymistä tai loputtoman silmukan tapauksessa käytettävä CTRL + ALT + Poistaa pakottaa Excelin sulkemaan.
Siksi yritän välttää Do -silmukoita, on helpompi luoda vahingossa loputon silmukka, joka pakottaa sinut käynnistämään Excelin uudelleen ja mahdollisesti menettää työsi.
Lisää silmukkaesimerkkejä
Kierrä rivit läpi
Tämä kiertää kaikki sarakkeen rivit:
123456789 | Julkinen alisilmukkaThroughRows ()Himmennä solu alueenaJokaiselle alueen solulle ("A: A")Ff cell.value "" ja sitten MsgBox cell.address & ":" & cell.valueSeuraava soluEnd Sub |
Kierrä sarakkeet läpi
Tämä kiertää kaikki sarakkeet peräkkäin:
123456789 | Julkinen alisilmukkaThroughColumns ()Himmennä solu alueenaJokaiselle alueen solulle ("1: 1")If cell.Value "" Sitten MsgBox cell.Address & ":" & cell.ValueSeuraava soluEnd Sub |
Selaa tiedostoja kansiossa
Tämä koodi kiertää kaikki kansion tiedostot ja luo luettelon:
12345678910111213141516171819 | Sub LoopThroughFiles ()Dim oFSO kohteenaHimmennä kansio objektinaDim oFile objektinaDim i Kuten kokonaislukuAseta oFSO = CreateObject ("Scripting.FileSystemObject")Aseta oFolder = oFSO.GetFolder ("C: \ Demo)i = 2Jokaiselle oFile In OFolder.FilesilleAlue ("A" & i) .arvo = oFile.Namei = i + 1Seuraava tiedostoEnd Sub |
Kierrä matriisin läpi
Tämä koodi kulkee taulukon "arrList" läpi:
123 | I = LBound (arrList) - UBound (arrList)MsgBox -saapumislista (i)Seuraavaksi minä |
LBound -toiminto saa taulukon "alarajan" ja UBound "ylärajan".
Silmukat Access VBA: ssa
Useimmat yllä olevista esimerkeistä toimivat myös Access VBA: ssa. Accessissa kuitenkin kierrämme tietuejoukko -objektia Range -objektin sijaan.
123456789101112131415161718 | Sub LoopThroughRecords ()Virhe Jatka seuraavaksiDim dbs TietokannanaHimmennä ennätyksenäAseta dbs = CurrentDbAseta rst = dbs.OpenRecordset ("tblClients", dbOpenDynaset)Ensimmäisen kanssa.MoveLast.MoveFirstTee kunnes .EOF = TosiMsgBox (rst.Fields ("ClientName"))SiirräSeuraavaSilmukkaLopetaensimmäinen SuljeAseta rst = ei mitäänAseta dbs = ei mitäänEnd Sub |