Regrouper des données dans un fichier unique

oracle7

XLDnaute Nouveau
Bonjour à tous,

Voici mon problème :

1 - J'ai 3 (mais il pourrait y en avoir plus) fichiers de données dont la structure est identique, chacun étant relatif à un domaine de données spécifique. (Ex : Données propres à un département d'une société). Chaque fichier est renseigné indépendamment.

2 - Chaque fichier comporte plusieurs onglets nommés respectivement de ma même façon. (Ex : Un onglet par et pour un service donné).

3 - Chaque onglet possède un nombre de colonnes de données différent mais chaque onglet possède aussi des colonnes "communes" avec les autres onglets càd avec le même type d'information mais qui sont différentes d'un domaine à l'autre.
Soit :
onglet SYS : colonnes ABCFGKM
onglet ING : colonnes ABEDFHJKLOPQR
onglet ACH : colonnes ACDHIJKOR
onglet QUA : colonnes AEFILMS
... etc ...
onglet PRO : colonnes AQRS
(Chaque lettre représente l'intitulé ou nom de la colonne)
Tous les onglets ont à minima la colonne "A" de commune.

4 - Le nombre de lignes de chaque onglet est bien évidemment variable de l'un à l'autre et d'un fichier à l'autre pour un même onglet.

5 - Afin de créer une base de données globale pour en extraire ensuite tout un tas de stats, je souhaite regrouper à intervalles réguliers (tous les 3 mois par ex) dans un fichier unique comportant un seul onglet, l'ensemble des données des tous les fichiers en mettant toutes les lignes les unes à la suite des autres. (jusque là, çà va encore je peux y arriver moi même)
Mais surtout je souhaiterai que l'ensemble des types d'informations soient représentés dans ce tableau de compilation.
Donc au final l'entête de mon fichier de compilation serait du type : colonnes ABCDEFGHIJKLMOPQRS.

6 - Autant j'arrive à programmer la recherche, puis l'ouverture des fichier et mettre en place la boucle qui va bien sur les onglets, autant je butte sur la façon la plus efficace qui soit pour lire les données lignes à lignes d'une part mais et surtout sur la façon de recopier au bon endroit (comme décrit à la fin du point 5), pour chaque ligne et selon l'onglet traité, les données dans le fichier de compilation final d'autre part.
J'ai bien pensé à mettre les plages de données de chaque feuilles dans un tableau (pour éviter les énumérations qui sont lentes) mais je ne vois pas comment recopier à coup sûr ces éléments de tableau dans la bonne case de destination.

Je joins ici un bout de code simplifié de ce que je voudrais faire :
Code:
Sub P_CompilerDonnees()
    
    Dim Entree As Workbook, Sortie As Workbook
    Dim Feuille As Worksheet
    Dim Lstfichiers() As String
    Dim Mondossier As String
    
    Set Sortie = ActiveWorkbook
    ' On désigne le répertoire (dossier) contenant les fichiers XLS d'extraction _
      et spécifiques à chaque département.
    Mondossier = F_SelectionDossier
    ' On en extrait la liste des fichiers XLS à traiter
    If Mondossier <> "" Then
        Lstfichiers = F_ListeFichiersDuDossier(Mondossier)
        If F_TableauNonVide(Lstfichiers) Then
    ' Pour chaque fichier XLS du dossier
            For Each Fichier In Lstfichiers
    ' A partir du second fichier et suivants, on ajoute les lignes à la suite dans 'Sortie'
                Set Entree = Workbooks.Open(Fichier, ReadOnly:=True)
    ' Pour chaque feuille du fichier
                For Each Feuille In Entree.Worksheets
    ' Attention traiter ici chaque feuille spécifiquement puisque chacune n'a pas le même nombre de colonnes  !
                    Select Case Feuille.Name
                        Case "SYS"
                            With Entree.Worksheets("SYS")
    ' Pour chaque ligne de la feuille --> recopier les cellules de la ligne _
      au bon endroit dans "Sortie"
                               [COLOR="Red"] '????? là je ne sais plus faire !!! _
                                 du moins je ne vois pas comment faire ?????[/COLOR]
                            End With
                        Case "ING"
    ' idem
                            With Entree.Worksheets("ING")
                                '?????
                            End With
                        Case "..."
                    'etc...
                    End Select
                Next Feuille
                Entree.Close
            Next Fichier
        End If
    End If
    Sortie.Close
End Sub
Il y a là un problème d'algorithmie qui m'échappe. Ce d'autant plus que la procédure qui fera ce travail doit être la plus rapide possible compte tenu du volume important de données à traiter.

Aussi, je fais appel aux bonnes âmes et experts de ce forum pour bien vouloir SVP m'aider.
Je suis plus à la recherche d'une aide méthodologique mais si en plus il y a un bout de code de principe pour m'éviter la feuille blanche ce serait la cerise sur le gâteau pour au moins démarrer et affiner par moi même ce projet !

En espérant avoir été suffisamment explicite, d'avance MERCI à tous ceux qui voudrons bien se pencher sur ce problème. Il y a là un bel exercice de style ... Mais ce n'est que mon avis ...

PS : Je précise que je débute en VBA, et c'est pas vraiment évident pour moi de comprendre la complexité de ce langage de part la multitude des fonctions existantes. Cela rentre doucement mais pas facile, mes neurones ne sont plus ce qu'ils étaient ...

Cordialement
oracle7:):):)
 

