VBA admet un altre tipus de bucle a Excel 2016: bucle a través de cada objecte d'una col·lecció d'objectes. Una col·lecció, com ja sabeu, consta d'una sèrie d'objectes del mateix tipus. Per exemple, Excel té una col·lecció de tots els llibres de treball oberts (la col·lecció Workbooks) i cada llibre de treball té una col·lecció de fulls de treball (la col·lecció Worksheets).
Quan necessiteu recórrer cada objecte d'una col·lecció, utilitzeu l'estructura For Each-Next. L'exemple següent repassa cada full de treball del llibre de treball actiu i suprimeix el full de treball si està buit:
Sub DeleteEmptySheets()
Dim WkSht com a full de treball
Application.DisplayAlerts = Fals
Per a cada WkSht a ActiveWorkbook.Fulls de treball
Si WorksheetFunction.CountA(WkSht.Cells) = 0, aleshores
WkSht.Delete
Acaba si
Següent WkSht
Application.DisplayAlerts = Veritable
End Sub
En aquest exemple, la variable WkSht és una variable d'objecte que representa cada full de treball del llibre de treball. No hi ha res especial sobre el nom de la variable WkSht; podeu utilitzar qualsevol nom de variable que vulgueu.
El codi passa per cada full de treball i determina un full buit comptant les cel·les no en blanc. Si aquest recompte és zero, el full està buit i s'elimina. Tingueu en compte que el paràmetre DisplayAlerts està desactivat mentre el bucle està fent el seu. Sense aquesta declaració, Excel apareix un avís cada vegada que s'està a punt de suprimir un full.
Si tots els fulls de treball del llibre de treball estan buits, obteniu un error quan Excel intenta suprimir l'únic full. Normalment, escriureu codi per gestionar aquesta situació.
Aquí hi ha un altre exemple de For Each-Next. Aquest procediment utilitza un bucle per ocultar tots els fulls de treball del llibre de treball actiu excepte el full actiu.
Sub Hidesheets()
Dim Sht com a full de treball
Per a cada Sht a ActiveWorkbook.Fulls de treball
Si Sht.Name <> ActiveSheet.Name Aleshores
Sht.Visible = xlSheetHidden
Acaba si
Següent Sht
End Sub
El procediment HideSheets comprova el nom del full. Si no és el mateix que el nom del full actiu, el full s'amaga. Tingueu en compte que la propietat Visible no és booleana. Aquesta propietat pot prendre qualsevol dels tres valors, i Excel proporciona tres constants integrades. Si teniu curiositat sobre la tercera possibilitat (xlVeryHidden), consulteu el sistema d'ajuda.
El que s'amaga s'ha de mostrar finalment, així que aquí hi ha una macro que mostra tots els fulls de treball del llibre de treball actiu:
Sub Mostra Fulls ()
Dim Sht com a full de treball
Per a cada Sht a ActiveWorkbook.Fulls de treball
Sht.Visible = xlSheetVisible
Següent Sht
End Sub
No en va, podeu crear bucles For Each-Next imbricats. El procediment CountBold recorre cada cel·la de l'interval utilitzat de cada full de treball de cada llibre de treball obert i mostra un recompte del nombre de cel·les que tenen el format en negreta:
Sub CountBold()
Dim WBook com a llibre de treball
Dim WSheet com a full de treball
Dim Cell As Range
Dim Cnt As Long
Per a cada WBook dels llibres de treball
Per a cada WSheet a WBook.Fulls de treball
Per a cada cel·la de WSheet.UsedRange
Si Cell.Font.Bold = True Aleshores Cnt = Cnt + 1
Cel·la següent
Següent WSheet
Següent WBook
MsgBox Cnt & "S'han trobat cel·les en negreta"
End Sub