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.
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Exemple 1 (bis) (code seul simplifié)
Parcours simple des cellules d'une Colonne déterminée, ligne après ligne
Exemple 2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Parcours simple des cellules d'une Ligne déterminée, colonne après colonne
Exemple 3
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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
Exemple 4
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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.
Exemple 5
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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 :
Exemple 6
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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.
Split
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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 :
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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Exemple :
(A compléter)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Partager