VBA paste dans une autre feuille
Résolu/Fermé
Jabba the Hutt
Messages postés
32
Date d'inscription
vendredi 22 janvier 2010
Statut
Membre
Dernière intervention
2 août 2010
-
15 mars 2010 à 10:19
Jabba the Hutt Messages postés 32 Date d'inscription vendredi 22 janvier 2010 Statut Membre Dernière intervention 2 août 2010 - 16 mars 2010 à 16:03
Jabba the Hutt Messages postés 32 Date d'inscription vendredi 22 janvier 2010 Statut Membre Dernière intervention 2 août 2010 - 16 mars 2010 à 16:03
A voir également:
- Excel vba copy paste
- Liste déroulante excel - Guide
- Word et excel gratuit - Guide
- Si et excel - Guide
- Déplacer une colonne excel - Guide
- Excel compter cellule couleur sans vba - Guide
11 réponses
Gord21
Messages postés
918
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
20 mars 2013
289
15 mars 2010 à 12:36
15 mars 2010 à 12:36
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)
@+
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 757
15 mars 2010 à 12:54
15 mars 2010 à 12:54
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...
Jabba the Hutt
Messages postés
32
Date d'inscription
vendredi 22 janvier 2010
Statut
Membre
Dernière intervention
2 août 2010
15 mars 2010 à 15:58
15 mars 2010 à 15:58
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.
Jabba the Hutt
Messages postés
32
Date d'inscription
vendredi 22 janvier 2010
Statut
Membre
Dernière intervention
2 août 2010
16 mars 2010 à 12:08
16 mars 2010 à 12:08
:)
Gord21
Messages postés
918
Date d'inscription
samedi 21 novembre 2009
Statut
Membre
Dernière intervention
20 mars 2013
289
16 mars 2010 à 12:18
16 mars 2010 à 12:18
Bonjour,
Dans ton code, je ne vois pas à quel endroit est ton instruction Copy. Si tu as plusieurs opérations entre Copy et Paste, Excel sort peut-être du mode copy.
@+
Dans ton code, je ne vois pas à quel endroit est ton instruction Copy. Si tu as plusieurs opérations entre Copy et Paste, Excel sort peut-être du mode copy.
@+
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 757
16 mars 2010 à 13:28
16 mars 2010 à 13:28
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
Atxeco
Messages postés
4
Date d'inscription
mardi 16 mars 2010
Statut
Membre
Dernière intervention
16 mars 2010
16 mars 2010 à 13:02
16 mars 2010 à 13:02
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 :)
Jabba the Hutt
Messages postés
32
Date d'inscription
vendredi 22 janvier 2010
Statut
Membre
Dernière intervention
2 août 2010
16 mars 2010 à 14:41
16 mars 2010 à 14:41
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
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 757
16 mars 2010 à 14:58
16 mars 2010 à 14:58
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
Jabba the Hutt
Messages postés
32
Date d'inscription
vendredi 22 janvier 2010
Statut
Membre
Dernière intervention
2 août 2010
16 mars 2010 à 14:52
16 mars 2010 à 14:52
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 !!
Jabba the Hutt
Messages postés
32
Date d'inscription
vendredi 22 janvier 2010
Statut
Membre
Dernière intervention
2 août 2010
16 mars 2010 à 14:56
16 mars 2010 à 14:56
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
".
...
^_^
Jabba the Hutt
Messages postés
32
Date d'inscription
vendredi 22 janvier 2010
Statut
Membre
Dernière intervention
2 août 2010
16 mars 2010 à 15:17
16 mars 2010 à 15:17
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 :)
pijaku
Messages postés
12263
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
4 janvier 2024
2 757
16 mars 2010 à 15:38
16 mars 2010 à 15:38
*---------------------------- 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.
Jabba the Hutt
Messages postés
32
Date d'inscription
vendredi 22 janvier 2010
Statut
Membre
Dernière intervention
2 août 2010
16 mars 2010 à 15:28
16 mars 2010 à 15:28
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
Jabba the Hutt
Messages postés
32
Date d'inscription
vendredi 22 janvier 2010
Statut
Membre
Dernière intervention
2 août 2010
16 mars 2010 à 16:03
16 mars 2010 à 16:03
Sheets(NouvFeuil).UsedRange.Copy objWorkbookCible.Sheets(NouvFeuil).Range("D65536").End(xlUp).Offset(1, 0)
Chapeau bas, ça fonctionne !
Merci !!
Chapeau bas, ça fonctionne !
Merci !!