Problème de copier/coller

bonjour à toutes et à tous,

J'ai un fichier complexe avec beaucoup de macros que je ne peux joindre ici par souci de confidentialité.

Cette macro avait pour vocation d'aller récupérer des données à un endroit précis d'un feuille du classeur pour aller les insérer sur une autre feuille du même classeur. J'obtiens depuis deux jours le message 'la méthode paste de la classe range a échoué"

Cette macro est la suivante :

ThisWorkbook.Sheets("données").Activate

Range("D116:G136").Copy

ThisWorkbook.Sheets("valeurs").Select

ActiveSheet.Range("A65536").End(xlUp).Select

With Selection

.Paste

End With

Nota :

j'ai fait un extrait de mon fichier que je joins pour info

Merci de votre aide

14essai.xlsm (20.36 Ko)

bonjour

dans un système Excel (plusieurs fichiers et/ou plusieurs feuilles) il faut éviter de faire des copier/coller (imitant l'usage du papier et du crayon, époque où on recopiait beaucoup)

il vaut mieux faire des collages avec liaisons

ou des formules pour extraire les données intéressantes

évitons le VBA

bonjour,

Je suis pas très a l'aise en vba et je veux juste recopier une valeur d'un classeur (fermé) dans un autre.

j'ai code ce qui suis :

datedudevis = Workbooks(chemin & "DEVIS\" & nomdedevis & ".xlsx").Sheets("feuille1").Range("H8")

FileCopy chemin & "DEVIS\" & nomdedevis & ".xlsx", chemin & "FACTURE\" & nomdefacture & ".xlsx"

Workbooks.Open Filename:=chemin & "FACTURE\" & nomdefacture & ".xlsx"

Ce doit être un problème d’écriture car le chemin est bon j'arrive a faire le copy de la 2eme ligne.

je vais passer par un copier/coller car je ne comprend pas.

Merci si y'a une erreur énorme

Cordialement Jany

Bonjour,

Salut jmd !

J'obtiens depuis deux jours le message 'la méthode paste de la classe range a échoué"

Depuis seulement deux jours ? !!! Comme la classe Range n'a pas de méthode Paste... !

Une erreur sur un code aussi indigent [ 1 Activate + 2 Select + 1 Selection et en 5 lignes !!!! ] Alors erreur, c'est bien le moins que je puisse te souhaiter !

En outre quand on copie et colle (alors qu'on peut l'éviter en VBA ! ) il convient de se documenter un minimum sur l'utilisation correcte de la méthode...

Et le code de ton classeur n'est pas mieux écrit, au surplus incorrectement indenté (ça c'est pour le lecteur, VBA s'en fout ! mais moi je supporte pas... )

Et pour l'anecdote, vbYes est une constante numérique, qui vaut 6, donc pas une donnée String !

Bon ! Pour résumer, lorsqu'on travaille en manuel on n'a que clavier et souris pour agir (habituellement) donc on clique et on sélectionne pour réaliser une action sur l'objet de la sélection. Lorsqu'on demande à VBA de faire, on devrait avoir la décence de lui permettre d'utiliser ses moyens propres au lieu de lui attacher un boulet au pied en l'obligeant à sélectionner à tour de bras... c'est tout à fait inconvenant !

Méthode Copie (normale)

Sub TestCopieNormale()
    With Worksheets("valeurs")
        Worksheets("données").Range("D6:G16").Copy .Range("A" & .Rows.Count).End(xlUp)(2)
    End With
End Sub

Méthode Copie valeurs

Sub TestCopieValeurs()
    Worksheets("données").Range("D6:G16").Copy
    Worksheets("valeurs").Range("A" & Rows.Count).End(xlUp)(2).PasteSpecial xlPasteValues
End Sub

Méthode sans copie (ni collage), ça que tu ne peux faire en manuel

Sub TestSansCopier()
    With Worksheets("valeurs").Range("A" & Rows.Count).End(xlUp)(2)
        .Resize(11, 4).Value = Worksheets("données").Range("D6:G16").Value
    End With
End Sub

Etoffons un peu...

Private Sub CommandButton1_Click()
    Dim PlgD As Range, n&
    If MsgBox("Etes-vous sûr de vouloir insérer les valeurs du mois de juin ?", _
     vbExclamation + vbYesNo, "Juin") = vbYes Then
        Set PlgD = Worksheets("données").Range("D6:G16")
        With Worksheets("valeurs")
            n = .Range("A" & .Rows.Count).End(xlUp).Row + 1
            .Range("A" & n).Resize(11, 4).Value = PlgD.Value
        End With
    End If
End Sub

Cordialement.

@ jany

Bonjour,

D'abord, il serait judicieux que tu ouvres ton propre sujet !

Ensuite, lorsque tu as à citer du code VBA, il est fortement souhaitable que tu prennes l'habitude de le mettre sous balises Code. tu as un bouton qui te permet de faire au-dessus de la fenêtre de rédaction... Utilise-le, cela améliorera considérablement la lecture.

S'agissant de code, il convient toujours de le copier pour le coller dans un post (et non l'écrire dans le post) pour que l'on puisse le voir tel qu'il est dans le module, avec les mises en forme automatique de VBA conservées. Si on soumet un problème concernant une procédure, il convient que la citation soit complète, une procédure commence par Sub et se termine par End Sub. Si l'on ne voit pas ces deux bornes de la déclaration, ce qu'on voit n'offre aucune certitude.

Si la procédure fait appel à des variables non déclarées dans la procédure il convient d'indiquer comment elles sont déclarées et initialisées...

Enfin, pour ce qui me concerne, je souhaite que le code soit systématiquement indenté selon des règles précises et sans ligne sautée à l'intérieur d'une procédure, c'est ce qui en permet la lecture la plus rapide !

Et si tu poses une question en suggérant une hypothèse de diagnostic, voire de solution, je te demanderai si tu as inventorié exhaustivement les éléments de ton hypothèse (l'Aide est fait pour ça : tu peux passer au peigne fin chaque ligne de code pour ne serait-ce que vérifier la syntaxe de chaque élément utilisé...) et à quel test tu as procédé...

Cordialement.

merci de vos réponses,

je vais essayer de décortiquer un peu tout ça, essayer de comprendre et d'appliquer vos conseils.

Je reviens vers vous en cas de besoin.

Merci Encore !

Un grand merci pour ses explications à MFerrand.

Ca marche super !

vraiment chapeau bas !

@ MFerrand

Merci pour les Infos et les conseils. Pour essayer d'avancer:

1-J'ai pas voulu ouvrir un autre sujet car il me semblait correspondre parfaitement.

Je reconfirme que je suis novice en vba donc aucune formalité dans l'ecriture du code.

2- Mettre le code sous balises code, je voit bien les boutons au dessus de la fenetre de redaction mais en copiant le code ca ne change pas grand chose. Peu etre est ce a l'envoi du message que la mise en forme s'effectue; J'espere donc j'envoi comme cela.

Option Explicit

Sub Creer_Facture()
' CREER FACTURE

Dim Ligne_client As Integer 'Declaration des variables
Dim NomClient As String
Dim CP As Long
Dim Ville As String
Dim Adresse As String
Dim TEL As String
Dim Contact As String
Dim email As String
Dim num_devis As Long
Static numero_facture As Integer
Dim chemin As String
Dim Facture As String
Dim nomdefacture As String
Dim nomdedevis As String
Dim a_facturer As Long
Dim datedudevis As Date
Dim Date_Val_Devis As Date
Dim Ref_Val_Devis As String
Dim init As Boolean 'b  c'est une demande d'initialisation des numeros de devis à la valeur presente dans la boucle suivante IF

   init = Cells(7, 10)     'Y a t il demande d'initialisation N° devis
   If init = True Then 'demande d'initialisation N° Facture
                    numero_facture = 17002    'Valeur d'initialisation des N° de devis 'mettre 18001 au 01/01/18)
                    init = False
                 Else: numero_facture = Cells(7, 9)
   End If

    'boite dialogue pour numero de client a faire le devis
    Ligne_client = InputBox("Numero de Ligne Client ?", "Creer un facture pour:") 'La variable reçoit la valeur entrée dans l'InputBox
        If Ligne_client > 11 Then 'Si la valeur est différente de "" on affiche le résultat
             With Worksheets("2017")
                NomClient = Cells(Ligne_client, 1)
                CP = Cells(Ligne_client, 2)
                Ville = Cells(Ligne_client, 3)
                Adresse = Cells(Ligne_client, 4)
                TEL = Cells(Ligne_client, 5)
                Contact = Cells(Ligne_client, 6)
                email = Cells(Ligne_client, 8)
                a_facturer = Cells(Ligne_client, 22)
                num_devis = Cells(Ligne_client, 18)
            End With
            MsgBox Ligne_client & " " & NomClient & " " & CP & Ville & " " & Contact & " " & " Facture N°" & numero_facture
         End If

    chemin = ThisWorkbook.Path & "\"            'Recup du chemin du fichier sur lequel on bosse TDB
    Facture = " Facture "
    nomdefacture = numero_facture & Facture & NomClient
    nomdedevis = num_devis & " Devis " & NomClient
    Date_Val_Devis = Cells(Ligne_client, 21)
    Ref_Val_Devis = Cells(Ligne_client, 20)

'Copie la plage de cellules A1:A10 dans la Feuil1
'Worksheets("Feuil1").Range("h8").Copy

'Effectue le collage dans la plage B1:B10 de la Feuil2
'Worksheets("Feuil2").Paste Destination:=Worksheets("Feuil2").Range("B1:B10")
'ou
'Worksheets("Feuil2").Paste Destination:=Worksheets("Feuil2").Range("B1")

'Permet de désactiver le presse papier
'Application.CutCopyMode = False        ===================================

 ' datedudevis = Workbooks(chemin & "DEVIS\" & nomdedevis & ".xlsx").Sheets("feuille1").Range("H8")
'========================================================================================

    FileCopy chemin & "DEVIS\" & nomdedevis & ".xlsx", chemin & "FACTURE\" & nomdefacture & ".xlsx"
    Workbooks.Open Filename:=chemin & "FACTURE\" & nomdefacture & ".xlsx"

    Worksheets("Feuille1").Activate  'activation feuille de devis a imprimer
           'Remplissage des valeurs recuperees dans TDB
    Cells(8, 8) = Date
    Cells(6, 7) = "FACTURE"
    Cells(7, 7) = "FACT. N°"
    Cells(7, 8) = numero_facture
    Cells(21, 2) = "Suivant Devis N° " & nomdedevis
    Cells(21, 6) = "du " & datedudevis
    Cells(23, 2) = "Validé par vos soins le " & Date_Val_Devis
    Cells(23, 6) = "Suivant Référence " & Ref_Val_Devis

    numero_facture = numero_facture + 1

    Workbooks("TDB new.xlsm").Sheets("2017").Cells(7, 9) = numero_facture 'memorisation N° devis
    Workbooks("TDB new.xlsm").Sheets("2017").Cells(7, 10) = init   'Memorisation initialisation

End Sub

3- J'ai collé le code CTRL-c CTRL-V

4- Avec les mises en formes


Pardon le message est parti , hors de ma volonté. Voila la suite

Par contre c'est bon il est a peu prés formaté VBA.

Pour info j'ai joint la procédure complète.

Enfin, pour ce qui me concerne, je souhaite que le code soit systématiquement indenté selon des règles précises et sans ligne sautée à l'intérieur d'une procédure, c'est ce qui en permet la lecture la plus rapide !

INDENTE décalage du texte suivant les boucles ou les actions, ??? C'est pas tres loin dans le code transmis. Les règles précises sont retrouvables ou? Ou il est possible d'avoir chacun ses règles précises... Bien sur que non mais c'est le premier code que je tape en vba donc un peu d'indulgence.

Et si tu poses une question en suggérant une hypothèse de diagnostic, voire de solution, je te demanderai si tu as inventorié exhaustivement les éléments de ton hypothèse (l'Aide est fait pour ça : tu peux passer au peigne fin chaque ligne de code pour ne serait-ce que vérifier la syntaxe de chaque élément utilisé...) et à quel test tu as procédé...

J'ai passé pas mal de temps à rechercher le défaut, je proposait juste une erreur d’écriture ou d’affectation-déclaration, car comme évoqué la ligne suivante fonctionne et le chemin pour récupérer le fichier est le même.

Je sais pas si c'est bien clair comme réponse?

Je vais peu etre attendre un retour, j'imagine qu'il va y avoir quelques remarques d'ordre général et en particulier aussi.

Merci d'avance, cordialement

@ MFerrand

Le code transmis precedement ne contient pas la ligne qui m'indique un defaut lors de la compil.

Je remet le code complet ci dessous

Option Explicit

Sub Creer_Facture()
' CREER FACTURE

Dim Ligne_client As Integer 'Declaration des variables
Dim NomClient As String
Dim CP As Long
Dim Ville As String
Dim Adresse As String
Dim TEL As String
Dim Contact As String
Dim email As String
Dim num_devis As Long
Static numero_facture As Integer
Dim chemin As String
Dim Facture As String
Dim nomdefacture As String
Dim nomdedevis As String
Dim a_facturer As Long
Dim datedudevis As Date
Dim Date_Val_Devis As Date
Dim Ref_Val_Devis As String
Dim init As Boolean 'b  c'est une demande d'initialisation des numeros de devis à la valeur presente dans la boucle suivante IF

   init = Cells(7, 10)     'Y a t il demande d'initialisation N° devis
   If init = True Then 'demande d'initialisation N° Facture
                    numero_facture = 17002    'Valeur d'initialisation des N° de devis 'mettre 18001 au 01/01/18)
                    init = False
                 Else: numero_facture = Cells(7, 9)
   End If

    'boite dialogue pour numero de client a faire le devis
    Ligne_client = InputBox("Numero de Ligne Client ?", "Creer un facture pour:") 'La variable reçoit la valeur entrée dans l'InputBox
        If Ligne_client > 11 Then 'Si la valeur est différente de "" on affiche le résultat
             With Worksheets("2017")
                NomClient = Cells(Ligne_client, 1)
                CP = Cells(Ligne_client, 2)
                Ville = Cells(Ligne_client, 3)
                Adresse = Cells(Ligne_client, 4)
                TEL = Cells(Ligne_client, 5)
                Contact = Cells(Ligne_client, 6)
                email = Cells(Ligne_client, 8)
                a_facturer = Cells(Ligne_client, 22)
                num_devis = Cells(Ligne_client, 18)
            End With
            MsgBox Ligne_client & " " & NomClient & " " & CP & Ville & " " & Contact & " " & " Facture N°" & numero_facture
         End If

    chemin = ThisWorkbook.Path & "\"            'Recup du chemin du fichier sur lequel on bosse TDB
    Facture = " Facture "
    nomdefacture = numero_facture & Facture & NomClient
    nomdedevis = num_devis & " Devis " & NomClient
    Date_Val_Devis = Cells(Ligne_client, 21)
    Ref_Val_Devis = Cells(Ligne_client, 20)

'Copie la plage de cellules A1:A10 dans la Feuil1
'Worksheets("Feuil1").Range("h8").Copy

'Effectue le collage dans la plage B1:B10 de la Feuil2
'Worksheets("Feuil2").Paste Destination:=Worksheets("Feuil2").Range("B1:B10")
'ou
'Worksheets("Feuil2").Paste Destination:=Worksheets("Feuil2").Range("B1")

'Permet de désactiver le presse papier
'Application.CutCopyMode = False        ===================================

  datedudevis = Workbooks(chemin & "DEVIS\" & nomdedevis & ".xlsx").Sheets("feuille1").Range("H8")
'========================================================================================

    FileCopy chemin & "DEVIS\" & nomdedevis & ".xlsx", chemin & "FACTURE\" & nomdefacture & ".xlsx"
    Workbooks.Open Filename:=chemin & "FACTURE\" & nomdefacture & ".xlsx"

    Worksheets("Feuille1").Activate  'activation feuille de devis a imprimer
           'Remplissage des valeurs recuperees dans TDB
    Cells(8, 8) = Date
    Cells(6, 7) = "FACTURE"
    Cells(7, 7) = "FACT. N°"
    Cells(7, 8) = numero_facture
    Cells(21, 2) = "Suivant Devis N° " & nomdedevis
    Cells(21, 6) = "du " & datedudevis
    Cells(23, 2) = "Validé par vos soins le " & Date_Val_Devis
    Cells(23, 6) = "Suivant Référence " & Ref_Val_Devis

    numero_facture = numero_facture + 1

    Workbooks("TDB new.xlsm").Sheets("2017").Cells(7, 9) = numero_facture 'memorisation N° devis
    Workbooks("TDB new.xlsm").Sheets("2017").Cells(7, 10) = init   'Memorisation initialisation

End Sub

Cordialement Jany

Ce que tu fais s'appelle squatter... et ce n'est pas une attitude correcte. Je renouvelle donc la suggestion d'ouvrir ton sujet, différent de celui que tu es en train de détourner.

Et en essayant d'être moins brouillon (regarde le volume écrit pour arriver à ne même pas donner la ligne en erreur et les détails de l'erreur). Laquelle est d'ailleurs une erreur d'exécution (et non détectée par le compilateur avant exécution comme tu l'indiquais). Il y a aussi d'autres possibilités d'erreurs potentielles...

Cordialement.

Bonjour,

Et d'accord. Merci pour tout

Cordialement

Rechercher des sujets similaires à "probleme copier coller"