Copier/Coller colonnes classeur 1 à 6 vers classeur cible [Résolu]

  • Initiateur de la discussion Initiateur de la discussion webdo87
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

webdo87

XLDnaute Nouveau
Bonjour la communauté,

Je dois réaliser une macro permettant de copier/coller plusieurs colonnes à la suite provenant de plusieurs classeurs dans un classeur cible et je souhaiterais avoir de l'aide de votre part.

Merci de suivre la discussion à partir du 3ème message.

Meilleures salutations,

J.S
 
Dernière édition:
Re : Copier/Coller colonnes classeur 1 à 6 vers classeur cible

Bonjour et bienvenue


Décidément je suis maudit!
Donc pour la énième fois ce matin...

Joindre un fichier exemple anonymisé permets aux répondeurs de tester leurs macros ou leurs formules, alors Messieurs, Mesdames, les nouveaux membres du forum, faites un effort, lisez la charte du forum (c'est instructif et non douloureux)
et pensez à prendre le temps de créer des fichiers exemple et à les joindre dans vos questions.

Vous optimiserez ainsi vos chances de réponses rapides à vos questions exceliennes.
 
Re : Copier/Coller colonnes classeur 1 à 6 vers classeur cible

Bonjour,


Excusez-moi de n'avoir pas donné de fichier excel. J'ai cru à tord que mon exemple et mon explication suffirait. Donc je reviens pour demander de l'aide car je suis mauvais en programmation et cette fois avec des exemples en attaché.

Ci-joint en zip les fichiers excels sources (classeur1 à 4) avec des données exemple et le fichier excel cible (classeur5) avec la macro et une feuille avec le résultat souhaité.

Ma demande mise à jour :

Je dois réaliser une macro permettant de copier/coller plusieurs colonnes à la suite provenant de plusieurs classeurs dans un classeur cible.
Pour le moment je faisais manuellement les copies mais maintenant j'aimerai trouver un moyen de le faire automatiquement.



Les informations :


Le classeur 5 est le classeur cible avec les données copiées qui contiendra la macro. Chaque classeur n'a qu'une seule feuille.

le contenu final du classeur 5 (collage (également copiage) à partir de la ligne 2) :

Colonne A contient une incrémentation de nombres entiers des lignes copiées (ex: 1 à 3000)
Colonne B contient la Colonne J du Classeur 1 + du Classeur 2 (à la suite)
Colonne C contient la Colonne H du Classeur 1 + du Classeur 2 (à la suite)
Colonne D contient la Colonne I du Classeur 1 + du Classeur 2 (à la suite)
Colonne E contient la Colonne AG du Classeur 1 + du Classeur 2 (à la suite)
Colonne F contient la Colonne AB du Classeur 1 + du Classeur 2 (à la suite)
Colonne G contient la Colonne V du Classeur 1 + du Classeur 2 (à la suite)
Colonne H contient la Colonne W du Classeur 1 + du Classeur 2 (à la suite)
Colonne I contient la Colonne Y du Classeur 1 + du Classeur 2 (à la suite)
Colonne J contient la Colonne Z du Classeur 1 + du Classeur 2 (à la suite)
Colonne K contient la Colonne AK du Classeur 3 + du Classeur 4 (à la suite)
Colonne L contient la Colonne AM du Classeur 3 + du Classeur 4 (à la suite)
Colonne M contient la Colonne W du Classeur 3 + du Classeur 4 (à la suite)
Colonne N contient la Colonne X du Classeur 3 + du Classeur 4 (à la suite)
Colonne O contient la Colonne Y du Classeur 3 + du Classeur 4 (à la suite)
Colonne P contient la Colonne Z du Classeur 3 + du Classeur 4 (à la suite)
Colonne Q contient la Colonne AI du Classeur 3 + du Classeur 4 (à la suite)
Colonne R contient la Colonne AJ du Classeur 3 + du Classeur 4 (à la suite)
Colonne S contient la Colonne AP du Classeur 3 + du Classeur 4 (à la suite)
Colonne T contient la Colonne AS du Classeur 3 + du Classeur 4 (à la suite)
Colonne U contient la Colonne AE du Classeur 3 + du Classeur 4 (à la suite)
Colonne V contient la Colonne AG du Classeur 3 + du Classeur 4 (à la suite)



La difficulté est de pouvoir
1) coller l'intégralité des lignes à la suite tout en ayant parfois des cellules vides (il faut que les lignes correspondent)
2) rendre la macro également automatique sans devoir ouvrir tous les classeurs (5 en tout). Tous les classeurs se trouvent dans le même répertoire. L'idéal serait de l'exécuter par un batch. Si quelqu'un pourrait m'éclairer dans ce sens.


Voici mon code de départ (qui est dans la macro du fichier classeur5.xls) :


Code:
Sub copier()

