2 fichiers, copie de certaines colonne vers 1 fichier résumé
Coucou à tous,
Je rencontre un problème dans ma quête de l'apprentissage du vba, et je viens vers vous pour un p'tit coup de main.
Postulat :
J'ai 2 fichiers .XLS, 1 fichier appelé AA (120 colonnes) et 1 autre appelé BB (135 colonnes). Tout deux contenant des chaînes de caractères et données numérique
Je souhaite faire un résumé de ces 2 fichiers (du ClasseurAA et ClasseurBB) vers 1 seul (ClasseurCC) en choisissant de faire apparaitre certaines colonnes et d’autre pas.
Je compte procéder par copier/coller (à défaut de pouvoir travailler sur la mémoire), mais parce que le format de mes 2 fichiers sources peut être amené à changer régulièrement, j’aimerais que la référence source se fasse par rapport à l’intitulé de la colonne (du genre : …Range(“VOITURE : endrow “)) plutôt qu’a sa référence dans la table (range(“A3 :endrow“)).
Mon intuition pour le code :
Sub interface_integration ()
Dim ClasseurCC As Workbook
Dim Variable_Classeur3 As Range
Set COMMANDE = Workbooks("C:\path_classeurAA.xls").Worksheets("Feuille1").Range("A2") VariableCol5_ClasseurAA.Copy Workbooks("C:\path_classeurCC.xls ").Worksheets("Feuille1").Range ("A7")
End SubMerci à ceux qui passeront par là, et auront la patience de se pencher sur mon sujet
Bonjour
Si je comprends
Jenny a écrit :Range(“VOITURE : endrow “)
Tu veux chercher la dernière ligne de la colonne ayant l'intitulé VOITURE ?
Si c'est ça
Il te faut chercher ce mot dans le classeur.feuille que tu visites avec Find
Récupérer la colonne ensuite c'est un jeu d'enfant
Si tu as besoin d'aide, fournis tes fichiers afin de ne pas tout reprendre à 0
Youpiiii, et merci Banzai de répondre si promptement.
En fait je me rend compte j'aurais du joindre un fichier en plus des explications (qui ne sont pas claires je vous l'accorde
J'ai donc "crée" des fichiers pour illustrer la difficulté en question.
Il y donc 2 fichiers sources (classeurAA, classeurBB) qui contiennent les données. Je voudrais rapatrier certaines colonnes (dans leur intégrité) de ces fichiers sources vers mon classeur Bilan (classeurCC).
Seulement (et c'est la que ça se gatte), la position des colonnes des fichiers sources peut ête modifier d'une extraction à une autre, c'est la raison pour laquelle j'aimerais que la copie des colonnes se fasse plutot à partir du nom de la colonne (dans l'exemple "ventes","N° voiture",..) plutot que via la position absolue de la colonne (range("A2,jusqu'en bas de la cellule non vide").
Voilà, merci encore pour le temps consacré à mes petites affaires
Salut,
tu peux récupérer le numéro de la colonne parcourant tes intitulés de colonnes. Un petit exemple, pour récupérer le numéro de la colonne comprenant le "nombre de porte" de ton classeur AA :
For Each cell In Range(Cells(4, 1), Cells(4, Cells(4, Cells.Columns.Count).End(xlToLeft).Column))
If cell.Value = "nombre de porte" Then
MsgBox ("Le nombre de porte se situe dans la colonne " & cell.Column)
Exit For
End If
NextBonjour
Que faire des données ?
Que faire avec par exemple 3577085403 : Présent 6 fois dans le fichier AA ?
Salut, si j'ai bien compris tu souhaites copier l'intégralité des données de AA et de BB à la suite dans le tableau de CC ? Il n'y a rien d'autre à faire ? Simplement la contrainte que les colonnes peuvent être interverties dans tes fichiers ?
Re-Coucou,
J'ai du me louper dans l’explication de ce que je souhaite faire (encore une fois
Il s'agit bien d'un copier/coller du contenu de certaines colonnes (depuis la valeur sous l'intitulé jusqu'à la dernière cellule non vide) vers un ficher résumé qui est ordonné d'une certaines manières pour l'ordre des colonnes (mon fichier classeurCC).
Le masque du bilan sera toujours ordonné au même format (les colonnes toujours dans le même ordre d'apparition), par contre mes 2 fichiers sources peuvent être amenés à changer régulièrement dans l'agencement des colonnes (ex: la colonne "ventes" peut être en première position ("A1:tout en bas"), puis la semaine d’après je reçois un nouveau fichier source et ce coup ci la colonnes "ventes" passe à la 5èeme position ("E1:tout en bas"). C'est la raison pour laquelle j'aurais souhaiter un copier/coller par intitulé de la colonne plutôt que par la position dans la table.
Les valeurs présentent dans le classeurAA et le classeurBB sont +/- fictives et ne servent qu'a illustrer mes intentions.
Voilà, et merci encore de me filer un coup de pouce fort apprécier
Bonsoir
Banzai64 a écrit :Que faire des données ?
On les copie à la suite et that's all
Affecte la sous-routine completer à un bouton de la Feuille 1 du classeur CC :
Dim wkb_AA As Workbook, wkb_BB As Workbook
Sub completer()
Dim position As Worksheet
Set position = ThisWorkbook.ActiveSheet
ouvrir_fichiers
copier_nb_portes
position.Activate
End Sub
Private Sub ouvrir_fichiers()
Set wkb_AA = Workbooks.Open(ThisWorkbook.Path & "\ClasseurAA.xls")
Set wkb_BB = Workbooks.Open(ThisWorkbook.Path & "\ClasseurBB.xls")
End Sub
Private Sub copier_nb_portes()
Dim i As Long
i = 6 ' numéro de la ligne où copier le résultat
wkb_AA.Worksheets("Feuil1").Activate
Call copie("N°voiture", 2, i)
wkb_BB.Worksheets("Feuil1").Activate
Call copie("N°voiture", 2, i)
End Sub
Private Sub copie(ByVal chaine As String, ByVal numcol As Byte, ByRef i As Long)
Dim valeur As String
For colonne = 1 To Cells(4, Cells.Columns.Count).End(xlToLeft).Column
valeur = Replace(Cells(4, colonne).Value, " ", "")
If valeur = chaine Then
Range(Cells(5, colonne), Cells(Range("A" & Rows.Count).End(xlUp).Row, colonne)).Copy
ThisWorkbook.Worksheets("Feuil1").Activate
Cells(i, numcol).Select
ActiveSheet.Paste
i = i + Selection.Rows.Count
Exit For
End If
Next
End SubDans cet exemple je ne me suis occupé que des numéros de voiture.
Je suis réellement impressionner de l’aisance dont certains peuvent faire preuve pour composer des scripts de ce genre. Finalement l'enregistreur de macro ne m'aurait jamais permis d'obtenir ce code. Ce qui m’agace c'est que j'ai acquis 3 énormes bouquins sur le VBA, parcourus en long et en large, et je parviens pas à décrypter l'info pour que cela me soit profitable.
Enfin, passons .... merci mille fois à vous deux pour le temps passé la dessus.
ps: si vous me le permettez, je tente demain d'intégrer ce code dans ma ma macro avant de passer le post en résolu.
Remplace :
i = i + Selection.Rows.Countpar :
i = i + Selection.Rows.Count +1Sinon on va ré-écrire sur une ligne précédemment copiée.
Jenny a écrit :ps: si vous me le permettez, je tente demain d'intégrer ce code dans ma ma macro avant de passer le post en résolu.
J'ai fait ce code assez rapidement, vérifie le bien car il est très probable que j'ai commis quelques erreurs.
Si tu arrives à me comprendre alors essaies de terminer avec le même raisonnement pour les autres colonnes. (ventes, années de fabrication, poids...). J'essaierai de repasser demain si tu as des questions sur mon code.
Edit : je me demande tout de même si j'ai bien saisi ce que tu demandes car ça me paraît bizarre au vu de la structure de tes fichiers AA et BB
C'est encore moi !
Je travaille sur le code qui m'a été donné et j'aurais bien quelques petites questions (si je peux encore abuser bien sûr
Je me suis permise de recopier et commenter le code sur certains points :
Dim wkb_AA As Workbook, wkb_BB As Workbook 'déclaration des variables wbk AA et wbk BB comme classeur
Sub completer()
Dim position As Worksheet 'déclaration d'une variable position comme étant une feuille
Set position = ThisWorkbook.ActiveSheet 'on initialise la variable position comme étant la feuille active de ce classeur (le classeur CC)
ouvrir_fichiers 'on lance la sous routine "ouvrir_fichiers" qui sera appelée par la macro completer
copier_nb_portes 'on lance une sous routine "copier_nb_portes" qui sera appelée par la macro completer
position.Activate
End Sub
'-------------------------------------------------------------------------------------------------------------------------
Private Sub ouvrir_fichiers()
Set wkb_AA = Workbooks.Open(ThisWorkbook.Path & "\ClasseurAA.xls")
Set wkb_BB = Workbooks.Open(ThisWorkbook.Path & "\ClasseurBB.xls")
End Sub
'-------------------------------------------------------------------------------------------------------------------------------
Private Sub copier_nb_portes()
Dim i As Long
i = 6 ' numéro de la ligne où copier le résultat dans le classeur de destination ClasseurCC
wkb_AA.Worksheets("Feuil1").Activate
Call copie("N°voiture", 2, i)
wkb_BB.Worksheets("Feuil1").Activate
Call copie("N°voiture", 2, i)
End Sub
'-------------------------------------------------------------------------------------------------------------------------
Private Sub copie(ByVal chaine As String, ByVal numcol As Byte, ByRef i As Long)
Dim valeur As String
For colonne = 1 To Cells(4, Cells.Columns.Count).End(xlToLeft).Column
valeur = Replace(Cells(4, colonne).Value, " ", "")
If valeur = chaine Then
Range(Cells(5, colonne), Cells(Range("A" & Rows.Count).End(xlUp).Row, colonne)).Copy
ThisWorkbook.Worksheets("Feuil1").Activate
Cells(i, numcol).Select
ActiveSheet.Paste
i = i + Selection.Rows.Count
Exit For
End If
Next
End SubEn fait j'ai quelques problèmes de compréhension sur les intitulés des sous procédures et leurs actions :
1) La sous procédure "copier_nb_portes" lance en fait la copie du numéro de voiture, j'imagine que c'est une erreur de saisie, mais assez bizarrement quand je remplace "copier_nb_portes" par "N°portes" ou "N_portes" j'ai une erreur d’exécution sur la déclaration de variable.
2) Je ne vois pas dans la boucle conditionnelle où je peux modifier ou ajouter des paramètres pour rajouter d'autres colonnes qui doivent être copier depuis mes 2 fichiers sources vers mon bilan (ClasseurCC).
Ou peut être que je ne dois pas toucher à la boucle conditionnelle et juste ajouter des sous procédures comme tu l'as fait juste au dessous de la "Private Sub copie" ?
Ce qui donnerait par exemple si je souhaite envoyer les ventes (ClasseurBB 5 ème colonne) vers mon ClasseurCC (à la première colonne) la création de la sous procédure suivante ?
Private Sub Ventes()
Dim i As Long
i = 6 ' numéro de la ligne où copier le résultat
wkb_BB.Worksheets("Feuil1").Activate
Call copie("Ventes", 1, i) 'la colonne vente dans mon bilan se trouvant à la première colonne
End SubJ'ai vraiment honte de poser des questions qui doivent vous paraître si bête ...
Bonjour Jenny
1) Oui c'est une erreur de saisie, il faut que tu remplaces aux 2 endroits. Ce qui donne :
Dim wkb_AA As Workbook, wkb_BB As Workbook
Sub completer()
Dim position As Worksheet
Set position = ThisWorkbook.ActiveSheet
ouvrir_fichiers
copier_n_voitures
position.Activate
End Sub
Private Sub ouvrir_fichiers()
Set wkb_AA = Workbooks.Open(ThisWorkbook.Path & "\ClasseurAA.xls")
Set wkb_BB = Workbooks.Open(ThisWorkbook.Path & "\ClasseurBB.xls")
End Sub
Private Sub copier_n_voitures()
Dim i As Long
i = 6 ' numéro de la ligne où copier le résultat
wkb_AA.Worksheets("Feuil1").Activate
Call copie("N°voiture", 2, i)
wkb_BB.Worksheets("Feuil1").Activate
Call copie("N°voiture", 2, i)
End Sub
Private Sub copie(ByVal chaine As String, ByVal numcol As Byte, ByRef i As Long)
Dim valeur As String
For colonne = 1 To Cells(4, Cells.Columns.Count).End(xlToLeft).Column
valeur = Replace(Cells(4, colonne).Value, " ", "")
If valeur = chaine Then
Range(Cells(5, colonne), Cells(Range("A" & Rows.Count).End(xlUp).Row, colonne)).Copy
ThisWorkbook.Worksheets("Feuil1").Activate
Cells(i, numcol).Select
ActiveSheet.Paste
i = i + Selection.Rows.Count
Exit For
End If
Next
End Sub
2) Effectivement, tu ne dois pas toucher à la sous-routine copie mais simplement l'appeler avec d'autres arguments, exactement comme tu l'as fait dans ton exemple.
Je t'aiderai bien pour faire les ventes également mais je ne ne comprends pas ce que tu veux faire. Car tu n'as pas l'information sur le nombre de ventes dans ton classeur AA.
Edit : voilà ce que ça donne avec la copie des ventes, mais du coup on a l'information uniquement pour les ventes correspondants aux numéros de voiture du fichier BB. :
Dim wkb_AA As Workbook, wkb_BB As Workbook
Sub completer()
Dim position As Worksheet
Set position = ThisWorkbook.ActiveSheet
ouvrir_fichiers
lancer_copie
position.Activate
End Sub
Private Sub ouvrir_fichiers()
Set wkb_AA = Workbooks.Open(ThisWorkbook.Path & "\ClasseurAA.xls")
Set wkb_BB = Workbooks.Open(ThisWorkbook.Path & "\ClasseurBB.xls")
End Sub
Private Sub lancer_copie()
Dim i As Long, j As Long
i = 6 ' numéro de la ligne où copier le résultat
wkb_AA.Worksheets("Feuil1").Activate
Call copie("N°voiture", 2, i)
j = i
wkb_BB.Worksheets("Feuil1").Activate
Call copie("N°voiture", 2, i)
wkb_BB.Worksheets("Feuil1").Activate
Call copie("ventes", 1, j)
End Sub
Private Sub copie(ByVal chaine As String, ByVal numcol As Byte, ByRef i As Long)
Dim valeur As String
For colonne = 1 To Cells(4, Cells.Columns.Count).End(xlToLeft).Column
valeur = Replace(Cells(4, colonne).Value, " ", "")
If valeur = chaine Then
Range(Cells(5, colonne), Cells(Range("A" & Rows.Count).End(xlUp).Row, colonne)).Copy
ThisWorkbook.Worksheets("Feuil1").Activate
Cells(i, numcol).Select
ActiveSheet.Paste
i = i + Selection.Rows.Count
Exit For
End If
Next
End SubOh oufff je suis vraiment rassurée là, merci !
En fait il ne faut pas nécessairement que la colonne soit présentes sur les 2 fichiers sources (à priori je n'aurais même qu'une colonne qui sera commune aux 2 fichiers).
Dans mon exemple on pourrait imaginer avoir les caractéristiques techniques des voitures sur un fichier et puis sur l'autre les caractéristiques liés à la vente de ces voitures. Puis on voudrait faire un récapitulatif des ces infos en prenant l'essentiel (quelques colonnes technique et quelques colonne commerciales) pour l'envoyer sur le classeurCC (le bilan).
Je re-test ça et reviens très vite vers toi, merci encore
J'ai fait une légère modification pour éviter que tu aies à te déplacer entre les feuilles :
Dim wkb_AA As Workbook, wkb_BB As Workbook
Sub completer()
Dim position As Worksheet
Set position = ThisWorkbook.ActiveSheet
ouvrir_fichiers
lancer_copie
position.Activate
End Sub
Private Sub ouvrir_fichiers()
Set wkb_AA = Workbooks.Open(ThisWorkbook.Path & "\ClasseurAA.xls")
Set wkb_BB = Workbooks.Open(ThisWorkbook.Path & "\ClasseurBB.xls")
End Sub
Private Sub lancer_copie()
Dim i As Long, j As Long
i = 6 ' numéro de la ligne où copier le résultat
wkb_AA.Worksheets("Feuil1").Activate
Call copie("N°voiture", 2, i)
j = i
wkb_BB.Worksheets("Feuil1").Activate
Call copie("N°voiture", 2, i)
Call copie("ventes", 1, j)
End Sub
Private Sub copie(ByVal chaine As String, ByVal numcol As Byte, ByRef i As Long)
Dim valeur As String, pos As Worksheet
Set pos = ActiveSheet
For colonne = 1 To Cells(4, Cells.Columns.Count).End(xlToLeft).Column
valeur = Replace(Cells(4, colonne).Value, " ", "")
If valeur = chaine Then
Range(Cells(5, colonne), Cells(Range("A" & Rows.Count).End(xlUp).Row, colonne)).Copy
ThisWorkbook.Worksheets("Feuil1").Activate
Cells(i, numcol).Select
ActiveSheet.Paste
i = i + Selection.Rows.Count
pos.Activate 'On se repolace sur la feuille où l'on était au début de cette sous-routine.
Exit For
End If
Next
End SubMaintenant tu n'as que les sous-routine a appeler.
C'est génialoïde !! Suis trop contente !!
Le test est concluant, il y a un espace vide sur le copier/coller de la première colonne du fichier ClasseurCC, mais je te demande de pas en tenir compte (parce que j'ai fais mes fichier exemples comme une cochonne
Maintenant si je souhaite compléter mon bilan (ClasseurCC), je remplis la sous procédure de cette façon donc ? Mais je crois que j'ai quelques problèmes avec les arguments (le "j" notamment pour l'incrémentation), et je n'obtiens pas le résultat attendu.
Private Sub lancer_copie()
Dim i As Long, j As Long
i = 6 ' numéro de la ligne où copier le résultat
wkb_AA.Worksheets("Feuil1").Activate
Call copie("N°voiture", 2, i)
j = i
wkb_BB.Worksheets("Feuil1").Activate
Call copie("N°voiture", 2, i)
Call copie("ventes", 1, j)
Call copie("origine", 4, j) 'source ClasseurBB 4eme colonne
Call copie("nombre de porte", 2, j) 'source ClasseurAA 2eme colonne
End SubDans la sous-routine copie tu peux remarquer cette instruction :
valeur = Replace(Cells(4, colonne).Value, " ", "")En fait cela signifie que l'on met la valeur de la cellule dans la variable "valeur", mais que l'on enlève les espaces blancs (par exemple dans ton fichier BB tu as un espace blanc qui s'est glissé après "N° voiture".
Du coup au moment de l'appel de la sous-routine il faut que tu vire tous les espaces :
Call copie("nombre de porte", 2, j) 'source ClasseurAA 2eme colonneDevient :
Call copie("nombredeporte", 2, j) 'source ClasseurAA 2eme colonneDe plus regarde bien ton code, au moment de ton appel tu te situes sur le classeur BB, c'est donc normal qu'il ne trouve rien.
Enfin tu ne sembles pas avoir compris comment utiliser ma procédure de copie.
Les arguments sont les suivants :
Private Sub copie(ByVal chaine As String, ByVal numcol As Byte, ByRef i As Long)chaine : c'est bon, c'est bien la colonne recherchée.
numcol : désigne en fait la colonne du classeur CC où tu souhaites coller les données (pas besoin de la rechercher celle-ci puisque ce sera toujours la même). Quand tu cherches le nombre de portes tu dois donc mettre 4 par exemple.
i : désigne la ligne sur laquelle copier les données. Lorsque ton fichier est vierge ce sera la ligne 6, par contre admettons que tu aies déjà collé des données, i a à ce moment là prit la valeur de la dernière ligne (187) et la prochaine fois que tu appelleras la sous-procédure ça collera directement à la ligne 187.
Seulement il y a un problème : la valeur de i changera à chaque appel si tu passes le i de la sous-routine lancer_copie en argument (pas très intelligent de ma part de leur donner le même nom).
D'où l'utilité de passer par une variable j qui vient récupérer la valeur de i après la première copie.
Ensuite c'est simple, si fais un traitement sur AA tu mets que tu veux les coller à la ligne 6, si tu fais un traitement sur BB tu les colles à la ligne 187 (valeur de j).
Exemple avec de fausses données :
Private Sub lancer_copie()
Dim i As Long, j As Long
i = 6 ' numéro de la ligne où copier le résultat
wkb_AA.Worksheets("Feuil1").Activate
Call copie("N°voiture", 2, i)
Call copie("Autrecolonne", 5, 6) ' cette fois on peut passer une constante
Call copie("Autrecolonne2",6, 6) ' De même
j = i
wkb_BB.Worksheets("Feuil1").Activate
Call copie("N°voiture", 2, i)
Call copie("ventes", 1, (j)) ' j vaut 187
Call copie("Autrecolonne", 2, (j))
End SubLes parenthèses autour de j servent à forcer le passage par valeur, de sorte à ne pas modifier la valeur de j.
Je ne sais pas si je suis très clair
Je sens que je vais abuser ... après plusieurs lecture j'ai compris le lien entre la procédure de copie et l'instruction où on lance la copie.
i : désigne la ligne sur laquelle copier les données. Lorsque ton fichier est vierge ce sera la ligne 6, par contre admettons que tu aies déjà collé des données, i a à ce moment là prit la valeur de la dernière ligne (187) et la prochaine fois que tu appelleras la sous-procédure ça collera directement à la ligne 187.
J'aurais du préciser plus clairement l'opération de rapatriement (et pour ca je te demande pardon
Chaque semaine l'opération de résumé des 2 fichiers ClasseurAA, ClasseurBB) vers un seul classeur bilan (ClasseurCC) est réalisée. L'extraction devrait générer un sous fichier à sauvegarder et qui prendrait comme modèle le masque du classeurCC.
Je pense que le code suivant permettrait de réaliser cette sauvegarde en demandant à chaque fois sous quel nom je souhaite enregistrer le résumé :
Do
fname = Application.GetSaveAsFilename
Loop Until fname <> False
ActiveWorkbook.SaveAs Filename:=fnameC'est la raison pour laquelle la sous procédure de copie ne dois pas enregistrer chaque fusion à la suite (sous la dernière ligne) des fusions précédentes. Mais générer un fichier d’extraction nouveau à chaque fois que la macro est lancée.
Je continue de travailler sur le code que tu m'a donné, si tu trouves encore la patience de m'éclairer je t'en serais reconnaissante sinon merci pour le temps que tu m'a déjà consacrée
C'est bien ce que j'ai fait, sauf que je n'ai pas nettoyé les données. Les données qui se mettent à la suite sont celles du classeur AA puis celles du classeur BB.
Mais lorsque tu ré-exécutes ça écrase les données précédentes.
Avec nettoyage pour être plus propre :
Dim wkb_AA As Workbook, wkb_BB As Workbook
Sub completer()
Application.ScreenUpdating = False
Dim position As Worksheet
Set position = ThisWorkbook.ActiveSheet
nettoyer
ouvrir_fichiers
lancer_copie
position.Activate
End Sub
Private Sub ouvrir_fichiers()
Set wkb_AA = Workbooks.Open(ThisWorkbook.Path & "\ClasseurAA.xls")
Set wkb_BB = Workbooks.Open(ThisWorkbook.Path & "\ClasseurBB.xls")
End Sub
Private Sub nettoyer()
Range(Cells(6, 1), Cells(6, 4)).Select
Range(Selection, Selection.End(xlDown)).Clear
End Sub
Private Sub lancer_copie()
Dim i As Long, j As Long
i = 6 ' numéro de la ligne où copier le résultat
wkb_AA.Worksheets("Feuil1").Activate
Call copie("N°voiture", 2, i)
j = i
wkb_BB.Worksheets("Feuil1").Activate
Call copie("N°voiture", 2, i)
Call copie("ventes", 1, j)
End Sub
Private Sub copie(ByVal chaine As String, ByVal numcol As Byte, ByRef i As Long)
Dim valeur As String, pos As Worksheet
Set pos = ActiveSheet
For colonne = 1 To Cells(4, Cells.Columns.Count).End(xlToLeft).Column
valeur = Replace(Cells(4, colonne).Value, " ", "")
If valeur = chaine Then
Range(Cells(5, colonne), Cells(Range("A" & Rows.Count).End(xlUp).Row, colonne)).Copy
ThisWorkbook.Worksheets("Feuil1").Activate
Cells(i, numcol).Select
ActiveSheet.Paste
i = i + Selection.Rows.Count
pos.Activate 'On se repolace sur la feuille où l'on était au début de cette sous-routine.
Exit For
End If
Next
End SubSi je n'ai toujours pas compris ta demande, le mieux serait que tu créé toi-même le fichier final pour me donner un aperçu. Là c'est assez compliqué à comprendre pour moi.
Quelques améliorations en attendant, pour enregistrer le classeur sous le nom de final.xls et refermer AA et BB à la fin des traitements :
Dim wkb_AA As Workbook, wkb_BB As Workbook
Sub completer()
Application.ScreenUpdating = False
Dim position As Worksheet
Set position = ThisWorkbook.ActiveSheet
nettoyer
ouvrir_fichiers
lancer_copie
enregistrer_copie
position.Activate
End Sub
Private Sub nettoyer()
Range(Cells(6, 1), Cells(6, 4)).Select
Range(Selection, Selection.End(xlDown)).Clear
End Sub
Private Sub ouvrir_fichiers()
Set wkb_AA = Workbooks.Open(ThisWorkbook.Path & "\ClasseurAA.xls")
Set wkb_BB = Workbooks.Open(ThisWorkbook.Path & "\ClasseurBB.xls")
End Sub
Private Sub lancer_copie()
Dim i As Long, j As Long
i = 6
wkb_AA.Worksheets("Feuil1").Activate
Call copie("N°voiture", 2, i)
j = i
wkb_BB.Worksheets("Feuil1").Activate
Call copie("N°voiture", 2, i)
Call copie("ventes", 1, j)
End Sub
Private Sub copie(ByVal chaine As String, ByVal numcol As Byte, ByRef i As Long)
Dim valeur As String, pos As Worksheet
Set pos = ActiveSheet
For colonne = 1 To Cells(4, Cells.Columns.Count).End(xlToLeft).Column
valeur = Replace(Cells(4, colonne).Value, " ", "")
If valeur = chaine Then
Range(Cells(5, colonne), Cells(Range("A" & Rows.Count).End(xlUp).Row, colonne)).Copy
ThisWorkbook.Worksheets("Feuil1").Activate
Cells(i, numcol).Select
ActiveSheet.Paste
i = i + Selection.Rows.Count
pos.Activate
Exit For
End If
Next
End Sub
Private Sub enregistrer_copie()
Application.DisplayAlerts = False
FermerClasseur ("ClasseurAA.xls")
FermerClasseur ("ClasseurBB.xls")
ThisWorkbook.SaveAs ThisWorkbook.Path & "\Final.xls"
Application.DisplayAlerts = True
End Sub
Sub FermerClasseur(nomclasseur As String)
On Error Resume Next
Workbooks(nomclasseur).Close False
End SubTu as raison j'aurais du mieux détailler la situation
Imaginons que je souhaite analyser les données remontées chaque semaine sur les ventes de voitures du secteur auto européen.
Chaque semaine je reçois 2 fichiers .XLS:
- 1 fichier ClasseurAA contenant des données sur les caractéristiques techniques des voitures.
- 1 fichier ClasseurBB contenant des données sur les caractéristiques commerciales de ces voitures.
Le nombre de lignes sur les 2 fichiers est similaires, et la seul colonne que ces 2 fichiers aient en commun est la colonne "N° voiture " (présente en col 1 pour ClasseurBB, et présente en col3 pour classeurAA) pour le reste toutes les colonnes sont différentes mais il y a bien une correspondance entre les données puisque le "N°voiture" est ordonné de la même façon sur les 2 fichier.
Chaque semaine je souhaite faire une analyse résumée des informations contenues dans ces 2 fichiers en mélangeant des information technique et commerciale (certaines colonnes de AA et BB). Pour ce faire, je créais un masque dans lesquelles les intitulés des colonnes sont déjà saisie à la main (c'est mon classeurCC). La chose se complique puisque d'une semaine à l'autre l'ordre des colonnes peut être bouleversé sur les fichiers sources, raison pour laquelle la macro devrait détecté lors de la copie l'intitulé de la colonne plutôt que son adresse dans la grille (je crois que cette difficulté nous l'avons déjà surmontée dans le code).
A chaque fois que je lance la macro, j'aimerais qu'il soit crée un nouveau fichier (donc que la macro me demande dans une boîte de dialogue "enregistrer sous: ....nom.....") qui reprend la structure de mon masque et qui soit allimenté par les donnée contenu dans les 2 fichiers classeurs sources (AA et BB). De cette façon je peux après un temps X faire un retour en allant ouvrir un des fichiers stocké dans un dossier et crée il y a plusieurs semaines (j’intitulerais par exemple les fichier: Analyse_semaine1 , Analyse_semaine2, Analyse_semaine3, etc...)
Comme tu me l'a demandé j'ai réédité mes 3 fichiers pour que mes intentions soient je l’espéré un poil plus claires
ClasseurCC :
1ere colonne "ventes" : alimentée par classeurBB 4eme colonne
2ème colonne "N°voiture" : alimentée par classeurBB 1ere colonne ou classeurAA 3eme colonne (indifférent)
3ème colonne "origine" : alimentée par classeurBB 3èeme colonne (coïncidence si le numéro de colonne est le même entre source et destination)
4ème colonne "nombre de porte" : alimentée par classeurAA 1ère colonne
5ème colonne :
6ème colonne:
7ème colonne:
Ce dernier point est reprit dans le code suivant, et j'avoue avoir encore des difficultés pour comprendre comment enchainé pour la suite de mes colonnes.
Private Sub lancer_copie()
Dim i As Long, j As Long
i = 6 ' numéro de la ligne où copier le résultat
wkb_AA.Worksheets("Feuil1").Activate
Call copie("N°voiture", 2, i)
j = i
wkb_BB.Worksheets("Feuil1").Activate
Call copie("N°voiture", 2, i)
Call copie("ventes", 1, j)
End SubJe m'y replonge de suite dans la compréhension d'ailleurs
Aie la sous procédure nettoyage... je comprends pas son rôle
Un colossale merci en attendant
edit 1 : j'ai joins les fichiers relooké en complément des détails
edit2: je pense avoir compris l'intéret de la procédure de nettoyage, et dans le code ...
Private Sub nettoyer()
Range(Cells(6, 1), Cells(6, 4)).Select
Range(Selection, Selection.End(xlDown)).Clear
End Subil faudra que je change le 4 par le nombre de colonne que mon fichier de déstination ClasseurCC contiendra (à vu de nez ça doit être 180)
edit3: je crois avoir compris comment alimenter mon classeurCC, je test voir