Macro copier collé

bonsoir à tous,

après moult recherche sur internet je n'ai toujours pas compris un problème qu'il y a sur ma macro qui fait qu'elle ne se lance pas.

Donc je viens vers vous pour m'aider à régler se problème.

Mon souhait à la base est dans une feuille écrire dans les cellules des données puis en appuyant sur un bouton valider qui lance une macro qui à son tour va copier les valeurs dans les cellules dans d'autres cellules d'une autre page, et a chaque fois que je clique sur le bouton les valeurs sont placé une ligne en dessous des précédentes (c'est pour archiver mes données) et donc voici ma macro , je suis un débutant et je m'aide beaucoup d'internet.

Le soucis c'est que quand je clique excel me dit ' erreur 13' incompatibilité de type et me surligne le Set

Je vous remercie pour votre aide

Sub classement2()

Dim R As Long

Dim SH As Worksheets

Dim SH1 As Worksheets

Set SH = ThisWorkbook.Worksheets("Argent")

Set SH1 = ThisWorkbook.Worksheets("tableau")

With SH1

R = Range("B").End(x1down).Row + 1

Range("B" & R) = SH.Range("B3")

R = Range("C").End(x1down).Row + 1

Range("C" & R) = SH.Range("C3")

R = Range("D").End(x1down).Row + 1

Range("D" & R) = SH.Range("D3")

R = Range("E").End(x1down).Row + 1

Range("E" & R) = SH.Range("E3")

R = Range("F").End(x1down).Row + 1

Range("F" & R) = SH.Range("F3")

End With

End Sub

Bonjour,

C'est tout simple : tu déclares des variables de type Worksheets !

Worksheets est une collection de feuille d'un classeur. Tu veux affecter une feuille à la variable, il te dis non, incompatibilité de type, tu peux affecter toutes les feuilles en tant que collection mais pas une seule !

Il te faut donc déclarer une variable de type Worksheet.

Mais ça ne s'arrête pas là, tu aurais eu une autre erreur à la suite : dans ton paramètre x1down, curieusement ton l est devenu un 1 (chiffre 1), VBA ne s'y serait pas retrouvé !

Le fait que le d de down n'ait pas été passé en majuscule automatiquement par VBA aurait dû t'alerter... !

D'autre part Range("B") n'est pas une syntaxe correcte, et pourra produire des surprises, de même que la recherche avec xlDown ne donnera pas le bon résultat s'il n'y a qu'une ligne servie au début. Mieux vaut y préférer xlUp plus sûr dans ce cas.

Ensuite, si tu mets une feuille sous bloc With, inutile de l'affecter préalablement à une variable si la variable ne joue pas d'autre rôle, cela fait double-emploi. Mais ayant mis la feuille sous bloc With, si tu ne mets pas de point devant tous tes Range pour les faire référer à la feuille, autant cracher en l'air...

Enfin, tu sers des lignes ! tu ne vas donc pas rechercher l'emplacement de la dernière ligne pour chaque colonne, une fois suffit pour définir le numéro de ligne que tu sers...

Une fois ces corrections faites, voilà ce que devient ta procédure :

Sub classement2()
    Dim R As Long, SH As Worksheet
    Set SH = Worksheets("Argent")
    With Worksheets("tableau")
        R = .Range("B" & .Rows.Count).End(xlUp).Row + 1
        .Range("B" & R) = SH.Range("B3")
        .Range("C" & R) = SH.Range("C3")
        .Range("D" & R) = SH.Range("D3")
        .Range("E" & R) = SH.Range("E3")
        .Range("F" & R) = SH.Range("F3")
    End With
 End Sub

Je te laisse déjà digérer ça mais ça fait un peu répétitif et on peut l'éviter, je reviens donc avec une aménagement en conséquence.

Cordialement.

La première chose qui vient à l'idée est naturellement que, tes colonnes se suivant, on peut faire une boucle !

On déclare donc une variable comme compteur de boucle, et on utilisera Cells au lieu de Range de façon à utiliser les numéros de colonnes au lieu des lettres...

Sub classement2()
    Dim R As Long, SH As Worksheet, i As Integer
    Set SH = Worksheets("Argent")
    With Worksheets("tableau")
        R = .Range("B" & .Rows.Count).End(xlUp).Row + 1
        For i = 2 To 6
            .Cells(R, i) = SH.Cells(3, i)
        Next i
    End With
 End Sub

Voilà ! Cela a déjà meilleure allure et on aura gagné un tout petit peu de temps avec la boucle, mais on aurait été inspiré de réfléchir un peu plus !

On affecte en effet les valeur d'une plage B3:F3 d'une feuille à une plage de même taille d'une autre feuille. Et ça on peut le faire en seul coup !!

Sub classement2()
    Dim R As Long, SH As Worksheet
    Set SH = Worksheets("Argent")
    With Worksheets("tableau")
        R = .Range("B" & .Rows.Count).End(xlUp).Row + 1
        .Range("B" & R & ":F" & R).Value = SH.Range("B3:F3").Value
    End With
 End Sub

Là on a un gain indéniable en rapidité et on a raccourci le code... On peut écrire la définition de la plage de réception d'un autre façon si on veut éviter de se mélanger avec la succession de & :

       .Range("B" & R).Resize(, 5).Value = SH.Range("B3:F3").Value

Bonne continuation.

Cordialement.

Je vous remercie pour votre aide et vos conseils, pour le down a vrai dire je ne m'en étais même pas rendu compte tellement j'ai été absorbé par mob soucis avec le set et les points au niveau de range j'avoue c'est parce que je me suis complètement mélangé les pinceaux dans ma recherche de solution, je me doutais que ma façon de faire était caduque en tant que debutant voir novice en la matière , je tiens encore a vous remercier d'avoir pris le temps de m'expliquer et d'avoir corriger mes erreurs

Rechercher des sujets similaires à "macro copier colle"