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
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 ? !!!
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 !
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 !
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...
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