Copie séquentielle de données d'un classeur à un autre

Bonjour à tous,

J'ai un classeur "Source.xlsm" contenant un nombre "X" de feuilles et un classeur "Cible.xlsm" contenant une seule feuille "MODEL".

J'ai conçu une macro (Macro 1) qui copie la feuille "MODEL" et copie des données d'une feuille du classeur "Source.xlsm" dans la nouvelle feuille crée (MODEL (2)). La feuille "MODEL (2)" est automatiquement renommée en fonction de la valeur dans la cellule "C7". Quand j'exécute la macro 1 pour chacune des feuilles du classeur "Source.xlsm", j'obtiens le résultat du classeur "Résultat.xlsm".

J'aimerais automatiser l'exécution de la macro 1. En me positionnant sur la première feuille du classeur "Source.xlsm" et en exécutant la macro 1, idéalement, chacune des feuilles du classeur "Source.xlsm" devrait être copiée dans le classeur "Cible.xlsm" jusqu'à la dernière feuille. Etant donné que le classeur "Source.xlsm" pourrait contenir une centaine de feuilles, automatiser cette opération serait très pratique.

J'ai essayé la fonction "For Each Sheet In ActiveWorkbook.Sheets....Next" afin de balayer chacune des feuilles du classeur "Source.xlsm" mais sans obtenir les résultats escomptés.

J'ai donc besoin de votre assistance pour concevoir quelques lignes de code afin d'automatiser l'exécution de ma macro.

En vous remerciant par avance pour votre aide.

Sincères salutations,

Renaud D.

4source.xlsm (118.69 Ko)
5cible.xlsm (99.01 Ko)
5resultat.xlsm (127.84 Ko)

Bonsoir,

Je dois avouer que la manoeuvre m'échappe ! Le résultat n'est autre qu'une copie du classeur source auxquel on a seulement changé les noms de feuilles...

En quelques lignes de code la chose serait rondement bouclée ! (Bien que dans le code actuel il conviendrait déjà d'en supprimer les 2/3 environ ! avec l'enregistreur on ne fait pas du VBA... !)

Cordialement.

Bonsoir M. Ferrand,

Merci d'avoir répondu à ma requête. Il est impératif que les données soient copiées dans la copie de la feuille "MODEL" car dans la version complète, cette feuille est beaucoup plus complexe. Elle inclut des formats de cellule divers et de nombreux calculs qu'une simple copie ne pourraient reproduire. Pour les besoins de la cause, j'ai simplifié les divers classeurs afin de limiter l'espace mémoire occupé par ces derniers.

Si vous pourriez réduire en quelques lignes de code la copie des données d'un classeur à un autre, cela serait également très apprécié.

Ceci vous en dit long sur mes talents de programmeur .

Au plaisir de vous lire,

Renaud D.

Je n'ai vu aucune formule dans la cible !

Si elle est telle quelle on doit pouvoir tranférer de façon plus groupée (au moins) les valeurs...

Les modèles que tu fournis doivent correspondre, on ne peut faire du bon travail sinon !


Plus précisément, qu'y a-t-il en C6, en S7, en T4:T8, en U7:U8

et éventuellement dans les colonnes en C et N, et entre N et S ?

Bon ! On aura fait sans infos...

Sub Macro1()
    Dim wbC As Workbook, wsM As Worksheet, ws As Worksheet, nf$, Cel, i%
    Set wbC = Workbooks("Cible.xlsm")
    Cel = Split("I1 C3:C5 C7:C8 N3:N8 S3:S6 U3:U6 S8")
    Application.ScreenUpdating = False
    For Each ws In ThisWorkbook.Worksheets
        nf = ws.Range("C7")
        wbC.Worksheets("MODEL").Copy before:=wbC.Worksheets(1)
        Set wsM = ActiveSheet
        wsM.Name = nf
        For i = 0 To UBound(Cel)
            wsM.Range(Cel(i)).Value = ws.Range(Cel(i)).Value
        Next i
    Next ws
    wbC.Worksheets("MODEL").Delete
    wbC.SaveAs ThisWorkbook.Path & "\Résultat.xlsm"
    wbC.Close
End Sub

Supprimer la macro dans Cible, le nom est affecté dans la présente macro...

Revoir la fin : chemin et nom du classeur résultat...

Cordialement.

Bonjour M. Ferrand,

Votre macro fonctionne merveilleusement bien.

Cependant, comme je l'ai précisé précédemment, pour des raisons pratiques, le classeur "Sources.xlsm" complet contient de nombreux formats et formules présentes dans d'autres cellules qui n'ont pas été reproduits dans le classeur "Sources.xlsm" simplifié.

J'ai malheureusement oublié de vous mentionner qu'il peut arriver qu'une valeur dans une cellule du classeur "Source.xlsm" ne soit pas nécessairement associée à son équivalent dans le classeur "Cible.xlsm". Par exemple, il est possible que la valeur de la cellule "N12" du classeur "Source.xlsm" soit copiée dans la cellule "O12" dans le classeur "Cible.xlsm". Est-il envisageable pour vous de remplacer la ligne "Cel = Split("I1 C3:C5 C7:C8 N3:N8 S3:S6 U3:U6 S8")" par un code qui permettrait d'associer des cellules de départ ("Sources.xlsm") et des cellules d'arrivée ("Cible.xlsm").

Au plaisir de vous relire,

Salutations

Renaud D.

Bonjour M. Ferrand,

J'ai cherché et cherché avec mes pauvres talents de programmeur et j'ai réussi à copier des données d'un classeur à un autre selon des critères prédéfinis.

Le code est le suivant :

Sub Macro1()

'

' Macro1 Macro

Dim wbC As Workbook, wsM As Worksheet, ws As Worksheet, nf$, Cel, i%

Set wbC = Workbooks("Cible.xlsm")

CellulesDepart = Split("I1,C3,C4,C5,C7,C8,N3,N4,N5,N6,N7,N8,S3,S4,S5,S6,U3,U4,U5,U6,S8", ",")

CellulesFin = Split("I1,C3,C4,C5,C7,C8,N3,N4,N5,N6,N7,N8,S3,S4,S5,S6,U3,U4,U5,U6,S8", ",")

Application.ScreenUpdating = False

For Each ws In ThisWorkbook.Worksheets

nf = ws.Range("C7")

wbC.Worksheets("MODEL").Copy before:=wbC.Worksheets(1)

Set wsM = ActiveSheet

wsM.Name = nf

For i = 0 To UBound(CellulesDepart)

wsM.Range(CellulesFin(i)).Value = ws.Range(CellulesDepart(i)).Value

Next i

Next ws

End Sub

Grâce à vous et vos bons conseils, la macro fonctionne comme je le désire.

Merci infiniment pour votre aide.

Sincères salutations,

Renaud D.

Rechercher des sujets similaires à "copie sequentielle donnees classeur"