Dim Source1(), Source2(), Source3(), Source4(), Cible(), Tablo
Dim MaPlage As Range
Dim DerLig As Long
'sources
Dim Wk1 As Workbook
Dim Wk2 As Workbook
Dim Wk3 As Workbook
Dim Wk4 As Workbook
'cible
Dim Wk5 As Workbook
'sources
Dim Ws1 As Worksheet
Dim Ws2 As Worksheet
Dim Ws3 As Worksheet
Dim Ws4 As Worksheet
'cible
Dim Ws5 As Worksheet
    Set Wk1 = Workbooks("classeur1.xls") 
    Set Wk2 = Workbooks("classeur2.xls") 
    Set Wk3 = Workbooks("classeur3.xls") 
    Set Wk4 = Workbooks("classeur4.xls") 
    Set Wk5 = Workbooks("classeur5.xls") 
    Set Ws1 = Wk1.Worksheets("Feuil1") 
    Set Ws2 = Wk2.Worksheets("Feuil1") 
    Set Ws3 = Wk3.Worksheets("Feuil1") 
    Set Ws4 = Wk4.Worksheets("Feuil1") 
    Set Ws5 = Wk5.Worksheets("Feuil1")  
    Source1 = Array("J", "H", "I", "AG", "AB", "V", "W", "Y", "Z")
    Source2 = Array("J", "H", "I", "AG", "AB", "V", "W", "Y", "Z")
    Source3 = Array("AK", "AM", "W", "X", "Y","Z","AI","AJ","AP","AS","AE","AG")
    Source4 = Array("AK", "AM", "W", "X", "Y","Z","AI","AJ","AP","AS","AE","AG")
    Cible = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U","V")
    'A remanier
    For i = 0 To UBound(Source)
        DerLig = Ws1.Range(Source(i) & Ws1.Rows.Count).End(xlUp).Row
        Set MaPlage = Ws1.Range(Ws1.Cells(2, Source(i)), Ws1.Cells(DerLig, Source(i)))
        MaPlage.Copy Destination:=Ws7.Range(Cible(i) & 2)
        Set MaPlage = Nothing
    Next
    'Est-ce que les set ici sont obligatoires?
    Set Ws1 = Nothing
    Set Ws2 = Nothing
    Set Ws3 = Nothing
    Set Ws4 = Nothing
    Set Ws5 = Nothing
    Set Wk1 = Nothing
    Set Wk2 = Nothing
    Set Wk3 = Nothing
    Set Wk4 = Nothing
    Set Wk5 = Nothing
End Sub


Je vous remercie d'avance pour votre aide.

J.S
 

Pièces jointes

Dernière édition:
Re : Copier/Coller colonnes classeur 1 à 6 vers classeur cible

Bonjour

Merci d'avoir joint des PJ (même si elle contenait chacune trois feuilles alors que le macro s'intéresse à la feuille 1 de chaque classeur...) 😉

N'y aurait-il pas moyen d'agencer les données afin que tous les classeurs aient la même structure ?
(même nombre de colonnes et les entêtes de colonne identiques aux même endroit)

Cela nous faciliterai la tâche.

Batch ou pas batch, il faut ouvrir les classeurs sauf à utiliser d'autres méthodes
(voir les fils relatifs à : lire données classeurs fermés)
 
Dernière édition:
Re : Copier/Coller colonnes classeur 1 à 6 vers classeur cible

Bonjour Staple1600 et merci de vous intéresser à mon problème.

Merci d'avoir joint des PJ (même si elle contenait chacune trois feuilles alors que le macro s'intéresse à la feuille 1 de chaque classeur...)

Oui en fait je voulais dire que chaque classeur ne contient qu'une seule feuille de données chacune. J'ai modifié cela et j'ai supprimé les autres feuilles inutiles aux classeurs (mis à jour aux fichiers attachés classeursExemplesv2.zip‎ du message 3).

N'y aurait-il pas moyen d'agencer les données afin que tous les classeurs aient la même structure ?
(même nombre de colonnes et les entêtes de colonne identiques aux même endroit)

Cela nous faciliterai la tâche.

Les classeurs 1 et 2 ainsi que, différemment, les classeurs 3 et 4 ont la même structure (mêmes colonnes, entêtes identiques (mis à jour aux fichiers attachés), même nombre de lignes max.). Le reste je ne peux malheureusement pas mieux agencer car mes fichiers sources sont identiques à ce que j'ai attaché.

Pas ou pas batch, il faut ouvrir les classeurs sauf à utiliser d'autres méthodes
(voir les fils relatifs à : lire données classeurs fermés)

D'accord merci pour l'information.


Cordialement,

J.S
 
Re : Copier/Coller colonnes classeur 1 à 6 vers classeur cible

Bonsoir


