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.

49
demandé sur 0m3r 2010-10-06 21:48:53

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
78
répondu Dick Kusleika 2010-10-06 18:13:01

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
12
répondu code4life 2010-10-06 20:07:57

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:

http://technet.microsoft.com/en-us/library/ee692882.aspx

2
répondu Mark Avenius 2017-05-23 12:26:20

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
0
répondu Nielsvh 2015-12-09 00:37:12