VBA paste dans une autre feuille
Résolu
Jabba the Hutt
Messages postés
32
Date d'inscription
Statut
Membre
Dernière intervention
-
Jabba the Hutt Messages postés 32 Date d'inscription Statut Membre Dernière intervention -
Jabba the Hutt Messages postés 32 Date d'inscription Statut Membre Dernière intervention -
Bonjour tout le monde,
Je souhaite copier des informations (usedrange) d'un classeur vers un autre classeur (juste en dessous des données préexistante) voici le bout de code qui ne fonctionne pas :
Sub copiecolle ()
Dim objWorkbookSource As Workbook, objWorkbookCible As Workbook
Set objWorkbookSource = ThisWorkbook
Set objWorkbookCible = Application.Workbooks.Open(Application.GetOpenFilename)
objWorkbookSource.Sheets(Feuil1).UsedRange.Copy
objWorkbookCible.Sheets(Feuil1).ActiveCell.Offset(1, 0).UsedRange.Paste
Application.CutCopyMode = False
end sub
l'ouverture du second classeur se fait sans pb mais l'opération de copie colle ne fontionne pas. Qu'es-qui ne vas pas ?
Je souhaite copier des informations (usedrange) d'un classeur vers un autre classeur (juste en dessous des données préexistante) voici le bout de code qui ne fonctionne pas :
Sub copiecolle ()
Dim objWorkbookSource As Workbook, objWorkbookCible As Workbook
Set objWorkbookSource = ThisWorkbook
Set objWorkbookCible = Application.Workbooks.Open(Application.GetOpenFilename)
objWorkbookSource.Sheets(Feuil1).UsedRange.Copy
objWorkbookCible.Sheets(Feuil1).ActiveCell.Offset(1, 0).UsedRange.Paste
Application.CutCopyMode = False
end sub
l'ouverture du second classeur se fait sans pb mais l'opération de copie colle ne fontionne pas. Qu'es-qui ne vas pas ?
A voir également:
- Excel vba copy paste
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Déplacer colonne excel - Guide
- Si ou excel - Guide
- Excel compter cellule couleur sans vba - Guide
11 réponses
Bonjour,
Il faudrait que tu précises où est ton erreur (message et où est le curseur).
A priori, c'est la ligne avec Paste qui pose problème :
Paste est une méthode de Sheet ou Worksheet et non de Range.
Commence par sélectionner ta cellule de destination puis colle ou définit ta cellule de destination ou utilise la méthode PasteSpecial.
@+
Il faudrait que tu précises où est ton erreur (message et où est le curseur).
A priori, c'est la ligne avec Paste qui pose problème :
Paste est une méthode de Sheet ou Worksheet et non de Range.
Commence par sélectionner ta cellule de destination puis colle ou définit ta cellule de destination ou utilise la méthode PasteSpecial.
objWorkbookCible.Sheets(Feuil1).Paste Destination:=objWorkbookCible.Sheets(Feuil1).Range("A1").Offset(objWorkbookCible.Sheets(Feuil1).UsedRange.Rows.Count,0)
@+
Salut,
Ne serais-ce point juste un petit problème de guillemets :
Par moment ça tient à peu de choses...
Ne serais-ce point juste un petit problème de guillemets :
objWorkbookSource.Sheets("Feuil1").UsedRange.Copy objWorkbookCible.Sheets("Feuil1").ActiveCell.Offset(1, 0).UsedRange.Paste
Par moment ça tient à peu de choses...
Salut Gord21, pijaku,
@ Gord21 : A priori je n'ai pas de message d'erreurs (j'ai enlevé le Application.DisplayAlerts = False).
Juste avant d'arriver à cette ligne de code je fait un Select, du coup mon curseur se trouve dans la cellule sélectionné (en fait j'utilise le select afin de contourner un bug, je suis dans un boucle, si juste avant mon "next" je ne selectionne pas une cellule hors contexte lors du prochain tour de boucle j'ai des résultats incohérents). Ca ralenti légèrement la routine mais c'est non significatif.
En réalité, mon deuxième fichier s'ouvre correctement, je le vois bien basculer d'une fenêtre à l'autre, mais je ne le vois pas copier coller, mon curseur reste sur la cellule sélectionné (Q1).
@ pijaku : le (Feuil1) dans ma routine est remplacé par une variable que j'ai déclaré. En fait je filtre un tableau sur une colonne, et pour chaque occurence de cette colonne il y a une feuille qui se crée (MaCelluleValue). en gros mon code peut se résumer à ceci :
For Each MaCellule In Range("W2:W" & NbLignes)
MaFeuille.Range("Y2:Y" & NbLignes).Value = MaCellule.Value
Set NouvFeuil = Sheets.Add(, After:=Worksheets(Worksheets.Count))
On Error Resume Next
NouvFeuil.Name = MaCellule.Value
LDEC.AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Sheets("Unnomquelquonque").Range("Y1:Y2"), _
CopyToRange:=NouvFeuil.Range("A1"), _
' **********(on ne le voit pas ici mais la nouvelle feuille prend le nom stocké dans MaCellule.Value)
Unique:=False
'******quelques autres instruction puis :
'************************
Range("Q1").Select
Columns("A:P").EntireColumn.AutoFit
Range("Q1").Select
Application.DisplayAlerts = True
objWorkbookCible.Sheets(MaCellule.Value).Paste , _
Destination:=objWorkbookCible.Sheets(MaCellule.Value).Range("A1").Offset(objWorkbookCible.Sheets(MaCellule.Value).UsedRange.Rows.Count, 0)
Next
Les feuilles portent le même nom dans les deux classeurs.
@ Gord21 : A priori je n'ai pas de message d'erreurs (j'ai enlevé le Application.DisplayAlerts = False).
Juste avant d'arriver à cette ligne de code je fait un Select, du coup mon curseur se trouve dans la cellule sélectionné (en fait j'utilise le select afin de contourner un bug, je suis dans un boucle, si juste avant mon "next" je ne selectionne pas une cellule hors contexte lors du prochain tour de boucle j'ai des résultats incohérents). Ca ralenti légèrement la routine mais c'est non significatif.
En réalité, mon deuxième fichier s'ouvre correctement, je le vois bien basculer d'une fenêtre à l'autre, mais je ne le vois pas copier coller, mon curseur reste sur la cellule sélectionné (Q1).
@ pijaku : le (Feuil1) dans ma routine est remplacé par une variable que j'ai déclaré. En fait je filtre un tableau sur une colonne, et pour chaque occurence de cette colonne il y a une feuille qui se crée (MaCelluleValue). en gros mon code peut se résumer à ceci :
For Each MaCellule In Range("W2:W" & NbLignes)
MaFeuille.Range("Y2:Y" & NbLignes).Value = MaCellule.Value
Set NouvFeuil = Sheets.Add(, After:=Worksheets(Worksheets.Count))
On Error Resume Next
NouvFeuil.Name = MaCellule.Value
LDEC.AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Sheets("Unnomquelquonque").Range("Y1:Y2"), _
CopyToRange:=NouvFeuil.Range("A1"), _
' **********(on ne le voit pas ici mais la nouvelle feuille prend le nom stocké dans MaCellule.Value)
Unique:=False
'******quelques autres instruction puis :
'************************
Range("Q1").Select
Columns("A:P").EntireColumn.AutoFit
Range("Q1").Select
Application.DisplayAlerts = True
objWorkbookCible.Sheets(MaCellule.Value).Paste , _
Destination:=objWorkbookCible.Sheets(MaCellule.Value).Range("A1").Offset(objWorkbookCible.Sheets(MaCellule.Value).UsedRange.Rows.Count, 0)
Next
Les feuilles portent le même nom dans les deux classeurs.
Salut,
Je rejoins complètement l'opinion de Gord21. Essaye quelque chose comme ceci (à adapter bien entendu) :
Je rejoins complètement l'opinion de Gord21. Essaye quelque chose comme ceci (à adapter bien entendu) :
Sub copiecolle() Dim objWorkbookSource As Workbook, objWorkbookCible As Workbook Dim feuille1 As String, feuille2 As String feuille1 = ActiveSheet.Range("A1").Value 'la cellule A1 contient le nom de la feuille source feuille2 = ActiveSheet.Range("A2").Value 'la cellule A2 contient le nom de la feuille destination Set objWorkbookSource = ThisWorkbook Set objWorkbookCible = Application.Workbooks.Open(Application.GetOpenFilename) 'copie la source et colle sous la cellule Q1 (offset nombre de lignes) de la feuille destination objWorkbookSource.Sheets(feuille1).UsedRange.Copy objWorkbookCible.Sheets(feuille2).Range("Q1").Offset(objWorkbookCible.Sheets(feuille2).UsedRange.Rows.Count, 0) Application.CutCopyMode = False End Sub
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Dans tous les cas, le classeur cible doit être actif avant de faire "paste", sinon, cela ne fonctionne pas, voire génère une erreur.
Une piste parmi les autres :)
Une piste parmi les autres :)
rebonjour tout le monde,
Pikaju j'ai essayé avec le code 2 que j'ai mis en dernier, ça n'a pas marché, je vais refaire un test en mettant identifiant en A1 sur mes quelques 70 feuilles mais je crois déjà avoir avancé un peu avec code 1.
Sinon avec le code 1 juste en desssous :
En visu je vois bien le UsedRange être selectionné pour la copie (avec l'encadrement dynamique), mais pas de copie sur le fichier Cible. Pourtant la macro s'arrête bien, dans Cible, sur une feuille qui n'est pas la dernière feuille du classeur Cible, mais bien ma dernière feuille du classeur Source. Cela me faire dire qu'il arrive bien à chercher parmis toutes les feuilles dans le Classeur Cible (même s'il reste sur Q1).
PS GORD21 : j'ai relu ce que tu as écris, Paste n'est pas une méthode de Range, lorsque je remplace dans code1 "Sheets(MaCellule.Value).UsedRange.Copy" par : "Sheets(MaCellule.Value).copy" j'ai autant de classeur que de feuille qui se crééent, avec dans chaque classeur une copy (Yahouuuuu) de chaque feuille. comment faire pour ne pas avoir de nouveaux classeurs mais bien de coller dans Cible ???
Code 1 :
Sheets(MaCellule.Value).UsedRange.Copy
objWorkbookCible.Sheets(MaCellule.Value).Activate
ActiveSheet.Range("A1").Offset(UsedRange.Rows.Count, 0).Paste
Application.CutCopyMode = False
objWorkbookSource.Activate
next
Code 2 Pikaju (un peu modifié) :
'sheet1 = Sheets(MaCellule.Value) 'la cellule A1 contient le nom de la feuille source
'sheet2 = Sheets(MaCellule.Value) 'la cellule A2 contient le nom de la feuille destination
'copie la source et colle sous la cellule A1 (offset nombre de lignes) de la feuille destination
'objWorkbookSource.Sheets(feuille1).UsedRange.Copy objWorkbookCible.Sheets(feuille2).Range("A1").Offset(objWorkbookCible.Sheets(feuille2).UsedRange.Rows.Count, 0)
'Application.CutCopyMode = False
'objWorkbookSource.Activate
Pikaju j'ai essayé avec le code 2 que j'ai mis en dernier, ça n'a pas marché, je vais refaire un test en mettant identifiant en A1 sur mes quelques 70 feuilles mais je crois déjà avoir avancé un peu avec code 1.
Sinon avec le code 1 juste en desssous :
En visu je vois bien le UsedRange être selectionné pour la copie (avec l'encadrement dynamique), mais pas de copie sur le fichier Cible. Pourtant la macro s'arrête bien, dans Cible, sur une feuille qui n'est pas la dernière feuille du classeur Cible, mais bien ma dernière feuille du classeur Source. Cela me faire dire qu'il arrive bien à chercher parmis toutes les feuilles dans le Classeur Cible (même s'il reste sur Q1).
PS GORD21 : j'ai relu ce que tu as écris, Paste n'est pas une méthode de Range, lorsque je remplace dans code1 "Sheets(MaCellule.Value).UsedRange.Copy" par : "Sheets(MaCellule.Value).copy" j'ai autant de classeur que de feuille qui se crééent, avec dans chaque classeur une copy (Yahouuuuu) de chaque feuille. comment faire pour ne pas avoir de nouveaux classeurs mais bien de coller dans Cible ???
Code 1 :
Sheets(MaCellule.Value).UsedRange.Copy
objWorkbookCible.Sheets(MaCellule.Value).Activate
ActiveSheet.Range("A1").Offset(UsedRange.Rows.Count, 0).Paste
Application.CutCopyMode = False
objWorkbookSource.Activate
next
Code 2 Pikaju (un peu modifié) :
'sheet1 = Sheets(MaCellule.Value) 'la cellule A1 contient le nom de la feuille source
'sheet2 = Sheets(MaCellule.Value) 'la cellule A2 contient le nom de la feuille destination
'copie la source et colle sous la cellule A1 (offset nombre de lignes) de la feuille destination
'objWorkbookSource.Sheets(feuille1).UsedRange.Copy objWorkbookCible.Sheets(feuille2).Range("A1").Offset(objWorkbookCible.Sheets(feuille2).UsedRange.Rows.Count, 0)
'Application.CutCopyMode = False
'objWorkbookSource.Activate
Peut être qu'en nous disant exactement ce que tu souhaites on avancerait plus vite...
Je souhaite copier des informations (usedrange) d'un classeur vers un autre classeur (juste en dessous des données préexistante) Précise de qu'elle feuille vers qu'elle feuille (apparemment la feuille destination est la dernière du classeur destination). Soit Hyper Précis.
Merci
Je souhaite copier des informations (usedrange) d'un classeur vers un autre classeur (juste en dessous des données préexistante) Précise de qu'elle feuille vers qu'elle feuille (apparemment la feuille destination est la dernière du classeur destination). Soit Hyper Précis.
Merci
avec un usedrange.select
selection.copy ?????
ça va ralentir vachement le bidule ... bon je vais tester je reviens dans 2 sec !!
selection.copy ?????
ça va ralentir vachement le bidule ... bon je vais tester je reviens dans 2 sec !!
Bon j'ai testé ceci :
Sheets(MaCellule.Value).UsedRange.select
selection.copy '(je me suis dis paste n'est pas une méthode de Range, si on contourne avec Selection)
objWorkbookCible.Sheets(MaCellule.Value).Activate
ActiveSheet.Range("A1").Offset(UsedRange.Rows.Count, 0).Paste
Application.CutCopyMode = False
objWorkbookSource.Activate
Malheuresement ça ne copie rien. Même résultat qu'en utilisant le "Sheets(MaCellule.Value).UsedRange.Copy
".
...
^_^
Sheets(MaCellule.Value).UsedRange.select
selection.copy '(je me suis dis paste n'est pas une méthode de Range, si on contourne avec Selection)
objWorkbookCible.Sheets(MaCellule.Value).Activate
ActiveSheet.Range("A1").Offset(UsedRange.Rows.Count, 0).Paste
Application.CutCopyMode = False
objWorkbookSource.Activate
Malheuresement ça ne copie rien. Même résultat qu'en utilisant le "Sheets(MaCellule.Value).UsedRange.Copy
".
...
^_^
pijaku pardon je n'avais pas vu que tu m'avais répondu,
Pour répondre à ta question :
J'ai deux classeurs (un cible et un source).
Sur chaque fichiers j'ai "n" feuilles (en réalité un max de 70).
j'ai déjà une macro qui crée une feuille a pour chaque valeur contenue dans une cellule (d'ou le MaCellule.value), et change le nom de ladite feuille en "Macellule.value". voir mon deuxième post :
*----------------------------
MaFeuille.Range("Y2:Y" & NbLignes).Value = MaCellule.Value
Set NouvFeuil = Sheets.Add(, After:=Worksheets(Worksheets.Count))
NouvFeuil.Name = MaCellule.Value
*------------------------------
Donc pour chaque valeur contenu dans une colonne j'ai une feuille qui se créé, avant de passer à la valeur suivante, avant le next donc, j'ai ajouté des instructions qui permettent de manipuler l'information,
cad calculs et mise en forme.
Toujours avant le next, donc avant de tester la valeur suivante de ma colonne de référence (Y) je souhaiterai faire un copier du résultat de ces manipulation et mise en forme. Et coller sur un autre classeur qui existe déjà et dont les nom de feuilles sont les mêmes (Les identifiants en Y sont les mêmes donc j'ai aussi "n" feuille, avec un max de 70, qui portent le même nom, par contre je n'ai pas forcément le même nombre de feuille dans les deux classeurs).
j'espère que ceci est assez clair :)
Pour répondre à ta question :
J'ai deux classeurs (un cible et un source).
Sur chaque fichiers j'ai "n" feuilles (en réalité un max de 70).
j'ai déjà une macro qui crée une feuille a pour chaque valeur contenue dans une cellule (d'ou le MaCellule.value), et change le nom de ladite feuille en "Macellule.value". voir mon deuxième post :
*----------------------------
MaFeuille.Range("Y2:Y" & NbLignes).Value = MaCellule.Value
Set NouvFeuil = Sheets.Add(, After:=Worksheets(Worksheets.Count))
NouvFeuil.Name = MaCellule.Value
*------------------------------
Donc pour chaque valeur contenu dans une colonne j'ai une feuille qui se créé, avant de passer à la valeur suivante, avant le next donc, j'ai ajouté des instructions qui permettent de manipuler l'information,
cad calculs et mise en forme.
Toujours avant le next, donc avant de tester la valeur suivante de ma colonne de référence (Y) je souhaiterai faire un copier du résultat de ces manipulation et mise en forme. Et coller sur un autre classeur qui existe déjà et dont les nom de feuilles sont les mêmes (Les identifiants en Y sont les mêmes donc j'ai aussi "n" feuille, avec un max de 70, qui portent le même nom, par contre je n'ai pas forcément le même nombre de feuille dans les deux classeurs).
j'espère que ceci est assez clair :)
*---------------------------- MaFeuille.Range("Y2:Y" & NbLignes).Value = MaCellule.Value Set NouvFeuil = Sheets.Add(, After:=Worksheets(Worksheets.Count)) NouvFeuil.Name = MaCellule.Value *------------------------------ Sheets(NouvFeuil).UsedRange.Copy objWorkbookCible.Sheets(NouvFeuil).Range("A1")
Ou si tu veux coller après des données existantes, choisit ta plus "longue" colonne (ici "D") et :
Sheets(NouvFeuil).UsedRange.Copy objWorkbookCible.Sheets(NouvFeuil).Range("D65536").End(xlUp).Offset(1, 0)
UsedRange.Copy ne pose pas de problème.
Pijaku ceci peut aider :
à chaque tour de boucle la valeur prise par MaCellule.Value change ... puisque un tour de boucle crée une page je suis dans une nouvelle page, c'est pour cela que tu vois un "next" après mon "objWorkbookSource.Activate ".
pour répondre ta question de manière synthétique :
j'ai dans mes deux classeurs "n" feuilles qui portent exactement le même nom. Parcontre "n" est plus grand dans un des deux classeurs.
M'enfin je n'ai pas été aussi clair dans mon premier post parce que ma véritable problématique reste de copier d'un classeur pour coller dans un autre. Je ne voulai troubler personne avec un pb de feuilles. J'avais peur de voir apparaître des réponses qui ne correspondent pas avec mon pb (cad copier coller dans un autre classeur).
En fait "n" correspond au nombre de classeurs qui se créent avec un bon copier coller quand j'écris :
...
Sheets(MaCellule.Value).Select
Selection.Copy
objWorkbookCible.Sheets(MaCellule.Value).Activate
ActiveSheet.Range("A1").Offset(UsedRange.Rows.Count, 0).Paste
Application.CutCopyMode = False
objWorkbookSource.Activate
Next
End sub
à chaque tour de boucle la valeur prise par MaCellule.Value change ... puisque un tour de boucle crée une page je suis dans une nouvelle page, c'est pour cela que tu vois un "next" après mon "objWorkbookSource.Activate ".
pour répondre ta question de manière synthétique :
j'ai dans mes deux classeurs "n" feuilles qui portent exactement le même nom. Parcontre "n" est plus grand dans un des deux classeurs.
M'enfin je n'ai pas été aussi clair dans mon premier post parce que ma véritable problématique reste de copier d'un classeur pour coller dans un autre. Je ne voulai troubler personne avec un pb de feuilles. J'avais peur de voir apparaître des réponses qui ne correspondent pas avec mon pb (cad copier coller dans un autre classeur).
En fait "n" correspond au nombre de classeurs qui se créent avec un bon copier coller quand j'écris :
...
Sheets(MaCellule.Value).Select
Selection.Copy
objWorkbookCible.Sheets(MaCellule.Value).Activate
ActiveSheet.Range("A1").Offset(UsedRange.Rows.Count, 0).Paste
Application.CutCopyMode = False
objWorkbookSource.Activate
Next
End sub