Boucle à travers chaque cellule dans une gamme de cellules lorsqu'on lui donne un objet de gamme
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 itérer à travers 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 Range
manuellement, mais j'espère qu'il y a un moyen plus direct qui n'implique pas l'analyse de chaîne de caractères.
4 réponses
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 vous pouvez modifier L'exemple de Dick pour travailler avec 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 faire une note sur la réponse de Dick, c'est correct, mais je ne recommande pas d'utiliser un pour chaque boucle. Pour chaque crée une référence temporaire à la cellule COM dans les coulisses que vous n'avez pas accès à (que vous auriez besoin afin de disposer de lui).
Voir la suite pour plus de discussion:
Comment nettoyer correctement les objets Excel interop?
pour illustrer la question, essayer le Pour chaque exemple, fermez votre application, et regardez le Gestionnaire des tâches. Vous devriez voir qu'une instance D'Excel est toujours en cours d'exécution (parce que tous les objets n'ont pas été éliminés correctement).
une façon plus propre de gérer ceci est d'interroger la feuille de calcul en utilisant ADO:
je ressuscite les morts ici, mais parce qu'une portée peut être définie comme "A:A", En Utilisant a pour chaque boucle se termine avec une boucle infinie potentielle. La solution, pour autant que je sache, est d'utiliser la boucle Do Until
.
Do Until Selection.Value = ""
Rem Do things here...
Loop