Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/12/2011, 16h06   #1
Invité de passage
 
Inscription : décembre 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 8
Points : 0
Points : 0
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 :
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
dimitri.evrard24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 16h35   #2
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Bonjour.

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

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 16h54   #3
Invité de passage
 
Inscription : décembre 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 8
Points : 0
Points : 0
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
dimitri.evrard24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 17h00   #4
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Non, il faut les ouvrir :

Code :
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
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 28/12/2011, 17h13   #5
Invité de passage
 
Inscription : décembre 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 8
Points : 0
Points : 0
Génial ! Ca marche nickel ! Dire que j'ai passé toute la journée là dessus !
Je ne sais comment te remercier !
Dimitri
dimitri.evrard24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 18h50   #6
Invité de passage
 
Inscription : décembre 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 8
Points : 0
Points : 0
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 :
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
dimitri.evrard24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 19h28   #7
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Tout dépend de la disposition de ton tableau initial. Où setrouvent les articles, où se trouvent les mois ?
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 19h57   #8
Invité de passage
 
Inscription : décembre 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 8
Points : 0
Points : 0
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 ...
dimitri.evrard24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2011, 21h02   #9
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Essaie (non testée) :

Code :
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
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 09h57   #10
Invité de passage
 
Inscription : décembre 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 8
Points : 0
Points : 0
Bonjour Daniel et merci de ton aide.

J'ai copié ton code et en fait il s'arrête à la ligne
Code :
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
dimitri.evrard24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 10h06   #11
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Bonjour,
Au temps pour moi (je n'ai pas testé le code). Mets :

Code :
Ligne = Range("B65536").End(xlUp).Offset(1).Row
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 10h22   #12
Invité de passage
 
Inscription : décembre 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 8
Points : 0
Points : 0
Excellent, ça fonctionne !
Au final j'ai donc ce code :
Code :
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
dimitri.evrard24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 12h22   #13
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Pourquoi as-tu modifié mon code :

Code :
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
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 13h52   #14
Invité de passage
 
Inscription : décembre 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2011
Messages : 8
Points : 0
Points : 0
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.
dimitri.evrard24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2011, 13h59   #15
Expert Confirmé Sénior
 
Homme Daniel
aucune
Inscription : septembre 2011
Messages : 2 004
Détails du profil
Informations personnelles :
Nom : Homme Daniel
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : aucune

Informations forums :
Inscription : septembre 2011
Messages : 2 004
Points : 4 037
Points : 4 037
Citation:
désolé je ne connais pas grand chose à la programmation
Si tu le souhaites, je peux expliquer le code.
__________________
Cordialement.

Daniel

Citation:
La plus perdue de toutes les journées est celle où l'on n'a pas ri.
Chamfort
Daniel.C est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h17.


 
 
 
 
Partenaires

Hébergement Web