Disons que j'ai le code suivant:
Sub TestRangeLoop()
Dim rng As Range
Set rng = Range("A1:A6")
''//Insert code to loop through rng here
End Sub
Je veux pouvoir parcourir une collection d'objets Range
pour chaque cellule spécifiée dans rng
. Sur le plan conceptuel, j'aimerais le faire comme suit:
For Each rngCell As Range in rng
''//Do something with rngCell
Next
Je sais que je pourrais résoudre ce problème en analysant rng.Address
et en construisant manuellement des objets Range
, mais j'espère qu'il existe un moyen plus direct de ne pas utiliser l'analyse syntaxique des chaînes.
Sub LoopRange()
Dim rCell As Range
Dim rRng As Range
Set rRng = Sheet1.Range("A1:A6")
For Each rCell In rRng.Cells
Debug.Print rCell.Address, rCell.Value
Next rCell
End Sub
Vous pouvez utiliser Range.Rows
, Range.Columns
ou Range.Cells
. Chacune de ces collections contient des objets Range
.
Voici comment modifier l'exemple de Dick pour utiliser Rows
:
Sub LoopRange()
Dim rCell As Range
Dim rRng As Range
Set rRng = Sheet1.Range("A1:A6")
For Each rCell In rRng.Rows
Debug.Print rCell.Address, rCell.Value
Next rCell
End Sub
Et Columns
:
Sub LoopRange()
Dim rCell As Range
Dim rRng As Range
Set rRng = Sheet1.Range("A1:A6")
For Each rCol In rRng.Columns
For Each rCell In rCol.Rows
Debug.Print rCell.Address, rCell.Value
Next rCell
Next rCol
End Sub
Pour noter la réponse de Dick, c'est correct, mais je ne recommanderais pas d'utiliser une boucle For Each. For Each crée une référence temporaire à la cellule COM dans les coulisses auxquelles vous n'avez pas accès (et dont vous auriez besoin pour en disposer).
Voir ce qui suit pour plus de discussion:
Comment nettoyer correctement les objets d'interopérabilité Excel?
Pour illustrer le problème, essayez l'exemple For Each, fermez votre application et consultez le Gestionnaire des tâches. Vous devriez voir qu'une instance d'Excel est toujours en cours d'exécution (car tous les objets n'ont pas été éliminés correctement).
Une façon plus simple de gérer cela consiste à interroger la feuille de calcul à l'aide d'ADO:
Je ressuscite les morts ici, mais comme une plage peut être définie comme "A: A", utiliser une boucle pour chaque boucle aboutit à une boucle potentielle infinie. Autant que je sache, la solution consiste à utiliser la boucle Do Until
.
Do Until Selection.Value = ""
Rem Do things here...
Loop