ROGER2327

XLDnaute Barbatruc
Re : Regrouper des données dans un fichier unique

Bonjour oracle7
Ce n'est pas une réponse complète à votre attente, mais un exemple de code permettant de regrouper des données de différents sources (dans le classeur joint, les cinq premières feuilles du classeur) dans une feuille RECAP. Les colonnes de chaque feuille ayant un ou des titres identiques au titres des colonnes de la feuille RECAP sont prises en compte. Les autres colonnes sont ignorées.
Code:
[COLOR="DarkSlateGray"][B]Sub recap()
Dim Sources, Champs, oSrc, oEqu
Dim i&, j&, k&, uoEqu2&, uChamps1&, uChamps2&
'
   With Sheets("RECAP") [COLOR="SeaGreen"]'Feuille de destination[/COLOR]
      Sources = Array("Feuil1", "Feuil2", "Feuil3", "Feuil4", "Feuil5")[COLOR="SeaGreen"] 'Données à regrouper[/COLOR]
      Champs = .Range("A1").Resize(1, .Range("A1").End(xlToRight).Column).Value [COLOR="SeaGreen"]'Intitulés des champs de la feuille RECAP[/COLOR]
      Champs = WorksheetFunction.Transpose(Champs)
      uChamps1 = UBound(Champs, 1)
      For i = 0 To UBound(Sources)
         oSrc = Sheets(Sources(i)).Range("A1").CurrentRegion.Value
         ReDim oEqu(1 To 2, 1 To 1)
         For j = 1 To UBound(oSrc, 2)
            For k = 1 To uChamps1
               If oSrc(1, j) = Champs(k, 1) Then
                  ReDim Preserve oEqu(1 To 2, 1 To 1 + UBound(oEqu, 2))
                  oEqu(1, UBound(oEqu, 2)) = k
                  oEqu(2, UBound(oEqu, 2)) = j
               End If
            Next k
         Next j
         uoEqu2 = UBound(oEqu, 2)
         For j = 2 To UBound(oSrc, 1)
            ReDim Preserve Champs(1 To uChamps1, 1 To 1 + UBound(Champs, 2))
            uChamps2 = UBound(Champs, 2)
            For k = 2 To uoEqu2
               Champs(oEqu(1, k), uChamps2) = oSrc(j, oEqu(2, k))
            Next k
         Next j
      Next i
      Champs = WorksheetFunction.Transpose(Champs)
      .Range("A1").Resize(.Rows.Count, uChamps1).ClearContents
      .Range("A1").Resize(uChamps2, uChamps1).Value = Champs
   End With
End Sub[/B][/COLOR]
Ce code est dans le module Oracle7 du classeur joint.​
ROGER2327
#3204
 

Pièces jointes

  • Regroupement_Oracle7_3204.xls
    30.5 KB · Affichages: 148

oracle7

