IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

VBA Regrouper des données dans un fichier unique


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 66
    Par défaut VBA Regrouper des données dans un fichier unique
    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 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.

    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 ames 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
    oracle7556

  2. #2
    Membre émérite Avatar de sabzzz
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 748
    Par défaut
    bonjour oracle7556,

    Autant j'arrive à programmer la recherche, puis l'ouverture des fichier et mettre en place la boucle qui va bien sur les onglets
    ce serait un plus si tu mentionnais la métothe utilisé, stp aide nous à t'aider pour la suite

    j'ai une idée avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For i = 1 To Sheets("temp").Range("IV1").End(xlToLeft).Column 'pour chaque colonne de la feuille temp
    'rechercher ou est situer la colonne de la feuille "temp" dans la feuille "base"
      col = Application.Match(Sheets("Temp").Cells(1, i), Sheets("base").Rows(1), 0)
    Next
    mais il me manque quelque information.

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 66
    Par défaut
    Bonsoir sabzzz

    1 - Merci de BV te pencher sur mon Problème.

    2 - Pour essayer de répondre à tes interrogations, voici un macro code de ce que je veux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    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
                    Set Entree = Workbooks.Open(Fichier, ReadOnly:=True)
        ' Pour chaque feuille du fichier
                    For Each Feuille In Entree.Worksheets
        ' Attention à traiter chaque feuille spécifiquement puisque pas 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"
                                    '????? là je ne sais plus faire !!! _
                                     du moins je ne vois pas comment faire ?????
                                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
    3 - Pour comprendre ton code --> que signifie :
    Range("IV1")
    ??? j'ai du mal à suivre ce point !

    Cordialement
    oracle7

  4. #4
    Membre émérite Avatar de sabzzz
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 748
    Par défaut
    bonjour oracle7556,

    c'est pour trouver la derniere colonne renseignée sur la ligne 1 (ligne de titre)
    correspond aux combinaisons de touches FIN+GAUCHE de la feuille indiqué.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Derniere_Colonne = Sheets("Feuil1").Range("IV1").End(xlToLeft).Column
    correspond aux combinaisons de touches FIN+HAUT de la feuille indiqué.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Derniere_Ligne = Sheets("Feuil1").Range("A65536").End(xlUp).Row

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 66
    Par défaut
    Bonjour sabzzz

    1 - Ok je comprend mieux et j'apprends en même temps ...

    Mais, puisque avec ce code on reproduit le raccourci clavier (dont je ne connaissais la forme programmée) alors si la cellule de la colonne G de mon onglet "SYS" est vide, cela ne sélectionne sur la ligne que les cellules des colonnes ABCF et non pas celles des colonnes ABCFGKM et donc pas toutes les données voulues ! Je me trompe ou pas ?

    2 - Cela dit les infos transmises avec mon bout de code te sont-elles suffisantes pour aller plus loin ?

    Cordialement
    oracle7556

  6. #6
    Membre émérite Avatar de sabzzz
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 748
    Par défaut
    bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Derniere_LigneB = Sheets("base").Range("A65536").End(xlUp).Row + 1
    Derniere_LigneT = Sheets("Temp").Range("A65536").End(xlUp).Row
    'pour chaque titre du fichier "Temp" sur la ligne 1
    'adapter le code si les titres ne sont par sur la ligne 1
    For i = 1 To Sheets("temp").Range("IV1").End(xlToLeft).Column 'pour chaque colonne de la feuille temp
    'rechercher ou est situer la colonne de la feuille "temp" dans la feuille "base"
      col = Application.Match(Sheets("Temp").Cells(1, i), Sheets("base").Rows(1), 0)
    '  et on copie colonne par colonne au bon endroit
      Sheets("Temp").Range(Cells(2, i), Cells(Derniere_LigneT, i)).Copy Sheets("base").Cells(Derniere_LigneB, col)
    Next

  7. #7
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 66
    Par défaut
    Bonsoir sabzzz

    Bon, j'ai analysé ton morceau de code et je me suis permis de remplacer les deux lignes qui déterminent la première ligne vide libre pour commencer l'ajout de données. Càd j'ai supprimé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Derniere_LigneB = Sheets("base").Range("A65536").End(xlUp).Row + 1
    Derniere_LigneT = Sheets("Temp").Range("A65536").End(xlUp).Row
    pour remplacer par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Derniere_LigneB = wsFeuilleSortie.Range("A1").SpecialCells(xlCellTypeLastCell).Row + 1
    Derniere_LigneT = wsFeuilleEntree.Range("A1").SpecialCells(xlCellTypeLastCell).Row
    ainsi les données de chaque feuille que j'importe ne se mélangent pas avec celles de la précédente, ce, en fonction du nombre de lignes de la colonne "A". Trouver la drnière ligne vide en se basant sur la colonne "A" était dans le cas qui m'intéresse, pas adapté car les colonnes de mes feuilles n'ont pas toutes le même nombre de lignes et quand on met bout à bout tout cela çà ne collait plus ! Voir certaines données de la feuille N+1 venaient écraser en partie celles de la feuille N.
    Maintenant avec cette petite adaptation cela répond à mon besoin parfaitement.

    Dans tous les cas, encore MERCI de ton aide pour m'avoir fourni l'astuce du "match" et du "copy" pour recopier mes colonnes de données aux bons endroits.

    Pour moi le post est résolu.

    A bientôt sur le forum ...
    Cordialement
    oracle7

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2007] Web Service SOAP Fichier WSDL / Extraction des données dans un classeur
    Par crusaders dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 08/12/2014, 12h05
  2. Réponses: 8
    Dernier message: 05/07/2013, 10h54
  3. [XML] stocker des données dans un fichier XML
    Par R3iTt0R dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 27/05/2005, 16h51
  4. Réponses: 3
    Dernier message: 22/02/2004, 20h09
  5. Temps d'accès à des données dans un fichier
    Par TONIAPEL dans le forum Assembleur
    Réponses: 5
    Dernier message: 28/09/2003, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo