V tomto článku jsme se zabývali různými druhy smyček používaných ve VBA a jak je použít k dosažení stejného úkolu různými způsoby.
Proč smyčky?
Smyčka je jednou z nejsilnějších programovacích technik používaných v mnoha programovacích jazycích. Smyčka se používá k opakování bloku kódu na požadovaný počet opakování nebo dokud není daná podmínka vyhodnocena jako true nebo je dosaženo konkrétní hodnoty, po které je spuštěn další blok kódu.
Účelem smyčky Excel VBA je zajistit, aby Excel několikrát opakoval část kódu. Lze určit, kolikrát se musí kód opakovat jako pevné číslo (např. Proveďte to 10krát) nebo jako proměnnou (např. Proveďte tolikrát, kolik řádků dat).
Smyčky aplikace Excel lze konstruovat různými způsoby, aby vyhovovaly různým okolnostem. Stejných výsledků lze často dosáhnout různými způsoby, aby vyhovovaly vašim osobním preferencím.
V aplikaci Excel VBA jsou k dispozici tři různé druhy smyček, kterými jsou:
1. DO DO Smyčky
2. DO WHILE Loop
3. PRO Smyčku
1. DO DO Smyčky
Smyčka DO UNITIL slouží k opakování bloku kódu na neurčito, dokud není zadaná podmínka nastavena na True. Stav lze zkontrolovat buď na začátku, nebo na konci smyčky. Příkaz DO UNTIL… LOOP testuje podmínku na začátku, zatímco příkaz DO… LOOP UNTIL testuje podmínku na konci smyčky.
Syntaxe příkazu DO UNTIL… LOOP
Dělat do [Podmínka]
[Blok kódu se bude opakovat]
Smyčka
Syntaxe příkazu DO… LOOP UNTIL
Dělat
[Blok kódu se bude opakovat]
Smyčka do [Podmínka]
Vysvětlili jsme si DO… DO smyčky na příkladu. Makra Loop1 a Loop2 se používají k výpočtu průměru čísel ve sloupci A a sloupci B pomocí smyčky DO… UNTIL.
Ukázková data jsou přítomna v rozsahu A15: B27. Sloupec A obsahuje skóre 1. kola a sloupec B obsahuje výsledky 2. kola. Chceme vypočítat průměry skóre v 1. kole a 2. kole ve sloupci C.
V makru Loop1 jsme použili „FormulaR1C1“ k vložení průměrného vzorce do aktivní buňky. Na konci cyklu je zaškrtnuto prohlášení o podmínkách ve smyčce DO UNTIL.
V makru Loop2 jsme použili „WorksheetFunction.Average“ k vložení průměrné hodnoty do aktivní buňky. I v tomto makru je na konci cyklu zkontrolován příkaz podmínky.
Jediným rozdílem mezi makrou Loop1 a Loop2 je to, že Loop1 vloží průměrný vzorec, zatímco Loop2 vypočítá průměr a poté vloží průměrnou hodnotu do aktivní buňky.
2. DO WHILE Loop
Smyčka DO WHILE se používá k opakování bloku kódu na neurčitý početkrát, zatímco zadaná podmínka je i nadále True a zastaví se, když podmínka vrátí False. Stav lze zkontrolovat buď na začátku, nebo na konci smyčky. Příkaz DO WHILE… LOOP testuje podmínku na začátku, zatímco příkaz DO… LOOP WHILE testuje podmínku na konci smyčky. Příkaz DO… LOOP WHILE se používá, když chceme, aby smyčka alespoň jednou spustila blok kódu před kontrolou podmínky.
Syntaxe příkazu DO WHILE… LOOP
Dělat při [Podmínka]
[Blok kódu se bude opakovat]
Smyčka
Syntaxe příkazu DO… LOOP WHILE
Dělat
[Blok kódu se bude opakovat]
Smyčka zatímco [Podmínka]
V tomto příkladu se makra Loop3 a Loop4 používají k výpočtu průměrů hodnot v buňkách sloupce A a sloupce B. Obě makra fungují na stejných ukázkových datech, jaká používají makra Loop1 a Loop2. Oba používají příkaz DO WHILE k procházení rozsahu, který obsahuje data.
Jediným rozdílem mezi makry Loop3 a Loop4 je to, že jde o různé způsoby znázornění podmínek smyčky DO WHILE.
Protože makra Loop3 a Loop4 používají stejná vstupní data a dokonce provádějí stejné funkce jako makro Loop1, takže vrácený výstup bude stejný jako u makra Loop1.
3. FOR smyčka
Smyčka For Loop se používá k opakování bloku kódu pro určitý počet opakování.
Syntaxe smyčky FOR
For count_variable = start_value To end_value
[blok kódu]
Další count_variable
Makro Loop5 ukazuje, jak použít smyčku FOR k výpočtu průměru. Používá také stejná ukázková data, jaká používají jiná makra. Použili jsme 15 jako počáteční hodnotu, protože ukázková data začínají od 15th řádek. Použili jsme Range ("A" & Cells.Rows.Count) .End (xlUp) .Row k nalezení posledního řádku obsahujícího data. Smyčka FOR se bude opakovat (poslední buňka- 15) několikrát.
Výstup vrácený po spuštění makra Loop5 je stejný jako u makra Loop1.
Makro Loop6 je vytvořeno pro výpočet průměru, pouze pokud je aktivní buňka, která bude mít průměrnou funkci, prázdná před spuštěním makra.
Ukázková data pro toto makro jsou přítomna v rozsahu E15 až G27.
Použili jsme DO… LOOP WHILE k procházení definovaným rozsahem. Příkaz IF slouží ke kontrole, zda buňka, do které bude funkce vložena, obsahuje hodnotu. Toto makro vloží do buňky průměrnou funkci, pouze pokud je prázdná.
Pro výpočet průměru se také používá makro Loop7. Před vyhodnocením, zda se má opakovat smyčka, zkontroluje hodnoty ve sloupci pomocníka. Také kontroluje, zda je odkaz na buňku, který má být použit v průměrné funkci, prázdný.
Ukázková data použitá pro makro Loop7 jsou v rozsahu J15: M27.
Sloupec M se používá jako pomocný sloupec. Toto makro vloží průměrnou funkci pouze v případě, že buňka ve sloupci M není prázdná. Toto makro zkontroluje, že buňka by měla být prázdná, než do ní vložíte průměrnou funkci. Pokud je buňka odkazovaná v průměrné funkci prázdná, nevloží průměrnou funkci.
Pro kód prosím postupujte níže
Volba Explicitní dílčí smyčka1 () „Výpočet průměru“ Do Do smyčky se bude smyčka opakovat, dokud buňka v předchozím sloupci aktivní buňky nebude prázdná Rozsah („C15“). Vyberte Do 'Přiřazení průměrné funkce hodnotě v buňkách předchozích dvou po sobě jdoucích sloupců ActiveCell. FormulaR1C1 = "= Průměr (RC [-1], RC [-2])" "Přesun do buňky v dalším řádku ActiveCell.Offset (1, 0). Vyberte 'Kontrola, zda je hodnota v buňce předchozího sloupce prázdná' Do smyčka se bude opakovat, dokud podmínka nevrátí True Loop Before IsEmpty (ActiveCell.Offset (0, -1)) Range ("A15"). Vyberte End Sub Sub Loop2 () 'Výpočet průměru' Do Do cyklu bude smyčka až do buňky v předchozí sloupec aktivní buňky je prázdný 'Toto makro je podobné makru Loop1, pouze způsob výpočtu průměru se liší Rozsah („C15“). Vyberte Do' Worsheet.Average funkce se používá pro výpočet průměru ActiveCell.Value = WorksheetFunction.Average ( ActiveCell.Offset (0, -1) .Hodnota, _ ActiveCell.Offset (0, -2) .Hodnota) ActiveCell.Offset (1, 0). Vyberte smyčku dokud není prázdná (ActiveCel l.Offset (0, -1)) Rozsah ("A15"). Vyberte End Sub Sub Loop3 () 'Výpočet průměru' Do While smyčka poběží, dokud nebude buňka v předchozím sloupci aktivní buňky prázdná Rozsah ("C15") .Vyberte 'Kontrola, zda je hodnota v buňce předchozího sloupce prázdná' Cyklus Do While se bude opakovat, dokud podmínka nebude True Do While IsEmpty (ActiveCell.Offset (0, -1)) = False 'Přiřazení průměrné funkce hodnotě v buňkách předchozí dva po sobě jdoucí sloupce ActiveCell.FormulaR1C1 = "= Průměr (RC [-1], RC [-2])" 'Přesun do buňky v dalším řádku ActiveCell.Offset (1, 0). Vyberte rozsah smyčky ("A15"). Vyberte End Sub Sub Loop4 () „Výpočet průměru“ Do While smyčka poběží, dokud nebude buňka v předchozím sloupci aktivní buňky prázdná 'Toto makro je podobné makru Loop3, pouze způsob použití podmínky je jiný Rozsah („C15“). Vyberte Do Do Not IsEmpty (ActiveCell.Offset (0, -1)) ActiveCell.FormulaR1C1 = "= Průměr (RC [-1], RC [-2])" ActiveCell.Offset (1, 0). Vyberte rozsah smyčky (" A15 "). Vyberte opakování smyčky End Sub Sub5 () 'FOR pro pevné znecitlivění er časů určených počtem řádků Dim i, lastcell As Long 'Hledání posledního řádku obsahujícího data ve sloupci A lastcell = Range ("A" & Cells.Rows.Count) .End (xlUp) .Row Range ("C15 "). Vyberte 'i proměnné je přiřazena hodnota 15, protože naše ukázková data začínají od 15. řádku' FOR Loop bude smyčka x For i = 15 To lastcell ActiveCell.FormulaR1C1 =" = Average (RC [-1], RC [-2 ]) "ActiveCell.Offset (1, 0). Vyberte Next i Range (" A15 "). Vyberte End Sub Sub Loop6 () 'Výpočet průměru' Do Do loop bude smyčka, dokud buňka v předchozím sloupci aktivní buňky nebude prázdná ' Nevypočítává průměr, pokud již v oblasti buněk něco je („G15“). Vyberte Do Do Is IsEmpty (ActiveCell) Then ActiveCell.FormulaR1C1 = "= Average (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 Before loop runs as long as there is něco v buňce v dalším sloupci „Nevypočítává průměr, pokud již v aktivním c něco je ell 'Ani v případě, že v buňkách, které se používají v rámci průměrné funkce, nejsou žádná data (aby se předešlo chybám #DIV/0). 'Výpočet průměrného rozsahu („L15“). Vyberte Do If IsEmpty (ActiveCell) Then If IsEmpty (ActiveCell.Offset (0, -1)) And IsEmpty (ActiveCell.Offset (0, -2)) Then ActiveCell.Value = " "Else ActiveCell.FormulaR1C1 =" = Průměr (RC [-1], RC [-2]) "End If End If ActiveCell.Offset (1, 0). Select Loop until IsEmpty (ActiveCell.Offset (0, 1)) Rozsah („J15“). Vyberte End Sub
Pokud se vám tento blog líbil, sdílejte ho se svými přáteli na Facebooku. Také nás můžete sledovat na Twitteru a Facebooku.
Rádi bychom od vás slyšeli, dejte nám vědět, jak můžeme zlepšit naši práci a zlepšit ji pro vás. Napište nám na e -mail