V tomto článku sme sa zaoberali rôznymi druhmi slučiek používaných vo VBA a ako ich použiť na splnenie tej istej úlohy rôznymi spôsobmi.
Prečo slučky?
Opakovanie je jednou z najsilnejších programovacích techník používaných v mnohých programovacích jazykoch. Opakovanie sa používa na opakovanie bloku kódu na požadovaný počet opakovaní alebo dovtedy, kým sa daná podmienka nevyhodnotí ako pravdivá, alebo kým sa nedosiahne konkrétna hodnota, po ktorej sa vykoná ďalší blok kódu.
Účelom slučky Excel VBA je prinútiť program Excel, aby niekoľkokrát opakoval časť kódu. Je možné určiť, koľkokrát sa musí kód opakovať ako pevné číslo (napr. Urobte to 10 -krát) alebo ako premennú (napr. Urobte toľkokrát, koľkokrát existujú riadky údajov).
Excel Loops je možné stavať rôznymi spôsobmi, aby vyhovovali rôznym okolnostiam. Rovnaké výsledky je často možné dosiahnuť rôznymi spôsobmi, aby vyhovovali vašim osobným preferenciám.
V programe Excel VBA sú k dispozícii tri rôzne druhy slučiek, ktorými sú:
1. DO DO SMYČKY
2. DO WHILE Loop
3. PRE slučku
1. DO DO SMYČKY
Smyčka DO UNITIL sa používa na opakovanie bloku kódu na neurčito, kým nie je zadaná podmienka nastavená na True. Stav je možné skontrolovať buď na začiatku alebo na konci slučky. Príkaz DO UNTIL… LOOP testuje stav na začiatku, zatiaľ čo príkaz DO… LOOP UNTIL testuje stav na konci slučky.
Syntax príkazu DO UNTIL… LOOP
Robiť do [Podmienka]
[Blok kódu sa má zopakovať]
Slučka
Syntax príkazu DO… LOOP UNTIL
Urob
[Blok kódu sa má zopakovať]
Slučka do [Podmienka]
Vysvetlili sme slučku DO… DO KOLA na príklade. Makrá Loop1 a Loop2 sa používajú na výpočet priemeru čísel v stĺpci A a stĺpci B pomocou slučky DO … UNTIL.
Vzorové údaje sú prítomné v rozsahu A15: B27. Stĺpec A obsahuje skóre z 1. kola a stĺpec B obsahuje skóre z 2. kola. Chceme vypočítať priemery skóre v 1. kole a 2. kole v stĺpci C.
V makre Loop1 sme použili „FormulaR1C1“ na vloženie priemerného vzorca do aktívnej bunky. Na konci cyklu je začiarknuté vyhlásenie o stave v slučke DO UNTIL.
V makre Loop2 sme použili „WorksheetFunction.Average“ na vloženie priemernej hodnoty do aktívnej bunky. Aj v tomto makre sa kontroluje stavový príkaz na konci cyklu.
Jediným rozdielom medzi makrom Loop1 a Loop2 je to, že Loop1 vloží priemerný vzorec, zatiaľ čo Loop2 vypočíta priemer a potom vloží priemernú hodnotu do aktívnej bunky.
2. DO WHILE Loop
Smyčka DO WHILE sa používa na opakovanie bloku kódu na neurčitý počet krát, pričom zadaná podmienka je naďalej True a zastaví sa, keď podmienka vráti hodnotu False. Stav je možné skontrolovať buď na začiatku, alebo na konci slučky. Príkaz DO WHILE … LOOP testuje podmienku na začiatku, zatiaľ čo príkaz DO … LOOP WHILE testuje podmienku na konci cyklu. Príkaz DO… LOOP WHILE sa používa, keď chceme, aby slučka spustila blok kódu aspoň raz pred kontrolou stavu.
Syntax príkazu DO WHILE … LOOP
Vykonať počas [Podmienka]
[Blok kódu sa má zopakovať]
Slučka
Syntax príkazu DO… LOOP WHILE
Urob
[Blok kódu sa má zopakovať]
Slučka počas [Podmienka]
V tomto prípade sa makrá Loop3 a Loop4 používajú na výpočet priemerov hodnôt v bunkách stĺpca A a stĺpca B. Obe makrá pracujú na rovnakých vzorových dátach, aké používajú makrá Loop1 a Loop2. Oba používajú príkaz DO WHILE na prechádzanie rozsahom, ktorý obsahuje údaje.
Jediným rozdielom medzi makrami Loop3 a Loop4 je to, že ide o rôzne spôsoby reprezentácie podmienok slučky DO WHILE.
Pretože makrá Loop3 a Loop4 používajú rovnaké vstupné údaje a dokonca vykonávajú rovnaké funkcie ako makro Loop1, vrátený výstup bude tiež rovnaký ako v prípade makra Loop1.
3. Slučka FOR
Slučka For Loop sa používa na opakovanie bloku kódu za určitý počet opakovaní.
Syntax slučky FOR
For count_variable = start_value To end_value
[blok kódu]
Nasledujúci počet_proměnných
Makro Loop5 ukazuje, ako použiť slučku FOR na výpočet priemeru. Tiež používa rovnaké vzorové údaje ako ostatné makrá. Ako východiskovú hodnotu sme použili 15, pretože vzorové údaje začínajú od 15th riadok. Na nájdenie posledného riadka obsahujúceho údaje sme použili rozsah („A“ & Cells.Rows.Count) .End (xlUp) .Row. Slučka FOR sa bude opakovať (posledná bunka- 15) niekoľkokrát.
Výstup vrátený po spustení makra Loop5 je rovnaký ako v prípade makra Loop1.
Makro Loop6 je vytvorené na výpočet priemeru, iba ak je aktívna bunka s priemernou funkciou prázdna pred spustením makra.
Vzorové údaje pre toto makro sú v rozsahu E15 až G27.
Na opakovanie definovaného rozsahu sme použili DO… LOOP WHILE. Príkaz IF sa používa na kontrolu, či bunka, do ktorej bude vložená funkcia, obsahuje hodnotu. Toto makro vloží do bunky priemernú funkciu, iba ak je prázdna.
Na výpočet priemeru sa používa aj makro Loop7. Pred vyhodnotením, či sa má znova zacykliť, skontroluje hodnoty v stĺpci pomocníka. Tiež kontroluje, či je odkaz na bunku, ktorý sa má použiť v priemernej funkcii, prázdny.
Ukážkové údaje použité pre makro Loop7 sú v rozsahu J15: M27.
Stĺpec M sa používa ako pomocný stĺpec. Toto makro vloží priemernú funkciu iba vtedy, ak bunka v stĺpci M nie je prázdna. Toto makro kontroluje, či je bunka prázdna, a potom do nej vložte priemernú funkciu. Priemerná funkcia nevloží, ak je bunka, na ktorú sa odkazuje v priemernej funkcii, prázdna.
Pri kódovaní postupujte podľa nižšie uvedených pokynov
Voľba Explicitná čiastková slučka1 () „Výpočet priemeru“ Do Do cyklu sa bude slučka opakovať, kým bunka v predchádzajúcom stĺpci aktívnej bunky nebude prázdna Rozsah („C15“). Vyberte položku Do 'Priradenie priemernej funkcie k hodnote v bunkách predchádzajúcich dvoch po sebe nasledujúcich stĺpcov ActiveCell. FormulaR1C1 = "= Priemer (RC [-1], RC [-2])" "Presun do bunky v nasledujúcom riadku ActiveCell.Offset (1, 0). Vyberte 'Kontrola, či je hodnota v bunke predchádzajúceho stĺpca prázdna' Vykonať do slučka sa bude opakovať, kým podmienka nevráti True Loop Within IsEmpty (ActiveCell.Offset (0, -1)) Range ("A15"). Vyberte End Sub Sub Loop2 () 'Výpočet priemeru' Do Do cyklu bude slučka až do bunky v predchádzajúcom stĺpec aktívnej bunky je prázdny „Toto makro je podobné makru Loop1, iba spôsob výpočtu priemeru má iný rozsah („ C15 “). Na výber priemeru sa používa funkcia Worsheet.Average. ActiveCell.Value = WorksheetFunction.Average ( ActiveCell.Offset (0, -1). Hodnota, _ ActiveCell.Offset (0, -2) .Hodnota) ActiveCell.Offset (1, 0). Vyberte slučku, kým nie je prázdna (ActiveCel l.Offset (0, -1)) Rozsah ("A15"). Vyberte End Sub Sub Loop3 () 'Výpočet priemeru' Slučka Do While bude bežať, kým nebude bunka v predchádzajúcom stĺpci aktívnej bunky prázdna. Rozsah ("C15") . Vyberte „Kontrola, či je hodnota v bunke predchádzajúceho stĺpca prázdna“ Cyklus Do While sa bude opakovať, kým podmienka nebude pravdivá. Do Do IsEmpty (ActiveCell.Offset (0, -1)) = False dva po sebe idúce stĺpce ActiveCell.FormulaR1C1 = "= Priemer (RC [-1], RC [-2])" 'Presun do bunky v nasledujúcom riadku ActiveCell.Offset (1, 0). Vyberte rozsah slučky ("A15"). Vyberte End Sub Sub Loop4 () „Výpočet priemeru“ Cyklus Do While pobeží, kým nie je bunka v predchádzajúcom stĺpci aktívnej bunky prázdna 'Toto makro je podobné makru Loop3, iba spôsob aplikácie podmienky je iný Rozsah („C15“). Vyberte Do Do Not IsEmpty (ActiveCell.Offset (0, -1)) ActiveCell.FormulaR1C1 = "= Average (RC [-1], RC [-2])" ActiveCell.Offset (1, 0). Select Loop Range (" A15 "). Vyberte opakovanie slučky OP Sub5 () 'FOR pre pevné znecitlivenie er časov určených počtom riadkov Dim i, lastcell As Long 'Nájdenie posledného riadka obsahujúceho údaje v stĺpci A lastcell = Range ("A" & Cells.Rows.Count) .End (xlUp) .Row Range ("C15 "). Vyberte 'i premennej je priradená hodnota 15, pretože naše vzorové údaje začínajú od 15. riadka' FOR Slučka bude slučka x Pre i = 15 Do poslednej bunky ActiveCell.FormulaR1C1 =" = Priemer (RC [-1], RC [-2 ]) "ActiveCell.Offset (1, 0). Vyberte Next i Range (" A15 "). Vyberte End Sub Sub Loop6 () 'Výpočet priemeru' Slučka Do Do bude cyklovať, kým bunka v predchádzajúcom stĺpci aktívnej bunky nebude prázdna. Nevypočíta priemer, ak už v poli bunky niečo je („G15“). Vyberte položku Vykonať, ak je prázdna (ActiveCell) Potom ActiveCell.FormulaR1C1 = "= Priemer (RC [-1], RC [-2])" End If ActiveCell.Offset (1, 0). Select Loop until IsEmpty (ActiveCell.Offset (0, -1)) Range ("E15"). Select End Sub Sub Loop7 () 'Do until loop runs as long as there niečo v bunke v nasledujúcom stĺpci „Nevypočíta sa priemer, ak už je niečo v aktívnom c ani nie, ak v bunkách, ktoré sa používajú v rámci priemernej funkcie, nie sú žiadne údaje (aby sa predišlo chybám #DIV/0). „Výpočet priemerného rozsahu („ L15 “). Vyberte položku Do If IsEmpty (ActiveCell) Then If IsEmpty (ActiveCell.Offset (0, -1)) And IsEmpty (ActiveCell.Offset (0, -2)) Then ActiveCell.Value =" "Else ActiveCell.FormulaR1C1 =" = Priemer (RC [-1], RC [-2]) "Koniec, ak koniec, ak ActiveCell.Offset (1, 0). Vyberte slučku, kým nie je prázdna (ActiveCell.Offset (0, 1)) Rozsah („J15“). Vyberte položku End Sub
Ak sa vám tento blog páčil, zdieľajte ho so svojimi priateľmi na Facebooku. Môžete nás tiež sledovať na Twitteri a Facebooku.
Budeme radi, ak sa nám ozvete, dajte nám vedieť, ako môžeme zlepšiť našu prácu a zlepšiť ju pre vás. Napíšte nám na emailovú stránku