Excel VBA -silmukat - jokaiselle, seuraavalle, tee toiselle, sisäkkäisille ja muille

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

Tulet auttaa kehittämään sivuston jakaminen sivu ystävillesi

wave wave wave wave wave