VBA støtter enda en type looping i Excel 2016: looping gjennom hvert objekt i en samling av objekter. En samling består som du kanskje vet av en rekke gjenstander av samme type. For eksempel har Excel en samling av alle åpne arbeidsbøker (Arbeidsboksamlingen), og hver arbeidsbok har en samling regneark (Arbeidsarksamlingen).
Når du trenger å gå gjennom hvert objekt i en samling, bruk For Every-Next-strukturen. Følgende eksempel går gjennom hvert regneark i den aktive arbeidsboken og sletter regnearket hvis det er tomt:
Sub DeleteEmptySheets()
Dim WkSht som arbeidsark
Application.DisplayAlerts = False
For hver WkSht i ActiveWorkbook.Worksheets
Hvis WorksheetFunction.CountA(WkSht.Cells) = 0 Da
WkSht.Delete
Slutt om
Neste WkSht
Application.DisplayAlerts = Sant
End Sub
I dette eksemplet er variabelen WkSht en objektvariabel som representerer hvert regneark i arbeidsboken. Ingenting er spesielt med variabelnavnet WkSht; du kan bruke hvilket som helst variabelnavn du liker.
Koden går gjennom hvert regneark og bestemmer et tomt ark ved å telle de ikke-blanke cellene. Hvis antallet er null, er arket tomt, og det slettes. Legg merke til at DisplayAlerts-innstillingen er slått av mens loopen gjør sitt. Uten den uttalelsen dukker Excel opp en advarsel hver gang et ark er i ferd med å bli slettet.
Hvis alle regnearkene i arbeidsboken er tomme, får du en feilmelding når Excel prøver å slette det eneste arket. Normalt vil du skrive kode for å håndtere den situasjonen.
Her er et annet For Every-Next eksempel. Denne prosedyren bruker en løkke for å skjule alle regnearkene i den aktive arbeidsboken bortsett fra det aktive arket.
Sub HideSheets()
Dim Sht Som arbeidsark
For hver Sht i ActiveWorkbook.Worksheets
Hvis Sht.Name <> ActiveSheet.Name Da
Sht.Visible = xlSheetHidden
Slutt om
Neste Sht
End Sub
HideSheets-prosedyren kontrollerer arknavnet. Hvis det ikke er det samme som navnet på det aktive arket, er arket skjult. Legg merke til at Visible-egenskapen ikke er boolsk. Denne egenskapen kan faktisk ta på seg en av tre verdier, og Excel har tre innebygde konstanter. Hvis du er nysgjerrig på den tredje muligheten (xlVeryHidden), sjekk hjelpesystemet.
Det som blir skjult må til slutt vises, så her er en makro som viser alle regnearkene i den aktive arbeidsboken:
Sub UnhideSheets()
Dim Sht Som arbeidsark
For hver Sht i ActiveWorkbook.Worksheets
Sht.Visible = xlSheetVisible
Neste Sht
End Sub
Ikke overraskende kan du lage nestede For Every-Next-løkker. CountBold-prosedyren går gjennom hver celle i det brukte området på hvert regneark i hver åpne arbeidsbok og viser en telling av antall celler som er formatert med fet skrift:
Sub CountFet skrift()
Dim WBook Som arbeidsbok
Dim WSheet som arbeidsark
Dim celle som rekkevidde
Dim Cnt As Long
For hver WBook i arbeidsbøker
For hvert WSark i WBook.Worksheets
For hver celle i WSheet.UsedRange
Hvis Cell.Font.Bold = True, så Cnt = Cnt + 1
Neste celle
Neste WSark
Neste WBook
MsgBox Cnt & "fet celler funnet"
End Sub