XLDnaute Nouveau
Re : Regrouper des données dans un fichier unique

Bonsoir ROGER2327

1 - Merci de ton aide avec cet exemple d'algorithme.

2 - Je vais l'analyser finement pour bien le comprendre car il y a là bien des notions employées que je ne connaissais pas. Au passage, c'est à chaque un pur régal de voir la qualité du code que tu proposes si gentiment en réponse à nos sollicitations.

Après un premier examen rapide, cela semble correspondre tout à fait à mon besoin même si pour toi la réponse n'est pas complète aux vues de mes attentes. Je regarde donc plus précisément comment l'adapter à ma procédure et reviens vers toi pour te dire ce qu'il en est.

3 - Pardonne STP mon ignorance mais je découvre dans ton code une notation que je n'ai pas encore rencontrée : "Dim i&, j&, k&, ....". Que signifie le suffixe "&" pour chaque variable ?

MERCI encore de ton aide et à bientôt.
Cordialement
oracle7 :):):)
 

ROGER2327

XLDnaute Barbatruc
Re : Regrouper des données dans un fichier unique

Re...
Tant mieux si ma contribution peut vous être utile.
Je n'ai pas commenté le code car c'est en général assez long à faire et que ça n'a d'intérêt que pour ceux qui s'y intéressent réellement, ce qui semble être votre cas. Si vous le souhaitez, je le ferai.

Grossièrement, la structure du code est la suivante : dans le tableau Champs, on place initialement la première ligne de la feuille RECAP.
Dans le tableau oSrc, on place successivement le contenu des feuilles à traiter.
Dans la première boucle For j... Next j, on établit une table de correspondance entre les colonnes de la feuille en cours de traitement et les colonnes de la feuille RECAP. Cette table de correspondance est stockée dans le tableau oEqu.
Dans la deuxième boucle For j... Next j, on transfère les données de la feuille en cours de traitement dans le tableau Champs à l'aide du tableau oEqu.
Lorsque toutes les feuilles sont traitées, on dépose le contenu du tableau Champs dans le feuille RECAP.

Pour répondre à votre troisième point, la perluète qui suit le nom d'une variable dans une ligne de déclaration est un typage : i& équivaut à i as Long.​
ROGER2327
#3206
 

JCGL

XLDnaute Barbatruc
Re : Regrouper des données dans un fichier unique

Bonjour à tous,
Salut Roger,

Je ne commenterais pas le choix de FT sur le choix de la ligature... Un procès est en cours... Pour d'autres raisons...

Etymologie : est-ce perluète ou esperluète ?


L'esperluète c'est ça : &.
Ce signe que l'on appelle également "et commercial".
C'est une ligature (signe composé de plusieurs lettres liées) entre le E et le T, qui forme une abréviation.
La plus ancienne trace figure sur un fragment de papyrus datant d'environ 45 après J.-C. dans le style de la cursive. Dès l'époque mérovingienne, ce signe est régulièrement utilisé par les scribes.
Tous les calligraphes et les grands créateurs de caractères ont ensuite perpétué cette tradition au fil des siècles. Lors de la création d'une nouvelle police de caractères, le concepteur peut en effet exprimer pleinement sa créativité et son sens artistiques dans l'esperluette dont les formes sont déclinées dans une infinie variété.

Pourquoi ce nom ?
Avant le XIXe siècle, cette abréviation était intégrée à l'alphabet, en 26e position, après le Z.
Elle était prononcée à la façon latine : ète. Les écoliers qui récitaient leur alphabet terminaient ainsi : … ixe, igrec, zède, ète, et plaisantaient en ajoutant perluète, esperluète ou pirlouète. D'autres étymologies sont avancées, mais celle-ci est la plus ludique !

L'esperluète au goût du jour
Ce signe typographique, non verbal, traité en deux teintes d'orange, est le nouveau logo France Telecom.
Il a été choisi car le "et commercial" évoque la relation, la liaison et le commerce.
C'est effectivement la figure d'un nœud qui symbolise l'union.
Selon les créateurs du logo, la symbolique de l'esperluète est puissante et universelle.


Sources
Pour tout l'or des mots - Claude Gagnière
Étapes graphiques N°65