Ce que je voulais dire, c'était qu'on devrait pouvoir avoir
Colonne A contient une incrémentation de nombres entiers des lignes copiées (ex: 1 à 3000)
Colonne B contient la Colonne B du Classeur 1 + du Classeur 2 (à la suite)
Colonne C contient la Colonne C du Classeur 1 + du Classeur 2 (à la suite)
Colonne D contient la Colonne D du Classeur 1 + du Classeur 2 (à la suite)
Colonne E contient la Colonne E du Classeur 1 + du Classeur 2 (à la suite)
Colonne F contient la Colonne F du Classeur 1 + du Classeur 2 (à la suite)
Colonne G contient la Colonne G du Classeur 1 + du Classeur 2 (à la suite)
etc..

Pourquoi se compliquer la tâche quand c'est si simple de se la simplifier ?
 
Re : Copier/Coller colonnes classeur 1 à 6 vers classeur cible

Bonsoir


Ce que je voulais dire, c'était qu'on devrait pouvoir avoir


Pourquoi se compliquer la tâche quand c'est si simple de se la simplifier ?


Cela malheureusement je ne peux pas car les autres colonnes des classeurs 1,2,3,4 contiennent d'autres données mais qui ne sont pas utiles pour moi. C'est pour cela que j'ai bien spécifié les colonnes (J,H,etc..).


Cordialement,

J.S
 
Dernière édition:
Re : Copier/Coller colonnes classeur 1 à 6 vers classeur cible

Bonjour

Ok

Puisque tu parles remaniement, remanions, compagnon.
'A remanier
For i = 0 To UBound(Source)
DerLig = Ws1.Range(Source(i) & Ws1.Rows.Count).End(xlUp).Row
Set MaPlage = Ws1.Range(Ws1.Cells(2, Source(i)), Ws1.Cells(DerLig, Source(i)))
MaPlage.Copy Destination:=Ws7.Range(Cible(i) & 2)
Set MaPlage = Nothing
Next

Source ne correspond à rien dans l'état actuel de ton code.
Et tu n'es pas obligé de doubler tes Arrays puisque ici : Source1=Source2 et Source3=Source4

Et les Set Nothing ne sont pas forcément obligatoires, mais c'est plus propre de faire le ménage en fin de code.
 
Dernière édition:
Re : Copier/Coller colonnes classeur 1 à 6 vers classeur cible

Bonjour,

Voici la dernière version de la macro avec tes dernières remarques :

Code:
Sub copier()

Dim Source1(), Source2(), Cible(), Tablo
Dim MaPlage As Range
Dim DerLig As Long
'sources
Dim Wk1 As Workbook
Dim Wk2 As Workbook
Dim Wk3 As Workbook
Dim Wk4 As Workbook
'cible
Dim Wk5 As Workbook
'sources
Dim Ws1 As Worksheet
Dim Ws2 As Worksheet
Dim Ws3 As Worksheet
Dim Ws4 As Worksheet
'cible
Dim Ws5 As Worksheet
    Set Wk1 = Workbooks("classeur1.xls") 
    Set Wk2 = Workbooks("classeur2.xls") 
    Set Wk3 = Workbooks("classeur3.xls") 
    Set Wk4 = Workbooks("classeur4.xls") 
    Set Wk5 = Workbooks("classeur5.xls") 
    Set Ws1 = Wk1.Worksheets("Feuil1") 
    Set Ws2 = Wk2.Worksheets("Feuil1") 
    Set Ws3 = Wk3.Worksheets("Feuil1") 
    Set Ws4 = Wk4.Worksheets("Feuil1") 
    Set Ws5 = Wk5.Worksheets("Feuil1")  
    Source1 = Array("J", "H", "I", "AG", "AB", "V", "W", "Y", "Z")
    Source2 = Array("AK", "AM", "W", "X", "Y","Z","AI","AJ","AP","AS","AE","AG")
    Cible = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U","V")
    'A remanier
    For i = 0 To UBound(Source)
        DerLig = Ws1.Range(Source(i) & Ws1.Rows.Count).End(xlUp).Row
        Set MaPlage = Ws1.Range(Ws1.Cells(2, Source(i)), Ws1.Cells(DerLig, Source(i)))
        MaPlage.Copy Destination:=Ws5.Range(Cible(i) & 2)
        Set MaPlage = Nothing
    Next
    Set Ws1 = Nothing
    Set Ws2 = Nothing
    Set Ws3 = Nothing
    Set Ws4 = Nothing
    Set Ws5 = Nothing
    Set Wk1 = Nothing
    Set Wk2 = Nothing
    Set Wk3 = Nothing
    Set Wk4 = Nothing
    Set Wk5 = Nothing
End Sub

Comment je pourrai mettre dans la boucle For d'aller copier les informations dans les quatres classeurs ? Je t'ai bien dis que je ne suis pas doué en programmation....

