Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Boucles pour parcourir une colonne, une ligne, une plage de données
Deux nouvelles méthodes

Le , par ouskel'n'or

0PARTAGES

17  0 
Question récurrente s'il en est : "Comment parcourir une colonne, une ligne, une plage de cellules ?"
Réponse certainement données dans la FAQ, je viens cependant proposer deux méthodes, celle utilisant la/les boucles For ... Next et celle utilisant la boucle For each ... Next

Exemple 1
Parcours simple des cellules d'une colonne donnée, ici la colonne 1, à l'aide d'une boucle For ... Next sur le numéro de ligne de la colonne.
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Sub For_X_to_Next_Colonne()
Dim FL1 As Worksheet, Cell As Range, NoCol As Integer
Dim NoLig As Long, DerLig As Long, Var As Variant

    'Instance de la feuille qui permet d'utiliser FL1 partout dans
    'le code à la place du nom de la feuille
    Set FL1 = Worksheets("Feuil2")
    
    'Détermine la dernière ligne renseignée de la feuille de calculs
    '(Voir explication sur l'utilisation de Split en bas de cette discussion)
    DerLig = Split(FL1.UsedRange.Address, "$")(4)
    
    'Fixe le N° de la colonne à lire
    NoCol = 1
    
    'Utilisation du N° de ligne dans une boucle For ... Next
    For NoLig = 1 To DerLig
        Var = FL1.Cells(NoLig, NoCol)
        
        'Pour tester : Affiche les variables dans la fenêtre Exécution de VBA
        Debug.Print Var
    Next
    Set FL1 = NoThing
End Sub
La même procédure est utilisable pour lire les données d'une colonne ligne par ligne, ou pour lire les donnée d'une ligne colonne par colonne

Exemple 1 (bis) (code seul simplifié)
Parcours simple des cellules d'une Colonne déterminée, ligne après ligne
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
Sub For_X_to_Next_Ligne()
Dim FL1 As Worksheet, NoCol As Integer
Dim NoLig As Long, Var As Variant
    Set FL1 = Worksheets("Feuil2")
    NoCol = 1 'lecture de la colonne 1
    For NoLig = 1 To Split(FL1.UsedRange.Address, "$")(4)
        Var = FL1.Cells(NoLig, NoCol)
    Next
    Set FL1 = NoThing
End Sub
Exemple 2
Parcours simple des cellules d'une Ligne déterminée, colonne après colonne
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
Sub For_X_to_Next_Colonne()
Dim FL1 As Worksheet, Cell As Range, NoCol As Integer
Dim NoLig As Long, Var As Variant
    Set FL1 = Worksheets("Feuil2")
    NoLig = 5 'Lecture de la ligne 5
    '(Voir explication sur l'utilisation de Split en bas de cette discussion)
    For NoCol = 1 To Columns(Split(FL1.UsedRange.Address, "$")(3)).Column
        Var = FL1.Cells(NoLig, NoCol)
    Next
    Set FL1 = NoThing
End Sub
Exemple 3
Seconde méthode utilisable : La foucle For each ... Next
L'exemple ci-dessous lit chaque cellule d'une seule colonne
NoCol1 = 1 ; NoCol2 = 1

On constate immédiatement que le code suivant est plus lourd que les précédents (Exemple 1 et 2)
S'il est donné malgré tout c'est afin de conduire aux exemples suivants en abordant la notion de plage de données
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Sub For_Each_Next_Colonne()
Dim FL1 As Worksheet, Cell As Range, NoCol1 As Integer, NoCol2 As Long
Dim DerLig As Long, Plage As Range
'Les données récupérées
Dim Var1, Var2, Var3, adres As String, NoLig As Long, NoCol As Integer
    'Instance de la feuille : Permet d'utiliser FL1 partout dans ...
    '... le code à la place de Worksheets("Feuil2")
    Set FL1 = Worksheets("Feuil2")
    
    'Fixe le N° de première colonne de la plage à lire
    NoCol1 = 1
    
    'Fixe le N° de la dernière colonne de la plage à lire
    NoCol2 = 1
    
    'Détermine la dernière ligne renseignée de la feuille de calculs
    DerLig = Split(FL1.UsedRange.Address, "$")(4)
    
    'où FL1.Range(FL1.Cells(1, NoCol1), FL1.Cells(Derlig, NoCol2)) détermine
    'la plage de cellules à lire
    
    With FL1
        Set Plage = .Range(FL1.Cells(1, NoCol1), FL1.Cells(DerLig, NoCol2))
        'Utilisation de l'objet range (Cell) dans une boucle For Each... Next
        For Each Cell In Plage
        
            '*** Récupération des valeurs de plusieurs cellule ***
            'Valeur de la cellule lue
            Var1 = Cell.Value
            'Valeur de la cellule de la même ligne, colonne NoCol + 1
            Var2 = Cell.Offset(0, 1)
            'Valeur de la cellule de la même ligne, colonne NoCol + 2
            Var3 = Cell.Offset(0, 2)
            
            '*** Récupération de l'adresse de la cellule lue ***
            'Adresse complète
            adres = Cell.Address
            'Numéro de ligne
            NoLig = Cell.Row
            'Numéro de colonne
            NoCol = Cell.Column
            
            'Pour tester : Affiche les variables dans la fenêtre Exécution de VBA
            Debug.Print adres & " " & NoLig & " " & NoCol & " "
            Debug.Print Var1 & " " & Var2 & " " & Var3
        Next
    End With
    Set FL1 = NoThing
    Set Plage = NoThing
