VBA stöder ännu en typ av looping i Excel 2016: looping genom varje objekt i en samling objekt. En samling består som du kanske vet av ett antal föremål av samma typ. Till exempel har Excel en samling av alla öppna arbetsböcker (Arbetsboksamlingen), och varje arbetsbok har en samling kalkylblad (Arbetsbladssamlingen).
När du behöver gå igenom varje objekt i en samling använder du strukturen For Every-Next. Följande exempel går igenom varje kalkylblad i den aktiva arbetsboken och tar bort kalkylbladet om det är tomt:
Sub DeleteEmptySheets()
Dim WkSht Som arbetsblad
Application.DisplayAlerts = False
För varje WkSht i ActiveWorkbook.Worksheets
Om WorksheetFunction.CountA(WkSht.Cells) = 0 Då
WkSht.Delete
Avsluta om
Nästa WkSht
Application.DisplayAlerts = Sant
Avsluta Sub
I det här exemplet är variabeln WkSht en objektvariabel som representerar varje kalkylblad i arbetsboken. Inget är speciellt med variabelnamnet WkSht; du kan använda vilket variabelnamn du vill.
Koden går igenom varje kalkylblad och bestämmer ett tomt ark genom att räkna de icke-tomma cellerna. Om antalet är noll är arket tomt och det raderas. Lägg märke till att DisplayAlerts-inställningen är avstängd medan loopen gör sitt. Utan det påståendet dyker Excel upp en varning varje gång ett ark är på väg att raderas.
Om alla kalkylblad i arbetsboken är tomma får du ett felmeddelande när Excel försöker ta bort det enda bladet. Normalt skulle du skriva kod för att hantera den situationen.
Här är ett annat exempel för varje nästa. Den här proceduren använder en loop för att dölja alla kalkylblad i den aktiva arbetsboken utom det aktiva bladet.
Sub HideSheets()
Dim Sht Som arbetsblad
För varje Sht i ActiveWorkbook.Worksheets
Om Sht.Name <> ActiveSheet.Name Då
Sht.Visible = xlSheetHidden
Avsluta om
Nästa Sht
Avsluta Sub
Proceduren HideSheets kontrollerar arknamnet. Om det inte är samma som det aktiva arkets namn är arket dolt. Observera att egenskapen Visible inte är boolesk. Den här egenskapen kan faktiskt anta vilket som helst av tre värden, och Excel har tre inbyggda konstanter. Om du är nyfiken på den tredje möjligheten (xlVeryHidden), kolla hjälpsystemet.
Det som döljs måste så småningom döljas, så här är ett makro som visar alla kalkylblad i den aktiva arbetsboken:
Sub UnhideSheets()
Dim Sht Som arbetsblad
För varje Sht i ActiveWorkbook.Worksheets
Sht.Visible = xlSheetVisible
Nästa Sht
Avsluta Sub
Inte överraskande kan du skapa kapslade For Every-Next-loopar. Proceduren CountBold går igenom varje cell i det använda intervallet på varje kalkylblad i varje öppen arbetsbok och visar antalet celler som är formaterade som fetstil:
Sub CountBold()
Dim WBook Som arbetsbok
Dimma WSheet som arbetsblad
Dim cell som intervall
Dim Cnt As Long
För varje WBook i arbetsböcker
För varje WSark i WBook.Worksheets
För varje cell i WSheet.UsedRange
Om Cell.Font.Bold = True då Cnt = Cnt + 1
Nästa cell
Nästa WSark
Nästa WBook
MsgBox Cnt & "fet celler hittades"
Avsluta Sub