VBA podporuje ešte ďalší typ cyklovania v Exceli 2016: cyklovanie cez každý objekt v kolekcii objektov. Zbierka, ako možno viete, pozostáva z množstva predmetov rovnakého typu. Napríklad Excel má kolekciu všetkých otvorených zošitov (kolekcia Workbooks) a každý zošit má kolekciu pracovných hárkov (kolekcia Worksheets).
Keď potrebujete prejsť cez každý objekt v kolekcii, použite štruktúru For Each-Next. Nasledujúci príklad prechádza každým pracovným hárkom v aktívnom zošite a vymaže ho, ak je prázdny:
Sub DeleteEmptySheets()
Dim WkSht As Worksheet
Application.DisplayAlerts = False
Pre každý WkSht v ActiveWorkbook.Worksheets
Ak WorksheetFunction.CountA(WkSht.Cells) = 0 Potom
WkSht.Delete
Koniec Ak
Ďalší WkSht
Application.DisplayAlerts = True
End Sub
V tomto príklade je premenná WkSht objektová premenná, ktorá predstavuje každý pracovný hárok v zošite. Na názve premennej WkSht nie je nič zvláštne; môžete použiť ľubovoľný názov premennej, ktorý sa vám páči.
Kód prechádza každým pracovným hárkom a určí prázdny hárok spočítaním neprázdnych buniek. Ak je tento počet nula, hárok je prázdny a vymaže sa. Všimnite si, že nastavenie DisplayAlerts je vypnuté, kým slučka robí svoju prácu. Bez tohto príkazu Excel zobrazí varovanie vždy, keď sa hárok chystá odstrániť.
Ak sú všetky hárky v zošite prázdne, pri pokuse Excelu o odstránenie jediného hárka sa zobrazí chyba. Normálne by ste napísali kód na riešenie tejto situácie.
Tu je ďalší príklad For Each-Next. Tento postup používa slučku na skrytie všetkých pracovných hárkov v aktívnom zošite okrem aktívneho hárka.
Sub HideSheets()
Dim Sht As Worksheet
Pre každý Sht v ActiveWorkbook.Worksheets
Ak Sht.Name <> ActiveSheet.Name Then
Sht.Visible = xlSheetHidden
Koniec Ak
Ďalej Sht
End Sub
Procedúra HideSheets skontroluje názov hárka. Ak sa nezhoduje s názvom aktívneho hárka, hárok je skrytý. Všimnite si, že vlastnosť Visible nie je boolovská. Táto vlastnosť môže v skutočnosti nadobudnúť ktorúkoľvek z troch hodnôt a Excel poskytuje tri vstavané konštanty. Ak vás zaujíma tretia možnosť (xlVeryHidden), pozrite si systém pomocníka.
Čo sa skryje, musí sa nakoniec odkryť, takže tu je makro, ktoré odkryje všetky pracovné hárky v aktívnom zošite:
Sub UnhideSheets()
Dim Sht As Worksheet
Pre každý Sht v ActiveWorkbook.Worksheets
Sht.Visible = xlSheetVisible
Ďalej Sht
End Sub
Nie je prekvapením, že môžete vytvoriť vnorené slučky For Each-Next. Procedúra CountBold prechádza cez každú bunku v použitom rozsahu na každom hárku v každom otvorenom zošite a zobrazuje počet buniek, ktoré sú naformátované tučným písmom:
Sub CountBold()
Stlmiť WBook ako pracovný zošit
Dim WSsheet As Worksheet
Dim Cell As Range
Dim Cnt As Long
Pre každý WBook v zošitoch
Pre každý list WBook.Worksheets
Pre každú bunku v liste WSheet.UsedRange
Ak Cell.Font.Bold = True, potom Cnt = Cnt + 1
Ďalšia bunka
Ďalší WSlist
Ďalší WBook
MsgBox Cnt & „Boli nájdené tučné bunky“
End Sub