A+ à tous
 

ROGER2327

XLDnaute Barbatruc
Re : Regrouper des données dans un fichier unique

Re...
Bonsoir à tous
(...)

Etymologie : est-ce perluète ou esperluète ?

(...)
Mon cher JCGL, je crois qu'on s'est joué de vous ! La perluète, tout le monde devrait le savoir, a une tout autre origine.
Elle doit son nom au Père Luette, prêcheur du XIIème siècle dont les exploits sont trop nombreux et trop célèbres pour qu'il soit nécessaire de les conter ici. On rappellera seulement sa participation à la IIIème croisade qui vit sa fin tragique en 1190 : en compagnie de l'Empereur Frédéric Ier Barberousse, il décida un jour de piquer une tête dans les eaux du Sélef, défiant l'Empereur de le suivre.

Ce à quoi Barberousse répondit en rigolant :
«Espère, Luette !»

Le bon Père plongea donc seul et fut pris d'hydrocution. L'empereur, qui avait beaucoup d'affection pour lui, tenta vainement de le sauver en plongeant tout de go. Malheureusement un tourbillon les emporta tous les deux. Cet évènement funeste fut le signal de la débandade des troupes de l'empereur qui rebroussèrent chemin, et la fin de la troisième croisade...

Mais revenons à notre bon Père : lorsqu'on repêcha un peu plus tard les noyés, on s'aperçut que le Père Luette (qu'on appelait familièrement père Luette jusqu'à ce triste jour) avait été richement doté par la Nature ; bien qu'il ne fût ni saint, ni martyr, les soldats firent des reliques de ses restes, et on ne parla plus depuis ce temps que de la paire Luette. On a malheureusement perdu la trace de ces reliques dont on dit qu'elles furent longtemps conservées dans la crypte d'une chapelle de Ratisbonne avant d'être transférées à Rome (ce que personne ne peut attester, hélas), et, les siècles passant, la corruption de la langue fit que l'expression devint pour certains la perluète, pour d'autres l'esperluette...

Ceci dit, je vois arriver ces deux infirmiers qui veulent me faire prendre des douches froides à tout bout de champ... Il est temps que je me sauve !

ROGER2327
#3208
 

JCGL

XLDnaute Barbatruc
Re : Regrouper des données dans un fichier unique

Bonjour à tous,

Merci mon cher Roger pour cette explication.

Dorénavant, je ne croirai plus tout ce que je peux lire sans penser à la Troisième Croisade...

Tu n'as pas un un fait historique, de le même veine, sur Richard Cœur de Lion ou sur Saladin ?

A++ mon cher historien érudit :)

A+ à tous
 

ROGER2327

XLDnaute Barbatruc
Re : Regrouper des données dans un fichier unique

Bonsoir JCGL
(...)

Dorénavant, je ne croirai plus tout ce que je peux lire sans penser à la Troisième Croisade...
(...)
Je l'espère bien !
(...)

Tu n'as pas un un fait historique, de le même veine, sur Richard Cœur de Lion ou sur Saladin ?

(...)
Pas un : des centaines au bas mot !

Mais il faudrait que ces bougres d'infirmiers me lâchassent la perluète plutôt que de me poursuivre avec leur bêche...
ROGER2327
#3222
 

oracle7

XLDnaute Nouveau
Re : Regrouper des données dans un fichier unique

Bonsoir ROGER2327

Avec ton complément d'explications sur le code que tu as proposé, c'est bien la réponse à mes attentes.

Je te remercie encore vivement pour ton aide.
A bientôt peut être sur le forum.

Cordialement
oracle7 :):):)

PS : J'adore l'humour du Père Luette ...
 

gillesbe

XLDnaute Nouveau
Re : Regrouper des données dans un fichier unique

Bonsoir
merci pour ce cours de programation
Quel code puis je ajouter si mes sources sont externes (autres fichiers dans un même repertoire) avec la volonté d'importer que 5 specifiques colonnes
cordialement
gilles
 

Discussions similaires

Statistiques des forums

Discussions
311 740
Messages
2 082 047
Membres
101 880
dernier inscrit
Anton_2024