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

Bonsoir,

En typant les données, on dirait que ça passe :

Dim ToCopy As Range
Dim ToPaste As Range

Pour 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).Value

Donc 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

Rechercher des sujets similaires à "copier coller variables"