Copie respective des données d'un classeur dans un autre
Bonjour à tous,
Je me permet de vous présenter mon souci.
Je suis complètement nouvelle sur VBA. Au travail je dois trouver une solution pour copier le contenu de feuilles d'un classeur 1, les une après les autres, et coller ce contenu dans les feuilles d'un classeur 2.
Ne sachant pas faire de boucles j'ai utilisé l'enregistreur de macro.
Auriez vous idée de comment rendre ce code moins répétitif?
Workbooks.Open Filename:= _
"lien classeur source"
Workbooks.Open Filename:= _
"lien classeur cible"
Windows("source.xls").Activate
Sheets("feuille1").Select
Cells.Select
Application.CutCopyMode = False
Selection.Copy
Windows("cible.xls").Activate
Sheets("feuille1").Select
Cells.Select
ActiveSheet.Paste
Windows("source.xls").Activate
Sheets("feuille2").Select
Cells.Select
Application.CutCopyMode = False
Selection.Copy
Windows("cible.xls").Activate
Sheets("feuille2").Select
Cells.Select
ActiveSheet.Paste
Windows("source.xls").Activate
Sheets("feuille3").Select
Cells.Select
Application.CutCopyMode = False
Selection.Copy
Windows("cible.xls").Activate
Sheets("feuille3").Select
Cells.Select
Range("A4").Activate
ActiveSheet.Paste
etc
jusqu'à faire toutes les feuilles du classeur
je vous remercie d'ores et déjà pour votre attention
Public Sub copierValeurs(ByVal classeur1 As String, ByVal nomFeuille1 As String, ByVal classeur2 As String, ByVal nomFeuille2 As String)
Workbooks(classeur1).Activate
Workbooks(classeur1).Worksheets(nomFeuille1).Select
Workbooks(classeur1).Worksheets(nomFeuille1).Cells.Select
Selection.Copy
Workbooks(classeur2).Activate
Workbooks(classeur2).Worksheets(nomFeuille2).Select
ActiveSheet.Paste
End Sub
Public Sub test()
Call copierValeurs("Classeur1", "Feuil1", "Classeur2", "Feuil2")
End SubSi ce code te convient, tu 'nas qu'à adapter la procédure "test" pour qu'elle te convienne =) (ie copier la ligne Call .... et l'adapter
EDIT :
Call copierValeurs("source.xls", "feuille1", "cible.xls", "feuille1")
Call copierValeurs("source.xls", "feuille2", "cible.xls", "feuille2")
Call copierValeurs("source.xls", "feuille3", "cible.xls", "feuille3")OU
Dim i as Integer
For i = 1 to 25
Call copierValeurs("source.xls", "feuille"&i, "cible.xls", "feuille"&i)
next iBonjour,
Pour rationnaliser et optimiser un code, la première chose est d'en expurger tout ce qui relève de la reproduction de la procédure manuelle par l'enregistreur, soit à faire disparaître les Select, Selection, et autre Activate, sans oublier les CutCopuMode = False et autres inutilités dont VBA gagne à se passer...
La seconde est d'éviter de copier-coller quand cela ne s'impose pas...
Mais au cas particulier (en l'état des informations fournies), copier la totalité d'un classeur dans un autre, cela laisse rêveur !
Pourquoi ne pas : ouvrir le classeur source, l'enregistrer (SaveAs) sous le nom du classeur cible. Et le même résultat est atteint en 2 lignes de code.
Cordialement.
Bonjour,
Merci beaucoup pour vos réponses!
@ d3d9x je vais tester ta solution au plus vite! merci
J'ai oublié de vous préciser que mon fichier "cible" contient une feuille en plus dite de "restitution", dont les données changent en fonction des autres onglets ( et donc des données importées du fichier source)
Arrivez vous à me comprendre? j'ai encore du mal à m'exprimer sur le sujet
cordialement
Mon
Dans ce cas :
- ouverture classeur source
- ouverture classeur 'restitution'
- import feuille 'restitution dans classeur source
- enregistrement classeur source sous nom cible
4 lignes (5 en refermant 'restitution')
Bonjour,
Merci encore messieurs pour avoir répondu à mes questions.
Désolée, j'ai mis volontairement en standby mon sujet, car étant novice je met du temps à appliquer et à tester vos conseils.
Je vais opter pour la nouvelle solution qui va simplifier mon cas:
- ouverture classeur source
- ouverture classeur 'restitution'
- import feuille 'restitution dans classeur source
- enregistrement classeur source sous nom cible
Mais quand je copie/colle la feuille de restitution du classeur cible dans le classeur source, les formules de la feuille ne sont pas figées et sont toujours liées au classeur "cible", cela donne ceci:
=SOMME.SI(BDD_DECOMPTE;D4;'[cible.xls]0-Décompte Contrat'!G:G)
De plus BDD_DECOMPTE est un nom de plage, mes noms de plages définis sont eux aussi liés au classeur cible. Devrai je les recréer? ou y a t'il la possibilité de les exporter?
encore merci pour votre attention
Bonjour,
Faire d'abord une copie dans le classeur, avant le première feuille, faire un copier-coller valeurs pour éliminer les formules, puis déplacer la feuille vers un nouveau classeur.
Depuis le temps, je n'ai plus en tête la configuration !
Il y a 3 classeur je crois, le classeur source, le classeur cible (Restitution) et le classeur qui contient la macro.
Cela devrait pouvoir donner quelque chose comme :
Sub DéplacerFeuille()
Dim WbSce As Workbook, WsExp As Worksheet
Workbooks.Open chemin & NomClasseurSource
Set WbSce = ActiveWorkbook
With WbSce
.Worksheets("NomFeuilleàExporter").Copy before:=.Worksheets(1)
End With
Set WsExp = ActiveSheet
With WsExp.UsedRange
.Copy
.PasteSpecial xlPasteValues
End With
Workbooks.Open chemin & "Restitution.xlsx"
With ActiveWorkbook
WsExp.Move after:=.Worksheets(.Worksheets.Count)
.Close True
End With
WbSce.SaveAs chemin & NomCible
WbSce.Close
End SubCordialement.
Merci!
je ne savais pas qu'on pouvait copier uniquement les valeurs!
Malheureusement je dois garder les formules (les valeurs dans la feuille doivent changer en fonction du classeur dans lequel la feuille est déplaçée), cela doit être dynamique.
Je continue à travailler sur ce que tu m'a donné, je comprend de plus en plus
A cemoment là, on copie d'abord la feuille dans le classeur cible, puis on copie le contenu de la feuille d'origine sur la feuille copiée.
Ce qui suppose que les formules soient recopiables et fonctionneront dans le classeur cible.