End Sub
Exemple 4
La même méthode permet de parcourir chaque cellule d'une plage de données.

L'exemple ci-après lit les cellules d'une plage de données prè-déterminée
Exemple :
Adresse de la plage : "B3:E15"

Les données seront lues colonne après colonne pour une ligne, puis ligne après ligne :
Ligne1, Colonne1 ; Ligne1, Colonne2 ; Ligne1, Colonne3 ; ... puis
Ligne2, Colonne1 ; Ligne2, Colonne2 ; Ligne2, Colonne3 ; ...
etc.

Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub For_Each_Next_Plage()
Dim FL1 As Worksheet, Cell As Range, Plage As Range
Dim Var1

    Set FL1 = Worksheets("Feuil2")
    With FL1
        'Détermination de la plage de cellules à lire
        'Peut s'écrire en utilisant l'objet range de la plage
        'For Each Cell In .Range("B3:E15")

        'ou en utilisant l'objet Plage (range) de la plage
        Set Plage = .Range("B3:E15")
        For Each Cell In Plage
        
            'Valeur de la cellule lue
            Var1 = Cell.Value
        Next
    End With
    Set FL1 = NoThing
    Set Plage = NoThing
End Sub
Exemple 5
L'exemple suivant, utilise la propriété UsedRange pour lire toutes les cellules de la plage de données d'une feuille de calculs
Ici aussi, les données sont lues colonne après colonne pour une ligne, puis ligne après ligne :
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
Sub For_Each_Next_UsedRange()
Dim FL1 As Worksheet, Cell As Range
    Set FL1 = Worksheets("Feuil2")
    With FL1
        'Utilisation de la propriété UsedRange dans une boucle For Each... Next
        For Each Cell In .UsedRange
            Var1 = Cell.Value
        Next
    End With
    Set FL1 = NoThing
End Sub
Exemple 6
Cet exemple réalise la même opération en utilisant deux boucles imbriquées
pour une lecture colonne après colonne pour une ligne, puis ligne après ligne.
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub For_Next_Plage()
Dim FL1 As Worksheet, Cell As Range, NoCol As Integer, NoLig As Long
Dim DerLig As Long, DerCol As Integer, Var As Variant

    Set FL1 = Worksheets("Feuil2")
    
    'Détermine la dernière ligne renseignée de la feuille de calculs
    DerLig = Split(FL1.UsedRange.Address, "$")(4)
    
    'Détermine la dernière colonne renseignée de la feuille de calculs
    DerCol = Columns(Split(FL1.UsedRange.Address, "$")(3)).Column
    
    For NoLig = 1 To DerLig
        For NoCol = 1 To DerCol
            Var = FL1.Cells(NoLig, NoCol)
        Next
    Next

End Sub
Split
Une explication sur l'utilisation de Split(FL1.UsedRange.Address, "$"(4) :

Worksheets("Feuil1".UsedRange.address donne l'adresse de la plage de données sous la forme "A1:" & DernièreColonne & dernièreLigne"
Par exemple "$A$1:$H$75"
En réalité on utilisera Split(Worksheets("Feuil1".UsedRange.address, "$" ou Split(FL1.UsedRange.address, "$"

En utilisant "$" comme séparateur de données, Split("$A$1:$H$75", "$" crée un tableau de taille 5 (0 à 4) de cette adresse
Exemple :
Code : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
11
12
Sub Ex1()
Dim adres As Variant, DerCol As Variant, DerLig As Long
    adres = Split("$A$1:$H$75", "$")
    adres(0) = ""
    adres(1) = "A"
    adres(2) = "1"
    adres(3) = "H"
    adres(4) = "75"
    'donne
    MsgBox Split("$A$1:$H$75", "$")(4) 'Dernière ligne = 75
    MsgBox Columns(Split("$A$1:$H$75", "$")(3)).Column 'Dernière colonne (H) que Columns convertit en numéro (8)
End Sub
De même, en utilisant ":" comme séparateur, on obtient un tableau de taille 2 (0 à 1) contenant les adresses de début et de fin de plage
Exemple :
Code : Sélectionner tout
1
2
3
4
5
6
7
Sub Ex2()
Dim adres As Variant, Ad1 As String, Ad2 As String
    adres = Split("$A$12:$F$75", ":")
    'donne
    MsgBox Split("$A$12:$F$75", ":")(0)   '= $A$12
    MsgBox Split("$A$12:$F$75", ":")(1)   '= $F$75
End Sub
(A compléter)

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de casefayere
Expert éminent https://www.developpez.com
Le 05/04/2012 à 11:43
Bonjour à tou(te)s, ouskel'n'or,

Une façon inédite (pour moi) de parcourir les cellules avec Split, Bravo !

Cordialement,
2  0 
Avatar de hunteshiva
Membre expérimenté https://www.developpez.com
Le 05/04/2012 à 8:29
Bonjour,

super le code que tu a laissé, il m'aide beaucoup

par contre une partie que je ne comprend pas,
Code : Sélectionner tout
1
2
'Dernière colonne (H) que Columns convertit en numéro (8)
MsgBox Columns(Split("$A$1:$H$75", "$")(3)).Column
la fonction "Columns" n’existe pas chez moi
1  0