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
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 ?
A voir également:

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
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.
objWorkbookCible.Sheets(Feuil1).Paste Destination:=objWorkbookCible.Sheets(Feuil1).Range("A1").Offset(objWorkbookCible.Sheets(Feuil1).UsedRange.Rows.Count,0)


@+
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
Salut,
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...
0
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
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.
0
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
:)
0
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
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.
@+
0
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
Salut,
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
0

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
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 :)
0
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
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
0
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
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
0
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
avec un usedrange.select
selection.copy ?????

ça va ralentir vachement le bidule ... bon je vais tester je reviens dans 2 sec !!
0
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
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
".


...

^_^
0
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
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 :)
0
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
*---------------------------- 
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.
0
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
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





0
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
Sheets(NouvFeuil).UsedRange.Copy objWorkbookCible.Sheets(NouvFeuil).Range("D65536").End(xlUp).Offset(1, 0)


Chapeau bas, ça fonctionne !


Merci !!
0