Je te remercie de prendre un peu de ton temps pour ma macro.

Cordialement,

J.S
 
Dernière édition:
Re : Copier/Coller colonnes classeur 1 à 6 vers classeur cible

Re


Voici pour te mettre sur la piste une macro de test
Code:
Sub a()
Dim Test$, arrWBK
Dim Source1(), Source2(), Cible(), Tablo
Dim MaPlage As Range, DerLig As Long, Wk5 As Workbook
arrWBK = Array("classeur1.xls", "classeur2.xls", "classeur3.xls", "classeur4.xls")

Set Wk5 = ThisWorkbook
    Source1 = Array("J", "H", "I", "AG", "AB", "V", "W", "Y", "Z")
    Source2 = Array("AK", "AM", "W", "X", "Y", "Z", "AI", "AJ", "AP", "AS", "AE", "AG")
    Cible = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V")
    'A remanier
    For i = 0 To UBound(arrWBK)
        For j = 0 To UBound(Source1)
        With Workbooks(arrWBK(i)).Sheets(1)
            DerLig = .Cells(65536, Source1(j)).End(xlUp).Row
            MsgBox "Derlig= " & DerLig
            Set MaPlage = Cells(2, CStr(Source1(j))).Resize(DerLig)
            Test = Workbooks(arrWBK(i)).Name & ": " & .Name & ": " & MaPlage.Address
            MsgBox Test
            Set MaPlage = Nothing
        End With
        Next j
    Next i
End Sub

Code à mettre dans un classeur à partir duquel tu ouvres manuellement les classeurs 1 à 4 avant de lancer la macro.


Je te laisse adapter pour récréer le code de recopie (ici remplacé par l'affichage d'un msgBox en guise de test)
 
Re : Copier/Coller colonnes classeur 1 à 6 vers classeur cible

Merci pour ton aide encore une fois.

Voici le code adapté mais la copie ne prend pas... Qu'est-ce que je fais de faux ?
J'ouvre bien les 5 classeurs avant de lancer la macro dans le classeur5.
Et Faudrait il pas lui préciser la source2 à un endroit ?

Code:
Sub a()
Dim Test$, arrWBK
Dim Source1(), Source2(), Cible()
Dim MaPlage As Range, DerLig As Long, Wk5 As Workbook
'Ajout
Dim Ws5 As Worksheet
arrWBK = Array("classeur1.xls", "classeur2.xls","classeur3.xls", "classeur4.xls")
'Ajout
Set Wk5 = Workbooks("classeur5.xls")
'Ajout
Set Ws5 = Wk5.Worksheets("Feuil1")
    Source1 = Array("J", "H", "I", "AG", "AB", "V", "W", "Y", "Z")
    Source2 = Array("AK", "AM", "W", "X", "Y", "Z", "AI", "AJ", "AP", "AS", "AE", "AG")
    Cible = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V")
    'A remanier
    For i = 0 To UBound(arrWBK)
        For j = 0 To UBound(Source1)
        With Workbooks(arrWBK(i)).Sheets(1)
            DerLig = .Cells(65536, Source1(j)).End(xlUp).Row
            MsgBox "Derlig= " & DerLig
            Set MaPlage = Cells(2, CStr(Source1(j))).Resize(DerLig)
            Test = Workbooks(arrWBK(i)).Name & ": " & .Name & ": " & MaPlage.Address
            MsgBox Test
            'Ajout
            MaPlage.Copy Destination:=Ws5.Range(Cible(j) & 2)
            Set MaPlage = Nothing
        End With
        Next j
    Next i
    'Ajout
    Set Ws5 = Nothing
    'Ajout
    Set Wk5 = Nothing
End Sub
 
Dernière édition:
Re : Copier/Coller colonnes classeur 1 à 6 vers classeur cible

Bonsoir

Ce qui ne va pas c'est que les tableaux Source1 et Cible ne sont pas de même taille
Ce qui est rédhibitoire.

Fais ce test pour voir la différence
Code:
Sub a()
Dim Source1
Dim Cible
Source1 = Array("J", "H", "I", "AG", "AB", "V", "W", "Y", "Z")
Cible = Array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U","V")
Msgbox Ubound(Source1)
Msgbox Ubound(Cible)
End Sub

Tu comprends maintenant ce qui ne va pas.
 
Re : Copier/Coller colonnes classeur 1 à 6 vers classeur cible

Bonsoir

D'accord j'ai compris l'erreur. Maintenant il faudrait spécifier à la cible de prendre en compte la grandeur du tableau de la source 1 + la source 2, c'est à dire 22 et non plus uniquement le tableau de la source 1 (8). C'est bien ça ? Et comment spécifier cela ? Je suis dans les choux...

Cordialement,

J.S
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour