Copier / Coller avec des cellules en variables
Bonjour,
Je suis débutant avec VBA sur Excel et de ce fait j'ai un petit problème .
J'effectue dans mon code une boucle qui permet de copier la valeur d'une cellule (à condition que celle-ci soit différente de 0) vers une autre cellule ; et ce pour plusieurs cellules (d'où la boucle).
Le premier passage dans la boucle copie/colle bien ce que je souhaite, mais au second passage le code plante et ne copie/colle rien.
Or le test me montre qu'avant de planter le code reboucle bien mais refuse d'exécuter ma commande de copier/coller.
D'où l'erreur peut-elle provenir ?
Mon code ci-dessous pour plus de clarté.
Merci par avance
Erwan
Sub test()
Dim ToCopy As Variant
Dim ToPaste As Variant
Set ToCopy = Sheets("Aide macro").Range("B2")
Set ToPaste = Sheets("Test").Range("C27")
While ToCopy <> ""
If ToCopy <> 0 Then 'copier la cellule si celle-ci n'a pas la valeur de "0", puis passer à la suivante
'test :
MsgBox ToCopy & " " & ToPaste
ToCopy.Copy ToPaste 'commande qui me pose problème lors du second passage dans la boucle
'test :
MsgBox ToCopy & " " & ToPaste
ToCopy = ToCopy.Offset(0, 1)
ToPaste = ToPaste.Offset(0, 1)
Else
'si la cellule a la valeur de "0", aller à la suivante sans rien copier
ToCopy = ToCopy.Offset(0, 1)
ToPaste = ToPaste.Offset(0, 1)
End If Wend
End Sub
- Messages
- 1'794
- Excel
- 2010
- Inscrit
- 25/08/2014
- Emploi
- Consultant VB6 / SQL / VBA / Excel / Access
Bonsoir,
En typant les données, on dirait que ça passe :
Dim ToCopy As Range
Dim ToPaste As RangePour l'explication c'est un peu plus complexe :
En ne typant pas les variables (ou type "variant", qui revient au même), vba se débrouille tout seul pour typer la variable.
Au premier passage, le compilateur reconnaît que ToCopy est de type Range
Set ToCopy = Sheets("Aide macro").Range("B2")Après l'instruction suivante, il modifie le type de ToCopy en "string"
ToCopy = ToCopy.Offset(0, 1)Pourquoi ?
L'instruction est interprété comme
ToCopy = ToCopy.Offset(0, 1).ValueDonc ToCopy devient du string
Au passage suivant,
"ToCopy.Copy"
ne compile plus : la méthode "Copy" n'existe pas pour un string
D'où l'intérêt de bien typer explicitement ses variables
Et aussi de préciser ".value" quand on veut récupérer la valeur du Range, même si par défaut Range("toto") est le raccourci de Range("toto").Value
Pour mettre en évidence tout ça, il suffit de faire du "pas à pas" et taper dans la fenêtre d'exécution "? typename(ToCopy )"
On verra que le type est modifié en cours de route
J'espère avoir pu expliquer clairement la cause du pb qui dans le cas présent semble inexplicable
Bonne soirée
Bouben
Merci beaucoup pour ces explications.
Je ne pensais pas que d'être explicite en déclarant les variables était aussi important en VBA.
Le code fonctionne très bien à présent.
Merci
Erwan