web-dev-qa-db-fra.com

Boucle à travers chaque cellule dans une plage de cellules lorsqu'un objet Range est attribué

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.

49
Ben McCormack
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
80
Dick Kusleika

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
13
code4life

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:

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

3
Mark Avenius

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
0
Nielsvh