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 - compiler des données : boucler sur tous les onglets de plusieurs fichiers


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Qualité comptable
    Inscrit en
    Avril 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Qualité comptable
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2014
    Messages : 26
    Par défaut VBA - compiler des données : boucler sur tous les onglets de plusieurs fichiers
    Bonjour,

    J'aimerai récupérer dans données de plusieurs onglets dans plusieurs fichiers pour les coller dans un fichier récap (appelé dans mon code "compilation consolidation.xls"). Les données doivent s'incrémenter dans un tableau les unes à la suite des autres.
    Il me semble que j'arrive à boucler sur les différents dossiers, mais pas sur les onglets.
    J'ai l'impression d'etre près du but mais je bloque. Si quelqu'un pouvait m'aider je lui en serais reconnaissant.

    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
    Sub Récup_données()
    pfile = ActiveWorkbook.Path & "\" & Range("b2") & "\" 'chemin du répertoire
    nfile = Dir(pfile)
    Dim i As Integer
    Dim LFinTab As Integer
    Dim CFinTab As Integer
    Application.ScreenUpdating = False
     
    Do Until nfile = ""
        For i = 1 To Worksheets.Count
            LFinTab = Range("B6000").End(xlUp).Row
            CFinTab = Range("Z9").End(xlUp).Column
            Workbooks("Consolidation compilation.xlsm").Worksheet("sheet1").Range("B" & LFinTab) = Workbooks(nfile).Worksheet("sheet" & i).Range("A6")
            Workbooks("Consolidation compilation.xlsm").Worksheet("sheet1").Range("C" & LFinTab) = Workbooks(nfile).Worksheet("sheet" & i).Range("A9")
            Workbooks("Consolidation compilation.xlsm").Worksheet("sheet1").Range("D" & LFinTab) = Workbooks(nfile).Worksheet("sheet" & i).Range(CFinTab & "8")
            Workbooks("Consolidation compilation.xlsm").Worksheet("sheet1").Range("E" & LFinTab) = Workbooks(nfile).Worksheet("sheet" & i).Range(CFinTab & "9")
     
            Workbooks("Consolidation compilation.xlsm").Worksheet("sheet1").Range("B" & LFinTab) = Workbooks(nfile).Worksheet("sheet" & i).Range("A6")
            Workbooks("Consolidation compilation.xlsm").Worksheet("sheet1").Range("C" & LFinTab) = Workbooks(nfile).Worksheet("sheet" & i).Range("A10")
            Workbooks("Consolidation compilation.xlsm").Worksheet("sheet1").Range("D" & LFinTab) = Workbooks(nfile).Worksheet("sheet" & i).Range(CFinTab & "8")
            Workbooks("Consolidation compilation.xlsm").Worksheet("sheet1").Range("E" & LFinTab) = Workbooks(nfile).Worksheet("sheet" & i).Range(CFinTab & "10")
     
            nfile = Dir()
        Next i
    Loop
    With Range("A2:U" & Range("B65000").End(xlUp).Row)
        .Value = .Value
    End With
     
    End Sub
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Pour que ton code fonctionne, il faudrait modifier plusieurs éléments.

    D'abord, en début de ta boucle Do (entre le Do et le For), il faudrait ouvrir le fichier en question) avec un Workbooks.Open.
    Avoir repéré son nom, c'est bien mais pour accéder à ses données, il ne faut pas oublier de l'ouvrir.

    Ensuite, dans ton For To, il faudrait indiquer que le nombre d'onglets à scruter est celui du fichier que tu viens d'ouvrir.
    Un simple Worksheets.Count donne le nombre d'onglets du fichier actif.
    Remarque... si tu viens juste d'ouvrir le fichier source (voir remarque précédente), il devrait être le fichier actif. Et du coup, pas besoin d'indiquer Workbooks(nfile) dans les lignes de transfert de données.

    Enfin, pour accéder à un onglet par son numéro, il suffit de mettre dans Worksheets ce numéro.
    Donc pas de Worksheets("sheet" & i) mais simplement Worksheets(i).
    Remarque au passage qu'il y a un "s" à Worksheets parque tu prends un indice de la collection de l'ensemble des onglets.

    Mais il y a plus simple que ton For To : un For Each.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim MonOnglet As Worksheet
    For Each MonOnglet In Worksheets
     
       ... le code ...
     
    Next MonOnglet
    Avec ça, la variable MonOnglet contient une référence directe à la feuille en question et tu peux y accéder simplement, par exemple pour la cellule A6, ainsi :
    Pas besoin d'ajouter la référence Workbook à cette variable (ou alors il faut le faire au Worksheets du For Each) vu qu'il est contenu dans la référence (on ne pointe pas sur un onglet portant ce nom mais véritablement sur cet onglet unique avec toutes ses références parents et enfants).

  3. #3
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Une fonction "clé sur porte" proposée dans cette contribution titrée Regrouper plusieurs feuilles sur une autre. (2003-2010)
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  4. #4
    Membre averti
    Homme Profil pro
    Qualité comptable
    Inscrit en
    Avril 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Qualité comptable
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2014
    Messages : 26
    Par défaut
    Merci Menhir pour cette réponse pertinente et très rapide :-)

    Après modif suite à tes conseils, voici la macro qui fonctionne

    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
    Sub Récup_données()
    pfile = ActiveWorkbook.Path & "\" & Range("b2") & "\" 'chemin du répertoire
    nfile = Dir(pfile)
    Dim i As Integer
    Dim LFinTab As Integer
    Dim CFinTab As Integer
    Dim MonOnglet As Worksheet
     
     
    Do Until nfile = ""
     Workbooks.Open pfile & nfile
        For Each MonOnglet In Worksheets
            LFinTab = Workbooks("Consolidation compilation.xlsm").Worksheets("données").Range("B" & Rows.Count).End(xlUp).Row + 1
            CFinTab = MonOnglet.Cells(9, Columns.Count).End(xlToLeft).Column
            Workbooks("Consolidation compilation.xlsm").Worksheets("données").Range("B" & LFinTab) = MonOnglet.Range("A6")
            Workbooks("Consolidation compilation.xlsm").Worksheets("données").Range("C" & LFinTab) = MonOnglet.Range("A9")
            Workbooks("Consolidation compilation.xlsm").Worksheets("données").Range("D" & LFinTab) = MonOnglet.Cells(8, CFinTab)
            Workbooks("Consolidation compilation.xlsm").Worksheets("données").Range("E" & LFinTab) = MonOnglet.Cells(9, CFinTab)
            LFinTab = LFinTab + 1
            Workbooks("Consolidation compilation.xlsm").Worksheets("données").Range("B" & LFinTab) = MonOnglet.Range("A6")
            Workbooks("Consolidation compilation.xlsm").Worksheets("données").Range("C" & LFinTab) = MonOnglet.Range("A10")
            Workbooks("Consolidation compilation.xlsm").Worksheets("données").Range("D" & LFinTab) = MonOnglet.Cells(8, CFinTab)
            Workbooks("Consolidation compilation.xlsm").Worksheets("données").Range("E" & LFinTab) = MonOnglet.Cells(10, CFinTab)
        Next MonOnglet
    Workbooks(nfile).Close
    nfile = Dir()
    Loop
    With Range("A2:U" & Range("B65000").End(xlUp).Row)
        .Value = .Value
    End With
    Application.ScreenUpdating = False
    End Sub
    Un grand merci à toi et à tous ceux qui participent au fonctionnement de ce forum

  5. #5
    Membre averti
    Homme Profil pro
    Qualité comptable
    Inscrit en
    Avril 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Qualité comptable
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2014
    Messages : 26
    Par défaut
    Super travail que tu proposes Philippe ! :-)
    Tu as du faire bcp d'heureux avec cette macro.
    Je l'ai téléchargée et mise de côté. Ça pourra surement me servir.
    Pour cette fois-ci, j'ai préféré améliorer ma macro avec les conseils de Menhir (comme tu peux le voir dans le message précédent) plutôt que d'utiliser la tienne.
    En effet, il faut souvent apporter des petites modifs à une macro pour pouvoir l'adapter à tel ou tel fichier. Or, quand j'ai vu le code de la tienne (code de pro), je me suis dis que je ne pourrai pas la modifier par moi-même (par exemple pour indiquer que les données des feuilles à copier ne commencent pas en A1).

    Bravo pour le travail que tous les pros comme toi fournissent sur ce forum.

    Bonne continuation

  6. #6
    Membre averti
    Homme Profil pro
    Qualité comptable
    Inscrit en
    Avril 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Qualité comptable
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2014
    Messages : 26
    Par défaut
    Citation Envoyé par Menhir Voir le message
    en début de ta boucle Do (entre le Do et le For), il faudrait ouvrir le fichier en question) avec un Workbooks.Open.
    Avoir repéré son nom, c'est bien mais pour accéder à ses données, il ne faut pas oublier de l'ouvrir.
    Je ne voulais justement pas passer par l'ouverture des fichiers. Quelque part dans ce forum, j'avais lu qu'il fallait mieux ne pas ouvrir les fichiers, ni faire de copier/coller, mais utiliser le code "cellule = cellule" qui permettait ainsi un gros gain de temps dans l'exécution de la macro

  7. #7
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Joeytriviani Voir le message
    Après modif suite à tes conseils, voici la macro qui fonctionne
    Tant mieux pour toi.

    A ta place, j'aurais mis un With Workbooks("Consolidation compilation.xlsm").Worksheets("données") juste après la ligne For Each pour éviter de répéter sur plusieurs lignes cette longue séquence.
    https://msdn.microsoft.com/fr-fr/VBA...with-statement

    Je ne vois pas trop non plus l'intérêt de tes lignes 28 à 30 vu que ton transfert de données par "=" se fait déjà de valeur à valeur.

    Citation Envoyé par Joeytriviani Voir le message
    Je ne voulais justement pas passer par l'ouverture des fichiers. Quelque part dans ce forum, j'avais lu qu'il fallait mieux ne pas ouvrir les fichiers, ni faire de copier/coller, mais utiliser le code "cellule = cellule" qui permettait ainsi un gros gain de temps dans l'exécution de la macro
    Il est impossible d'accéder aux données d'un fichier (quel qu'il soit) sans l'ouvrir.
    Même les méthodes qui permettent d'éviter l'ouverture par Excel font quand même une ouverture sous une autre forme.

    Pour ce qui est du copier/coller, je ne sais pas dans quelle discussion tu as vus qu'il fallait les éviter mais c'est un conseil qui me semble étrange.
    Etant donné le peu de cellules copiées pour chaque fichier, je doute que ça ait un impact significatif sur le temps de traitement.
    C'est surtout les Select/Selection qu'il faut éviter dans ce type de manipulation.
    Cela dit, la méthode que tu as utilisé est tout à fait correct si tu ne veux transmettre que des valeurs.

  8. #8
    Membre averti
    Homme Profil pro
    Qualité comptable
    Inscrit en
    Avril 2014
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Qualité comptable
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2014
    Messages : 26
    Par défaut
    Citation Envoyé par Menhir Voir le message
    Même les méthodes qui permettent d'éviter l'ouverture par Excel font quand même une ouverture sous une autre forme.
    Pourrais-tu mentionner une de ces méthodes d'ouverture "sous une autre forme" ? Peut être pourrais-je l'utiliser dans ce cas.

    Pour les lignes 28 à 30, que tu m'indiques comme inutiles, il me semble que sans ça, ça peut coller des formules, non ?

  9. #9
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Joeytriviani Voir le message
    Pourrais-tu mentionner une de ces méthodes d'ouverture "sous une autre forme" ? Peut être pourrais-je l'utiliser dans ce cas.
    Tu veux essayer de faire des looping avant de maitriser le vol à l'horizontale ???

    Si tu veux t'y essayer, c'est à tes risques et périls :
    https://excel.developpez.com/faq/?pa...lasseursFermes

    Pour les lignes 28 à 30, que tu m'indiques comme inutiles, il me semble que sans ça, ça peut coller des formules, non ?
    Enlèves-les et tu pourras constater que ce sont les valeurs qui sont transmises.

    Si tu veux te rassurer, tu peux remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Workbooks("Consolidation compilation.xlsm").Worksheets("données").Range("B" & LFinTab) = MonOnglet.Range("A6")
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            Workbooks("Consolidation compilation.xlsm").Worksheets("données").Range("B" & LFinTab).Value = MonOnglet.Range("A6").Value
    Mais je pense que ce n'est pas indispensable.

Discussions similaires

  1. Boucler sur tous les onglets d'un fichier Excel
    Par CocoAntoine dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/03/2012, 13h08
  2. Exécuter une macro sur tous les onglets d'un fichier sauf un
    Par Marsama dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/04/2011, 17h38
  3. Réponses: 3
    Dernier message: 26/06/2008, 13h47
  4. boucler sur tous les optionbutton d une feuille de calcul
    Par patbou dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/03/2008, 19h48
  5. Boucler sur tous les criteres d'un filtre
    Par rappanah dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 16/11/2007, 00h59

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