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 :
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
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
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