Fusion classeurs "fils" / classeur "père" trop compliquée

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 !

nounbxl76

XLDnaute Occasionnel
Bonjour le forum,

Une nouvelle fois je viens vers vous car mes compétences en Excel et VBA ne sont toujours pas si étoffées. Il y a quelques temps, j'avais réussi à monter une super BDD avec votre aide (encore merci Bebere 🙂 ) mais aujourd'hui ce n'est plus suffisant...ah, les éternels insatisfaits !!!
Aujourd'hui, je cherche à collecter, dans un classeur "père", différentes infos provenant de différents classeurs "fils" mais c'est bien trop compliqué pour moi...En gros, grâce à un bouton de commande situé sur le classeur "père", j'irai chercher des infos dans les classeurs "fils", tous les classeurs étant situés dans le même folder. Le problème est qu'il y a de très nombreuses particularités...je joins un petit fichier explicatif pour donner plus d'explications aux plus téméraires et sûrement chevronnés...à terme je tenterais d'avoir uniquement un classeur "père" et un seul classeur "fils" mais pour le moment c'est un puzzle que je dois reconstituer.

Merci par avance pour votre aide. Bonne journée.

PS : je dispose du classeur "père" et des classeurs "fils"
 

Pièces jointes

Re : Fusion classeurs "fils" / classeur "père" trop compliquée

Bonjour,

petites précisions :
Y a-t-il d'autres fichiers excel dans le répertoire dans lequel sont placés les fichiers Fils à part le fichier Père ?
Les fichiers Fils s'appelleront-ils systématiquement secteur*.xls ?
Les données dans les fichiers Fils sont-elles placées toujours dans la même feuille, à partir de la même cellule ? (Par exemple feuille 1 à partir de C3...)
 
Dernière édition:
Re : Fusion classeurs "fils" / classeur "père" trop compliquée

je ferai en sorte qu'il n'y ait pas d'autres fichiers xls dans le folder et normalement les fichiers "fils" seront appelés par leur vrai nom de secteur du genre "compta", "magasin", "garage", "toto"...
 
Re : Fusion classeurs "fils" / classeur "père" trop compliquée

re,
Les données dans les fichiers Fils sont-elles placées toujours dans la même feuille, à partir de la même cellule ? (Par exemple feuille 1 à partir de C3...)

L'exemple suivant ouvre chaque fichier fils, affiche le contenu de la cellule C3 de la feuille 1. Tu dois pouvoir t'inspirer de ceci pour mener à bien ton projet.
VB:
Sub test()
Dim nFich As String 'Nom du fichier
Dim Chemin As String 'Chemin
Dim wb As Workbook ' Objet classeur à ouvrir

Chemin = ThisWorkbook.Path

Application.ScreenUpdating = False
Application.DisplayAlerts = False

