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 :

Compilation de données de plusieurs classeurs excel vers un seul


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    lille 2
    Inscrit en
    Juin 2015
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : lille 2

    Informations forums :
    Inscription : Juin 2015
    Messages : 60
    Points : 28
    Points
    28
    Par défaut Compilation de données de plusieurs classeurs excel vers un seul
    Bonjour à toute la communauté,

    Je sais que le sujet à déjà était traité à plusieurs reprises mais vu que les dates sont assez anciennes, j'ai peur que personne ne visite le ou les forum qui le traitent.

    Je ne demande pas qu'on me construise une macro, mais simplement qu'on me fournisse une petite correction pour que la mienne fonctionne.

    Je vous explique : Il s'agit d'une macro plutôt simple dans l'esprit ; dans un fichier déterminé (chemin déterminé par la macro) il existe plusieurs classeur excel au format de nom identique et dont la constitution (contenu) est également identique. Dans un autre fichier existe un classeur excel qui consolidera tous les autres.

    Le but étant d'aller chercher les données d'un tableau d'une feuille contenue dans chaque classeur excel (nom de feuille est identique, format du tableau identique) et de compiler ces données à la suite dans un tableau du classeur consolidation (tableau toujours au même format).

    voilà 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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
     
    Sub Compilation()
     
    Dim Fichier As String
    Dim Chemin As String
    Dim ClasseurSource As Workbook
    Dim valeur1 As String
    Dim MonTableau As Variant
     
    Application.DisplayAlerts = False 'Evite les messages d'Excel
    Application.EnableEvents = False 'Evite l'exécution éventuelle de macros liées aux fichiers ouverts
     
    valeur1 = Sheets("Base").Range("D2").Value
    Chemin = "J:\Rom France\France\WPP\" & valeur1 'Chemin du répertoire contenant les fichiers
    Fichier = Dir(Chemin & "*.xls*")
     
    Do While Fichier <> ""
        Set ClasseurSource = Workbooks.Open(Chemin & Fichier)
        MonTableau = ClasseurSource.Worksheets("Masterfile-valeurs").Range("Tableau5")
     
        ThisWorkbook.Worksheets("Base").Range ("Conso")
        derlig = Cells.Find("*", , , , xlByRows, xlPrevious).Row
     
     Range("derlig+1") = MonTableau
     
     ClasseurSource.Close
     Fichier = Dir
    Loop
     
    Application.EnableEvents = True
    Application.DisplayAlerts = True
     
    End Sub
    J'ai pour ce faire essayé d'utiliser des fonctions déjà présente dans mes classeurs et tenté d'obtenir le bon algorithme. Malheureusement, je pense que ma formule coince à partir de thisworkbook.worksheets("base")

    Si une âme charitable pouvait m'éclairer ma lanterne pour continuer d'avancer, je lui en serai reconnaissant ^^.

    Par avance merci pour votre contribution et votre disponibilité à tous et à toutes

  2. #2
    Expert éminent sénior 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
    Points : 32 866
    Points
    32 866
    Par défaut
    [QUOTE=med_mugen;8511848]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Application.DisplayAlerts = False 'Evite les messages d'Excel
    Application.EnableEvents = False 'Evite l'exécution éventuelle de macros liées aux fichiers ouverts
    Ca, c'est à éviter (ou à placer en remarque) en phase de développement.
    Ca masque d'éventuels problèmes et évite de les comprendre et de les résoudre.
    En plus, si ton programme plante au milieu, il ne remettra pas ces options à True vu qu'il n'atteindra pas les instructions qui le font.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        ThisWorkbook.Worksheets("Base").Range ("Conso")
    Le problème, c'est que cette ligne ne fait... rien.
    Et comme tu a demander que les alertes soient virées (voir ma remarque précédente), VBA ne te signale même pas le problème.
    Il faudrait au moins mettre un Select.
    Que souhaitais-tu que fasse cette ligne ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        derlig = Cells.Find("*", , , , xlByRows, xlPrevious).Row
    Il y a plus simple pour trouver le dernière ligne utilisée.
    La plupart du temps, on utilise un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cells(Rows.Count,XX).End(xlUp).Row
    En remplaçant XX par le numéro de la colonne ayant le plus de chance d'avoir ses cellules remplies.

    Mais tu peux aussi le faire avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Range("derlig+1") = MonTableau
    Pas de "" pour utiliser une variable. Les "" sont pour les chaines de caractères.
    Tu oublies de préciser la colonne de ton Range.

    Il y a peut-être d'autres erreurs mais tu peux déjà corriger celles-ci.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    lille 2
    Inscrit en
    Juin 2015
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : lille 2

    Informations forums :
    Inscription : Juin 2015
    Messages : 60
    Points : 28
    Points
    28
    Par défaut Ravi de correspondre à nouveau avec vous Menhir
    Je vais tenter de répondre par étape à vos interrogations et en parallèle je vais prendre vos remarques en compte pour corriger cette macro:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        ThisWorkbook.Worksheets("Base").Range ("Conso")
    en fait je cherchais en écrivant cela à sélectionner le tableau "conso" dans la feuille "base" du classeur sur lequel je travaille. (pour ensuite utiliser l'action derlig + 1 pour atteindre la première ligne vide du tableau.

    En ce qui concerne votre remarque sur cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Range("derlig+1") = MonTableau
    Vous avez du certainement comprendre que MonTableau me permet de copier mes cellules et de les apporter vers une autre plage. Dans un ancien code comportant cette variable j'avais été bloqué car j'avais collé cette plage non pas sur autre plage mais sur une colonne du tableau destination (ex : tableau n°3[store] qui était la première colonne du tableau. Du coup j'ai retiré le [store] et ma formule a fonctionné.

    Ici je voulais faire pareille avec le tableau [Conso] mais à partir de la première ligne vide, d'où
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Range("derlig+1") = MonTableau

    Mais lorsque vous dites que je dois associer une colonne à ce range, si je note
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cells(derlig+1,1) = MonTableau
    ça peut aller vous pensez ?

  4. #4
    Expert éminent sénior 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
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par med_mugen Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        ThisWorkbook.Worksheets("Base").Range ("Conso")
    en fait je cherchais en écrivant cela à sélectionner le tableau "conso" dans la feuille "base" du classeur sur lequel je travaille. (pour ensuite utiliser l'action derlig + 1 pour atteindre la première ligne vide du tableau.
    Dans ce cas, il te manque un Select.

    Mais lorsque vous dites que je dois associer une colonne à ce range, si je note
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cells(derlig+1,1) = MonTableau
    ça peut aller vous pensez ?
    Je ne sais pas trop. Passer par un tableau de variables n'est pas du tout ma façon de travailler pour copier des données.
    Il me semble beaucoup plus simple de passer par une simple copie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ClasseurSource.Worksheets("Masterfile-valeurs").Range("Tableau5").Copy
    ThisWorkbook.Worksheets("Base").Cells(Rows.Count,1).End(xlUp).Offset(1,0).PasteSpecial(xlPasteValues)
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    lille 2
    Inscrit en
    Juin 2015
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : lille 2

    Informations forums :
    Inscription : Juin 2015
    Messages : 60
    Points : 28
    Points
    28
    Par défaut étrange
    Je ne sais pas si c'est à cause du nom de la macro (compilation) mais j'ai effectué les modif, mis en commentaires les lignes de codes empêchant les messages d'alertes, et pourtant lorsque je clique sur le bouton auquel j'ai associé la macro rien ne se passe, même pas un message d'erreur.. vous comprenez quelque chose ?

  6. #6
    Expert éminent sénior 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
    Points : 32 866
    Points
    32 866
    Par défaut
    Citation Envoyé par med_mugen Voir le message
    mis en commentaires les lignes de codes empêchant les messages d'alertes
    Dans la mesure où ces options ont été passées à False puis que la macro a planté avant d'atteindre leur passage à True, elles ont du resté dans cet état et ce n'est pas les mettre en commentaire qui les fera passer à True.

    lorsque je clique sur le bouton auquel j'ai associé la macro rien ne se passe, même pas un message d'erreur.. vous comprenez quelque chose ?
    Sans savoir où en est ton code, je ne vois pas comment il serait possible de trouver ce qui pose problème.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    lille 2
    Inscrit en
    Juin 2015
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : lille 2

    Informations forums :
    Inscription : Juin 2015
    Messages : 60
    Points : 28
    Points
    28
    Par défaut
    malheureusement je ne sais pas pourquoi mais ca ne fonctionne pas, je n'ai même pas de message d'erreur lorsque je l'actionne. Petite information supplémentaire il existe déjà une macro rattaché à la feuille qui change de couleur les lignes du tableau à chaque changement de n°référence. Y a t il conflit entre ces deux macros qui empêcherait la nouvelle de fonctionner ?

    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
    Sub Compilation()
     
    Dim Fichier As String
    Dim Chemin As String
    Dim ClasseurSource As Workbook
    Dim valeur1 As String
     
    valeur1 = Sheets("Base").Range("D2").Value
    Chemin = "J:\Rom France\France\WPP\" & valeur1 'Chemin du répertoire contenant les fichiers
    Fichier = Dir(Chemin & "*.xls*")
     
    Do While Fichier <> ""
        Set ClasseurSource = Workbooks.Open(Chemin & Fichier)
     
        ClasseurSource.Worksheets("Masterfile-valeurs").Range("Tableau5").Copy
     
        ThisWorkbook.Worksheets("Base").Range("Conso").Select
        ThisWorkbook.Worksheets("Base").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial (xlPasteValues)
     
     ClasseurSource.Close
     Fichier = Dir
    Loop
     
    End Sub
    Voulez vous que je vous envoie un exemple ?

    Après sur d'autres site j'ai vu souvent dans l'annonce des variable la mention ADOB. après quelques recherches, j'ai cru comprendre qu'on parle de Access VBA. De quoi parle t on exactement ?

  8. #8
    Expert éminent sénior 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
    Points : 32 866
    Points
    32 866
    Par défaut
    Enlève la ligne du Select entre le Copy et le PasteSpecial.

    Citation Envoyé par med_mugen Voir le message
    Après sur d'autres site j'ai vu souvent dans l'annonce des variable la mention ADOB. après quelques recherches, j'ai cru comprendre qu'on parle de Access VBA. De quoi parle t on exactement ?
    Ca n'a aucun rapport avec ton problème.
    C'est généralement en relation avec Acrobat qui est un logiciel édité par Adobe.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  9. #9
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 78
    Points : 127
    Points
    127
    Par défaut
    il veut peut etre parler d' adodb plutôt, parce que c'est vrai qu' adob je vois pas trop le rapport non plus

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    lille 2
    Inscrit en
    Juin 2015
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : lille 2

    Informations forums :
    Inscription : Juin 2015
    Messages : 60
    Points : 28
    Points
    28
    Par défaut
    j vais essayer de vous envoyer un exemple dans quelques minutes car je n'arrive pas à comprendre pourquoi la macro ne s'enclenche pas, il n'y a même pas de msg d'erreur..

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    lille 2
    Inscrit en
    Juin 2015
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : lille 2

    Informations forums :
    Inscription : Juin 2015
    Messages : 60
    Points : 28
    Points
    28
    Par défaut Euréka !
    Bonjour Menhir, Bonjour Minise,

    Je vous informe que j'ai retrouvé l'origine du disfonctionnement de la macro.

    Ci dessous voici la macro avec les diverses retouches sur les conseils de Menhir.

    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 extraction()
    
    Dim Fichier As String
    Dim Chemin As String
    Dim ClasseurSource As Workbook
    Dim valeur1 As String
    
    
    
    valeur1 = ThisWorkbook.Worksheets("Base").Range("D2").Value
    Chemin = "J:\Rom France\France\WPP\" & valeur1 & "\" 'Chemin du répertoire contenant les fichiers
    Fichier = Dir(Chemin & "*.xls*")
     
    Do While Fichier <> ""
        Set ClasseurSource = Workbooks.Open(Chemin & Fichier)
        
        ClasseurSource.Worksheets("Masterfile-valeurs").Range("Tableau5").Copy
    
    
    ThisWorkbook.Worksheets("Base").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).PasteSpecial (xlPasteValues)
    
    
     ClasseurSource.Close
     Fichier = Dir
    Loop
    
    
     
    End Sub
    l'origine du problème était que la macro ne trouvait pas le chemin des classeurs sources, faute à un "\" manquant voire macro ci-dessus en bleu.

    Après cette mini euphorie, des petites questions d'ergonomie subsitent :

    - Comment entrer les lignes copiées ds mon tableau nommé "conso" (elles arrivent sous le tableau) ?
    - Comment empêcher que les boites de dialogues s'ouvrent à chaque ouvertures et fermetures des fichiers sources ?
    - Comment faire cohabiter cette macro avec celle existante sous jacente à la feuille (private sub) ? voir code ci dessous

    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
     
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim Première_Ligne As Integer, Dernière_Ligne As Integer, i As Integer, j As Integer
     
     
    If Target.Count > 1 Then Exit Sub
     
    If Not Application.Intersect(Target, Range("A6:A" & Rows.Count)) Is Nothing Then
        Application.ScreenUpdating = False
     
    Range("A6:M" & Rows.Count).Interior.Pattern = xlNone
     
     
        Range("A6").Activate
     
    Retour:
        j = j + 1
     
        Première_Ligne = ActiveCell.Row
     
        Do Until ActiveCell.Offset(1, 0) <> ActiveCell
            If ActiveCell = "" Then Exit Sub
            ActiveCell.Offset(1, 0).Activate
        Loop
     
        Dernière_Ligne = ActiveCell.Row
     
        If j Mod 2 <> 0 Then
            With Range(Cells(Première_Ligne, 1), Cells(Dernière_Ligne, 13)).Interior
                .ThemeColor = xlThemeColorAccent5
                .TintAndShade = 0.799981688894314
            End With
        End If
     
        ActiveCell.Offset(1, 0).Activate
     
        GoTo Retour
    End If
     
     
    End Sub
    La macro extraction s'arrête sur la ligne de code

Discussions similaires

  1. Réponses: 23
    Dernier message: 21/12/2015, 16h18
  2. Exporter des données des plusieurs fichiers Excel vers un seul fichier Excel
    Par pkp85pkp dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 09/12/2014, 15h20
  3. [XL-2007] comment migrer des données entre plusieurs classeurs excel
    Par Iichham dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/06/2011, 14h28
  4. Ouvrir plusieurs classeurs Excel dans un seul processus
    Par zoopsys dans le forum VBA Access
    Réponses: 2
    Dernier message: 06/12/2008, 17h27
  5. Réponses: 3
    Dernier message: 24/05/2008, 18h56

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