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 :

copier toutes les feuilles d'un ensemble de fichiers Excel [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Points : 1
    Points
    1
    Par défaut copier toutes les feuilles d'un ensemble de fichiers Excel
    Bonjour,
    J'essaie de copier toutes les feuilles d'un ensemble de fichiers Excel se trouvant dans un même répertoire, dans un fichier Excel de compilation contenant le code suivant.
    Malheureument il ne fonctionne pas comme prévu.
    Quelqu'un pourrait-il m'aider ?
    Merci !
    Dimitri


    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
    Sub Copier()
     
     Chemin = "C:\...\" 'Répertoire où se trouvent les Excel à compiler
     Fichiersource = Dir(Chemin & "*.xlsx") ' Premier fichier à compiler
     Fichiercible = ThisWorkbook.Name ' Fichier de compilation
     
     Do While Fichiersource <> ""
     
        Workbooks(Fichiersource).Activate
     
        For Each Feuille In Workbooks(Fichiersource).Worksheets
     
            Feuille.Copy After:=Workbooks(Fichiercible).Sheets(1)
     
        Next Feuille
     
        Fichiersource = Dir ' Fichier suivant
     Loop
     
    End Sub

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bonjour.

    Ton code suppose que tous les fichiers sont ouverts. Est-ce le cas ?

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Non, au départ tous les fichiers à consolider sont fermés. Seul le fichier de consolidation (celui qui contient le code VBA) est ouvert. Je ne savais pas qu'il faut une manip pour les ouvrir car j'avais essayé mon code avec un seul fichier et ça marchait...

    Merci.
    Dimitri

  4. #4
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Non, il faut les ouvrir :

    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
    Sub Copier()
     
    Chemin = "C:\...\" 'Répertoire où se trouvent les Excel à compiler
    Fichiersource = Dir(Chemin & "*.xlsx") ' Premier fichier à compiler
    Fichiercible = ThisWorkbook.Name ' Fichier de compilation
     
    Do While Fichiersource <> ""
     
    Workbooks.Open Chemin & Fichiersource
     
    For Each Feuille In Workbooks(Fichiersource).Worksheets
     
    Feuille.Copy After:=Workbooks(Fichiercible).Sheets(1)
     
    Next Feuille
     
    Workbooks(Fichiersource).Close False
    Fichiersource = Dir ' Fichier suivant
    Loop
     
    End Sub

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Génial ! Ca marche nickel ! Dire que j'ai passé toute la journée là dessus !
    Je ne sais comment te remercier !
    Dimitri

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Au risque d'abuser de ta gentillesse...

    Maintenant, je cherche à compiler sur une feuille les informations en provenance d'autres feuilles (qui dont au départ étaient dans d'autres fichiers).

    Chaque feuille a la même structure :
    - la cellule B2 contient un nom de client
    - la plage A12-N23 contient des noms d'articles et le chiffre d'affaires par mois

    J'ai un code trouvé sur un forum qui boucle sur chaque feuille, récupère tout le contenu et colle ces infos à la suite des infos de la feuille précédente :


    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
    Sub Lister()
        Dim Fe As Worksheet
        Dim Plage As Range
        For Each Fe In ThisWorkbook.Worksheets
            If Fe.Name <> "Compil" Then        
                With Fe
                    Set Plage = .Range(.Cells(2, 1), _
                                .Cells( _
                                .Cells.Find("*", .[A1], -4123, , _
                                1, 2).Row, _
                                .Cells.Find("*", .[A1], -4123, , _
                                2, 2).Column))                            
                End With
                Plage.Copy _
                Worksheets("Compil").Range("A65536").End(xlUp).Offset(1, 0)            
            End If
        Next Fe
    End Sub
    Par contre je ne sais pas comment je peux coller le nom de mon client sur chaque ligne article dans ma feuille de consolidation. En fait je n'arrive pas à saisir la syntaxe de la définition de la plage et de la fonction de copie

    Voici ce que je voudrais obtenir :
    +---+---+---+
    |Jan|Fév|Mar|...etc
    +--------+--------+---+---+---+
    |Client 1|Article1| 0| 20|500|...etc
    +--------+--------+---+---+---+
    |Client 1|Article2| 1|100| 2|...etc
    +--------+--------+---+---+---+
    |Client 2|Article1| 25| 0|120|...etc
    +--------+--------+---+---+---+

    Merci de ton aide.
    Dimitri

  7. #7
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Tout dépend de la disposition de ton tableau initial. Où setrouvent les articles, où se trouvent les mois ?

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Daniel,

    Les articles sont colonne A; j'ai une catégorie d'articles colonne B puis les mois de janvier à décembre dans les colonnes C à N.

    Le 1er article commence ligne 12 et le dernier ligne 23 (sauf que j'ai des cellules A entre 12 et 23 qui sont vides) si il y a moins de 12 articles pour un client donné.

    Donc en gros je voudrais coller les plages non vides A12 à N23 entre mes colonnes B et M sur les premières lignes non vides du fichier de compilation et le nom du client sur les mêmes lignes, dans la colonne A.

    J'ai beaucoup de mal à comprendre comment manipuler tout ça ...

  9. #9
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Essaie (non testée) :

    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
    Sub Lister()
        Dim Fe As Worksheet
        Dim Plage As Range
        Dim Ligne As Long
        For Each Fe In ThisWorkbook.Worksheets
        If Fe.Name <> "Compil" Then
        With Fe
            Set Plage = .Range(.[N12], .Cells(.Rows.Count, 1).End(xlUp))
            Ligne = .Range("A65536").End(xlUp).Offset(1)
            Plage.Copy Worksheets("Compil").Cells(Ligne, 2)
            Worksheets("Compil").Cells(Ligne, 1).Resize(12).Value = .[B2]
        End With
        With Sheets("Compil")
            Ligne = .Range("B65536").End(xlUp).Offset(1)
            Plage.Copy .Cells(Ligne, 2)
            .Cells(Ligne, 1).Resize(Plage.Rows.Count).Value = .[B2]
        End With
        End If
        Next Fe
    End Sub

  10. #10
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bonjour Daniel et merci de ton aide.

    J'ai copié ton code et en fait il s'arrête à la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Plage.Copy Worksheets("Compil").Cells(Ligne, 2)
    Erreur d'exécution 1004: erreur définie par l'application ou par l'objet

    A ce moment, "Ligne" est égal à zéro. Peut-être parce que j'ai quelques cellules vides avant mon tableau avec les clients/mois (?).

    Donc comment prendre en compte les lignes articles seulement à partir de la ligne 12 ?

    Merci

  11. #11
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Bonjour,
    Au temps pour moi (je n'ai pas testé le code). Mets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Ligne = Range("B65536").End(xlUp).Offset(1).Row

  12. #12
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Excellent, ça fonctionne !
    Au final j'ai donc ce code :
    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
     
    Sub Lister()
        Dim Fe As Worksheet
        Dim Plage As Range
        Dim Ligne As Long
        For Each Fe In ThisWorkbook.Worksheets
        If Fe.Name <> "Compil" Then
        With Fe
            Set Plage = .Range(.[N12], .Cells(.Rows.Count, 1).End(xlUp))
            Ligne = Range("B65536").End(xlUp).Offset(1).Row
            Plage.Copy Worksheets("Compil").Cells(Ligne, 2)
            Worksheets("Compil").Cells(Ligne, 1).Resize(12).Value = .[B2]
        End With
        End If
        Next Fe
    End Sub
    Par contre, y aurait-il la possibilité de ne pas coller les lignes articles vides, c'est à dire que j'ai des articles entre les lignes 12 et 23 mais s'il y en a moins, ça peut s'arrêter avant la ligne 23, donc pour les lignes vides, la colonne A est vide...
    Merci.
    Dimitri

  13. #13
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    Pourquoi as-tu modifié mon code :

    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
    Sub Lister()
        Dim Fe As Worksheet
        Dim Plage As Range
        Dim Ligne As Long
        Dim Nom As String
        For Each Fe In ThisWorkbook.Worksheets
        If Fe.Name <> "Compil" Then
        With Fe
            Nom = .[B2]
            Set Plage = .Range(.[N12], .Cells(.Rows.Count, 1).End(xlUp))
        End With
        With Worksheets("Compil")
            Ligne = .Range("B65536").End(xlUp).Offset(1).Row
            Plage.Copy .Cells(Ligne, 2)
            .Cells(Ligne, 1).Resize(Plage.Rows.Count).Value = Nom
        End With
        End If
        Next Fe
    End Sub

  14. #14
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Ah désolé, je pensis que comme il y avait une erreur sur une ligne similaire, c'était un doublon... désolé je ne connais pas grand chose à la programmation
    Merci encore pour ton aide si efficace.

  15. #15
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 207
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 207
    Points : 14 362
    Points
    14 362
    Par défaut
    désolé je ne connais pas grand chose à la programmation
    Si tu le souhaites, je peux expliquer le code.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/06/2015, 10h21
  2. Réponses: 2
    Dernier message: 29/04/2014, 22h17
  3. [Toutes versions] copier colonnes de toutes les feuilles d'un fichier
    Par cyberboy00 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 18/04/2011, 17h18
  4. MACRO - Copier une feuille dans toutes les feuilles (sauf 2)
    Par macto dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/02/2011, 08h53
  5. Réponses: 4
    Dernier message: 08/04/2009, 19h44

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