nFich = Dir(Chemin & "\*.xls") 'Liste des fichiers fils+père
Do While nFich <> "" 'Boucle sur chaque fichier
  nFich = Dir
  If nFich <> ThisWorkbook.Name Then 'Ignorer le fichier père
    Set wb = Workbooks.Open(Chemin & "\" & nFich) 'ouverture

    MsgBox wb.Sheets(1).Range("C3") 'Affichage cellule C3, placer le code qui correspond à ton besoin ici

    wb.Close False 'fermeture
  End If
Loop

Application.ScreenUpdating = True
Application.DisplayAlerts = True

End Sub
 
Dernière édition:
Re : Fusion classeurs "fils" / classeur "père" trop compliquée

bonjour,

on manque de pas mal d'éléments pour t'aider à résoudre ton problème, mais à priori, tu dois pouvoir t'en sortir ainsi :

On va supposer que tes tableaux à reporter sont en feuille 1 (à adapter) :
tu remplaces
VB:
MsgBox wb.Sheets(1).Range("C3") 'Affichage cellule C3, placer le code qui correspond à ton besoin ici
par

VB:
dim c as range
set c=wb.sheets(1).find(what:="N° EV", lookin:=xlvalues, lookat:= xlwhole).offset(1,0) 'c est la cellule sous N° EV dans la feuille 1
do while c<>"" 'Répéter pour chaque cellule en dessous tant que non vides
  if nFich = "Test3.xls" and  instr(c.offset(0,1), "STE") =0 then goto 1 ' si y a pas STE pour le fichier Test3 (adapter le nom...), on le copie pas

  'On peut copier la ligne dans ce classeur (ici en feuille 1 dans un tableau qui débute en colonne A)
  c.entirerow.copy ThisWorkbook.Sheets(1).range("A60000").end(xlup).offset(1,0)
  1: Set c=c.offset(1,0) 'on passe à la ligne suivante
Loop

A tester ceci dit...
 
Re : Fusion classeurs "fils" / classeur "père" trop compliquée

re,

en fait c'est plus compliqué que cela, je viens de voir que les lignes copiées ne sont pas dans le même ordre que les originaux.. Vois si tu arrives à adapter, sinon reviens nous le dire.
 
Re : Fusion classeurs "fils" / classeur "père" trop compliquée

Bonsoir Softmama, le forum,

Tout d'abord, quelles seraient les infos "utiles" ?
J'ai testé le code que vous avez fourni mais bug en vue...et je ne vois pas trop la solution... Cela dit, mes compétences en VBA sont sûrement trop limitées. De mon côté, je teste pas mal de petites choses sans vraiment de cohésion/logique donc sans véritablement arriver à un truc top...je suis donc dans l'attente d'une lueur.

Bonne soirée.

Pour rappel, voici le code :
Code:
Sub test()
Dim nFich As String 'Nom du fichier
Dim Chemin As String 'Chemin
Dim wb As Workbook ' Objet classeur à ouvrir

Chemin = ThisWorkbook.Path

Application.ScreenUpdating = False
Application.DisplayAlerts = False

nFich = Dir(Chemin & "\*.xls") 'Liste des fichiers fils+père
Do While nFich <> "" 'Boucle sur chaque fichier
 nFich = Dir
  If nFich <> ThisWorkbook.Name Then 'Ignorer le fichier père
   Set wb = Workbooks.Open(Chemin & "\" & nFich) 'ouverture

    Dim c As Range
Set c = wb.Sheets(1).Find(what:="N° EV", LookIn:=xlValues, lookat:=xlWhole).Offset(1, 0) 'c est la cellule sous N° EV dans la feuille 1
Do While c <> "" 'Répéter pour chaque cellule en dessous tant que non vides
 If nFich = "Test3.xls" And InStr(c.Offset(0, 1), "STE") = 0 Then GoTo 1 ' si y a pas STE pour le fichier Test3 (adapter le nom...), on le copie pas

  'On peut copier la ligne dans ce classeur (ici en feuille 1 dans un tableau qui débute en colonne A)
 c.EntireRow.Copy ThisWorkbook.Sheets(1).Range("A60000").End(xlUp).Offset(1, 0)
1:   Set c = c.Offset(1, 0) 'on passe à la ligne suivante
Loop

    wb.Close False 'fermeture
 End If
Loop

Application.ScreenUpdating = True
Application.DisplayAlerts = True

End Sub
 
Re : Fusion classeurs "fils" / classeur "père" trop compliquée

re,

y a une solution plus simple, je suppose que cette cellule où se trouve "N° EV" est toujours la même ? Si c'est la cellule A12 de la feuille 1, remplace cette ligne qui bugge par :
VB:
Set c = wb.Sheets(1).Range("A12").Offset(1, 0) 'c est la cellule sous N° EV dans la feuille 1

Sinon essaie de modifier ainsi (oublié un .cells):
VB:
Set c = wb.Sheets(1).CELLS.Find(what:="N° EV", LookIn:=xlValues, lookat:=xlWhole).Offset(1, 0) 'c est la cellule sous N° EV dans la feuille 1
 
Dernière édition:
Re : Fusion classeurs "fils" / classeur "père" trop compliquée

J'ai testé le code...voici un petit état des lieux:
- j'ai un petit bug sur le chemin..."erreur '1004'. il me dit que le chemin est introuvable, ce qui me semble bizarre...le fichier "père" et tous les fichiers "fils" sont dans le même folder
- les données sont bien importées des "fils" vers le "père" mais:
> le N° EV ne sont pas triées dans l'ordre croissant
> toutes les colonnes sont accollées alors qu'il y a des colonnes du "père" qui ne doivent pas être complétées et du coup, tout est mélangé...
> après avoir modifié le contenu d'un ou plusieurs fichiers "fils", si je souhaite faire une nouvelle mise à jour du "père", les données sont intégrées en dessous de celles issues de la 1ère mise à jour alors que celles-ci devraient être modifiées
Je joins un mon fichier explicatif car je ne suis pas sûr d'avoir déposé le bon au début du fil 🙄
 
Re : Fusion classeurs "fils" / classeur "père" trop compliquée

Correction du petit oubli...
 

Pièces jointes

Re : Fusion classeurs "fils" / classeur "père" trop compliquée

re,

Ceci semble un peu plus clair maintenant...
Ceci à tester :
VB:
Sub test()
Dim nFich As String 'Nom du fichier
Dim Chemin As String 'Chemin
Dim wb As Workbook ' Objet classeur à ouvrir
Dim c As Range, d As Range

Chemin = ThisWorkbook.Path

Application.ScreenUpdating = False
Application.DisplayAlerts = False

Range("A6:N1000").Clear
nFich = Dir(Chemin & "\*.xls") 'Liste des fichiers fils+père
nFich = Dir
Do While nFich <> "" 'Boucle sur chaque fichier
  If nFich <> ThisWorkbook.Name Then 'Ignorer le fichier père
   Set wb = Workbooks.Open(Chemin & "\" & nFich) 'ouverture

   Set c = wb.Sheets(1).Range("A1").Offset(1, 0) 'c est la cellule sous N° EV dans la feuille 1
   Set d = ThisWorkbook.Sheets(1).Range("A65000").End(xlUp).Offset(1, 0) 'c est la cellule sous N° EV dans la feuille 1
   Do While c <> "" 'Répéter pour chaque cellule en dessous tant que non vides
     If nFich = "Test3.xls" And InStr(c.Offset(0, 1), "STE") = 0 Then GoTo 1 ' si y a pas STE pour le fichier Test3 (adapter le nom...), on le copie pas

     'On peut copier la ligne dans ce classeur (ici en feuille 1 dans un tableau qui débute en colonne A)
     c.Resize(, 2).Copy d
     c.Offset(0, 6).Copy d.Offset(0, 2)
     d.Offset(0, 3) = Split(nFich, ".")(0)
     c.Offset(0, 3).Copy d.Offset(0, 6)
     c.Offset(0, 2).Copy d.Offset(0, 7)
     c.Offset(0, 5).Copy d.Offset(0, 8)
     c.Offset(0, 4).Copy d.Offset(0, 9)
     c.Offset(0, 8).Resize(, 2).Copy d.Offset(0, 11)
     
     Set d = d.Offset(1, 0)
1:   Set c = c.Offset(1, 0) 'on passe à la ligne suivante
Loop

    wb.Close False 'fermeture
 End If
 nFich = Dir
Loop
With ThisWorkbook.Sheets(1)
  .Cells(6, 1).Sort key1:=.Range("A5"), order1:=xlAscending, header:=xlYes
End With

Application.ScreenUpdating = True
Application.DisplayAlerts = True

End Sub
 
Re : Fusion classeurs "fils" / classeur "père" trop compliquée

Bonsoir Softmama, Bonsoir le forum,

Je viens de tester le dernier code fourni par softmama (merci!), comme l'atteste en partie la PJ, voici ce qu'on peut en déduire:
- globalement ça marche, on approche du but 🙂 Les données sont bien reportées des "fils" vers le "père" après un 1er clic
- le format de cellule des cellules du "père" n'est pas forcément respecté. Ex: le format de date des "fils" est en US et le format de date du "père" doit être en format euro. Or il est reporté en format US. De même, je souhaite que la largeur de colonne soit fixée et que ce soit la hauteur de cellule qui soit ajustée avec renvoi à la ligne. Cela dit, le principal problème reste le format de date car pour le reste, je me suis sans doute loupé...
- les EV pour lesquels le champ "autres produits/lots" était complété sur les fichiers "fils", je souhaitais qu'ils soient dupliqués sur le "père". Il eut été idéal d'avoir 3 N° EV 3, 2 N° EV 4, 3 N° EV 6
- après un second clic, on conserve la 1ère ligne intégrée après l'en-tête suite au 1er clic...Distinguo possible grâce à la petite mention "MAJ"
Quel correctif devrait être apporté selon vous?

Bonne soirée !
 

Pièces jointes

  • Sans titre.jpg
    Sans titre.jpg
    82.1 KB · Affichages: 150
  • Sans titre.jpg
    Sans titre.jpg
    82.1 KB · Affichages: 186
  • Sans titre.jpg
    Sans titre.jpg
    82.1 KB · Affichages: 186
- 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
Retour