Tässä artikkelissa olemme käsitelleet erilaisia VBA: ssa käytettyjä silmukoita ja kuinka käyttää niitä saman tehtävän suorittamiseen eri tavoin.
Miksi Loops?
Looping on yksi tehokkaimmista ohjelmointitekniikoista, jota käytetään monilla ohjelmointikielillä. Silmukkaa käytetään toistamaan koodilohko tarvittavan määrän kertoja tai kunnes tietty ehto on todenmukainen tai tietty arvo saavutetaan, minkä jälkeen seuraava koodilohko suoritetaan.
Excel VBA -silmukan tarkoituksena on saada Excel toistamaan koodi tietty määrä kertoja. Voidaan määrittää, kuinka monta kertaa koodi on toistettava kiinteänä numerona (esim. Tee tämä 10 kertaa) tai muuttujana (esim. Tee tämä niin monta kertaa kuin on datarivejä).
Excel -silmukat voidaan rakentaa eri tavoin eri olosuhteisiin sopiviksi. Usein samat tulokset voidaan saada eri tavoilla henkilökohtaisten mieltymystesi mukaan.
Excel VBA: ssa on kolme erilaista silmukkaa, jotka ovat:
1. TEE Loop -asti
2. TEE KUIN Loop
3. FOR Loop
1. TEE Loop -asti
DO UNTIL Loopia käytetään toistamaan koodilohko loputtomiin, kunnes määritetty ehto on True. Kunto voidaan tarkistaa silmukan alussa tai lopussa. Käsky DO UNTIL… LOOP testaa tilan alussa, kun taas DO… LOOP UNTIL -lauseke testaa silmukan lopussa olevan tilan.
DO UNTIL… LOOP -lausekkeen syntaksi
Tee kunnes [Ehto]
[Toistettava koodilohko]
Silmukka
DO… LOOP UNTIL -lausekkeen syntaksi
Tehdä
[Toistettava koodilohko]
Kierrä kunnes [Ehto]
Olemme selittäneet DO… -kierron esimerkillä. Loop1- ja Loop2 -makroja käytetään laskemaan sarakkeen A ja sarakkeen B numeroiden keskiarvo käyttämällä DO… UNTIL -silmukkaa.
Esimerkkitiedot ovat alueella A15: B27. Sarake A sisältää kierroksen 1 tulokset ja sarake B sisältää kierroksen 2 pisteet. Haluamme laskea keskiarvot pisteiden 1 ja 2 sarakkeesta C.
Loop1 -makrossa olemme käyttäneet kaavaa “FormulaR1C1” keskimääräisen kaavan lisäämiseksi aktiiviseen soluun. DO UNTIL -silmukan ehtolauseke tarkistetaan silmukan lopussa.
Loop2 -makrossa olemme käyttäneet "WorksheetFunction.Average" -arvoa keskimääräisen arvon lisäämiseen aktiiviseen soluun. Jopa tässä makrossa ehtolauseke tarkistetaan silmukan lopussa.
Ainoa ero Loop1- ja Loop2 -makron välillä on, että Loop1 lisää keskimääräisen kaavan, kun taas Loop2 laskee keskiarvon ja lisää sitten keskiarvon aktiiviseen soluun.
2. TEE KUIN Loop
DO WHILE -silmukkaa käytetään toistamaan koodilohko määräämättömän monta kertaa, kun taas määritetty ehto on edelleen tosi ja pysähtyy, kun ehto palauttaa epätosi. Kunto voidaan tarkistaa silmukan alussa tai lopussa. DO WHILE… LOOP -lauseke testaa tilan alussa, kun taas DO… LOOP WHILE -lauseke testaa silmukan lopussa olevan tilan. Käskyä DO… LOOP WHILE käytetään, kun haluamme silmukan suorittavan koodilohkon vähintään kerran ennen ehdon tarkistamista.
DO WHILE… LOOP -lausekkeen syntaksi
Tee samalla [Ehto]
[Toistettava koodilohko]
Silmukka
DO… LOOP WHILE -lausekkeen syntaksi
Tehdä
[Toistettava koodilohko]
Toista silmukka [Ehto]
Tässä esimerkissä Loop3- ja Loop4 -makroja käytetään laskemaan sarakkeen A ja B -solujen arvojen keskiarvot. Molemmat makrot toimivat samoilla näytetiedoilla kuin Loop1- ja Loop2 -makrot. Molemmat käyttävät DO WHILE -käskyä silmukan läpi alueen, joka sisältää tiedot.
Ainoa ero Loop3- ja Loop4 -makrojen välillä on, että ne ovat erilaisia tapoja edustaa DO WHILE -silmukan ehtoja.
Koska Loop3- ja Loop4 -makrot käyttävät samoja syöttötietoja ja suorittavat jopa samat toiminnot kuin Loop1 -makro, niin että palautettu lähtö on sama kuin Loop1 -makron.
3. FOR silmukka
For Loop käytetään toistamaan koodilohko tietyn määrän kertoja.
FOR -silmukan syntaksi
Laskentamuuttujalle = alkuarvo Loppuarvolle
[koodilohko]
Seuraava luku_muuttuja
Loop5 -makro näyttää kuinka FOR -silmukan avulla lasketaan keskiarvo. Se käyttää myös samoja näytetietoja kuin muut makrot. Olemme käyttäneet 15 lähtöarvona, koska näytetiedot alkavat 15: stäth rivi. Olemme käyttäneet Range ("A" & Cells.Rows.Count) .End (xlUp) .Row löytääksesi viimeisen tietoja sisältävän rivin. FOR-silmukka toistaa (viimeinen solu- 15) useita kertoja.
Loop5 -makron suorittamisen jälkeen palautettu lähtö on sama kuin Loop1 -makron.
Loop6 -makro luodaan laskemaan keskiarvo vain, jos aktiivinen solu, jolla on keskimääräinen funktio, on tyhjä ennen makron suorittamista.
Tämän makron näytetiedot ovat alueella E15 - G27.
Olemme käyttäneet DO… LOOP WHILE -silmukkaa määritetyn alueen läpi. IF -käskyä käytetään tarkistamaan, sisältääkö solu, johon toiminto lisätään, arvon. Tämä makro lisää soluun keskimääräisen funktion vain, jos se on tyhjä.
Loop7 -makroa käytetään myös keskiarvon laskemiseen. Se tarkistaa arvot auttajasarakkeesta ennen kuin arvioi, toistetaanko silmukka uudelleen. Se myös tarkistaa, onko keskitoiminnossa käytettävä soluviittaus tyhjä.
Loop7 -makron näytetiedot ovat alueella J15: M27.
Saraketta M käytetään apupylväsnä. Tämä makro lisää keskimääräisen funktion vain, jos sarakkeen M solu ei ole tyhjä. Tämä makro tarkistaa, että solun on oltava tyhjä, ennen kuin lisäät siihen keskimääräisen funktion. Se ei lisää keskiarvofunktiota, jos keskiarvofunktiossa viitattu solu on tyhjä.
Seuraa koodia alla
Vaihtoehto Selkeä alisilmukka1 () 'Keskiarvon laskeminen' To asti asti -silmukka silmukkaa, kunnes aktiivisen solun edellisen sarakkeen solu on tyhjä Alue ("C15"). Valitse Tee "Määritä keskiarvofunktio kahden edellisen sarakkeen ActiveCell -solujen arvolle. FormulaR1C1 = "= Keskiarvo (RC [-1], RC [-2])" 'Siirrytään seuraavan rivin soluun ActiveCell.Offset (1, 0). Valitse' Tarkistetaan onko edellisen sarakkeen solun arvo tyhjä 'Tee kunnes silmukka kiertää, kunnes ehtolauseke palauttaa True Loop till IsEmpty (ActiveCell.Offset (0, -1)) Range ("A15"). aktiivisen solun sarake on tyhjä 'Tämä makro on samanlainen kuin makro Loop1, ainoa tapa laskea keskiarvo on erilainen Alue ("C15"). Valitse Tee' Worsheet.Average -funktiota käytetään keskimääräisen ActiveCell.Value = WorksheetFunction.Average ( ActiveCell.Offset (0, -1) .Arvo, _ ActiveCell.Offset (0, -2) .Arvo) ActiveCell.Offset (1, 0) .Valitse silmukka kunnes isEmpty (ActiveCel l.Siirtymä (0, -1)) Alue ("A15"). Valitse End Sub Sub Loop3 () 'Laske keskimääräinen Do Do -silmukka, kunnes aktiivisen solun edellisen sarakkeen solu on tyhjä Alue ("C15") .Valitse 'Tarkista, onko edellisen sarakkeen solun arvo tyhjä'. kaksi peräkkäistä saraketta ActiveCell.FormulaR1C1 = "= Keskiarvo (RC [-1], RC [-2])" 'Siirrytään seuraavan rivin soluun ActiveCell.Offset (1, 0). Valitse silmukka-alue ("A15"). Lopeta alisilmukka4 () 'Keskiarvon laskeminen' Do while -silmukka suoritetaan, kunnes aktiivisen solun edellisen sarakkeen solu on tyhjä 'Tämä makro on samanlainen kuin makro Loop3, ainoa tapa soveltaa ehtoa on eri alue ("C15"). Tee kun ei ole tyhjä (ActiveCell.Offset (0, -1)) ActiveCell.FormulaR1C1 = "= Keskimääräinen (RC [-1], RC [-2])" ActiveCell.Offset (1, 0) .Valitse silmukka-alue (" A15 "). Valitse End Sub Sub Loop5 () 'FOR silmukka toistaa kiinteää numeroa rivien lukumäärän määrittämien aikojen määrä Dim i, lastcell As Long 'Sarakkeen A viimeisen rivin sisältävän rivin löytäminen lastcell = Range ("A" & Cells.Rows.Count) .End (xlUp) .Row Range ("C15 ") .Valitse" i-muuttuja, jonka arvo on 15, kun näytetietomme alkavat 15. riviltä "FOR Loop silmukka x For i = 15 Lastcell ActiveCell.FormulaR1C1 =" = Keskiarvo (RC [-1], RC [-2 ]) "ActiveCell.Offset (1, 0) .Valitse Seuraava i -alue (" A15 "). Valitse Lopeta alisilmukka6 () 'Keskiarvon laskeminen' Tee kunnes silmukka silmukkaa, kunnes aktiivisen solun edellisen sarakkeen solu on tyhjä ' Se ei laske keskiarvoa, jos solualueella ("G15") on jo jotain. Valitse Do If IsEmpty (ActiveCell) Sitten ActiveCell.FormulaR1C1 = "= Average (RC [-1], RC [-2])" Lopeta, jos ActiveCell.Offset (1, 0) .Valitse Loop till IsEmpty (ActiveCell.Offset (0, -1)) Range ("E15"). jotain seuraavan sarakkeen solussa 'Se ei laske keskiarvoa, jos aktiivisessa c: ssä on jo jotain ell 'Ei myöskään, jos soluissa ei ole tietoja, joita käytetään keskimääräisessä funktiossa (välttääksesi #DIV/0 -virheet). 'Keskimääräisen alueen laskeminen ("L15"). Valitse Do If IsEmpty (ActiveCell) Sitten If IsEmpty (ActiveCell.Offset (0, -1)) And IsEmpty (ActiveCell.Offset (0, -2)) Sitten ActiveCell.Value = " "Else ActiveCell.FormulaR1C1 =" = Keskiarvo (RC [-1], RC [-2]) "End If End Jos ActiveCell.Offset (1, 0) .Valitse Loop Before IsEmpty (ActiveCell.Offset (0, 1)) Alue ("J15"). Valitse Lopeta ala
Jos pidit tästä blogista, jaa se ystävillesi Facebookissa. Voit myös seurata meitä Twitterissä ja Facebookissa.
Haluaisimme kuulla sinusta, kerro meille, kuinka voimme parantaa työtämme ja parantaa sitä sinulle. Kirjoita meille sähköpostitse