Problème étrange : manque de rigueur de VBA ?
Bonjour,
je vous contacte car j'ai un problème étrange sur lequel je bute depuis hier. C'est un problème qui semble très simple et malgré le fait que je connais désormais très bien le VBA, les notions d'objet et l'architecture objet VBA (du moins normalement), je ne parviens pas à comprendre l'erreur que je fais (à supposer que je fasse une erreur d'ailleurs, c'est pourquoi je soupçonne un éventuel manque de rigueur de VBA...à vous de me dire)
Voici mon problème posé sous forme d'Exemple Complet Minimal. Dans un classeur vide, je fais un tableau 4*6 dans la plage "A1:F4" :
Colonne 1 Colonne 2 Colonne 3 Colonne 4 Colonne 5 Colonne 6
Cellule 1;1 Cellule 1;2 Cellule 1;3 Cellule 1;4 Cellule 1;5 Cellule 1;6
Cellule 2;1 Cellule 2;2 Cellule 2;3 Cellule 2;4 Cellule 2;5 Cellule 2;6
Cellule 3;1 Cellule 3;2 Cellule 3;3 Cellule 3;4 Cellule 3;5 Cellule 3;6
Puis je fais une première Sub dans ma feuil1 :
Code:
1 2 3 4 5 6 7 8 9
| Sub toto()
Dim plage As Range
Set plage = Range("A1:F4")
Dim ligne As Range
For Each ligne In plage.Rows
Debug.Print ligne.Address
Next ligne
End Sub |
Cette Sub ne fait rien d'intéressant, c'est juste pour poser le problème bien entendu. Naturellement, cette Macro m'affiche (dans la fenêtre Exécution) :
$A$1:$F$1
$A$2:$F$2
$A$3:$F$3
$A$4:$F$4
Très bien, c'est ce qu'on attendait. Maintenant, je fais une deuxième Sub :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| Sub toto2()
Dim ligne As Range
Set ligne = Range("$A$1:$F$1")
Debug.Print "La première cellule de la ligne contient : " & ligne.Item(1).Text & ". La deuxième cellule de la ligne contient : " & ligne.Item(2).Text
Set ligne = Range("$A$2:$F$2")
Debug.Print "La première cellule de la ligne contient : " & ligne.Item(1).Text & ". La deuxième cellule de la ligne contient : " & ligne.Item(2).Text
Set ligne = Range("$A$3:$F$3")
Debug.Print "La première cellule de la ligne contient : " & ligne.Item(1).Text & ". La deuxième cellule de la ligne contient : " & ligne.Item(2).Text
Set ligne = Range("$A$4:$F$4")
Debug.Print "La première cellule de la ligne contient : " & ligne.Item(1).Text & ". La deuxième cellule de la ligne contient : " & ligne.Item(2).Text
End Sub |
Je déclare un objet de type Range que je nomme ligne et le lui fais successivement désigner la ligne 1, 2, 3, 4 de mon tableau. Autrement dit, je parcours les mêmes plages que mon For Each de la Sub précédente. Naturellement et conformément à nos attentes, la Macro m'affiche dans la fenêtre Exécution :
La première cellule de la ligne contient : Colonne 1. La deuxième cellule de la ligne contient : Colonne 2
La première cellule de la ligne contient : Cellule 1;1. La deuxième cellule de la ligne contient : Cellule 1;2
La première cellule de la ligne contient : Cellule 2;1. La deuxième cellule de la ligne contient : Cellule 2;2
La première cellule de la ligne contient : Cellule 3;1. La deuxième cellule de la ligne contient : Cellule 3;2
Où est le problème alors, allez-vous me dire ?
Le problème est que si j'essaie de combiner mes deux macro pour afficher le contenu des cellules comme dans la Sub toto2 tout en utilisant un For Each comme dans la Sub toto1, eh bien...ça ne marche pas :
Code:
1 2 3 4 5 6 7 8 9 10
| Sub toto3()
Dim plage As Range
Set plage = Range("A1:F4")
Dim ligne As Range
For Each ligne In plage.Rows
'Debug.Print ligne.Address
Debug.Print "La première cellule de la ligne contient : " & ligne.Item(1).Text & ". La deuxième cellule de la ligne contient : " & ligne.Item(2).Text
Next ligne
End Sub |
Cette Macro m'affiche dans la fenêtre Exécution :
La première cellule de la ligne contient : . La deuxième cellule de la ligne contient :
La première cellule de la ligne contient : . La deuxième cellule de la ligne contient :
La première cellule de la ligne contient : . La deuxième cellule de la ligne contient :
La première cellule de la ligne contient : . La deuxième cellule de la ligne contient :
Alors, qui est-ce qui manque de rigueur ? VBA ou le programmeur (ie moi) ?