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 :

fusionner tous les classeurs fermés d'un répertoire, à la suite dans une nouvelle feuille de calcul [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre habitué Avatar de doncamelo
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Décembre 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2007
    Messages : 129
    Points : 164
    Points
    164
    Par défaut fusionner tous les classeurs fermés d'un répertoire, à la suite dans une nouvelle feuille de calcul
    Bonjour le forum,

    Je me retourne vers vous pour un petit problème.

    Je cherche à consolider dans un classeur les données contenues dans d'autres classeurs.

    Dans la faq excel, j'ai trouvé un code qui fonctionne très bien:

    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
    45
    46
    Comment fusionner tous les classeurs fermés d'un répertoire, à la suite dans une nouvelle feuille de calcul ?
     
    http://excel.developpez.com/faq/index.php?page=Classeur#ClasseursFermes
     
    'Nécessite d'activer la référence
        'Microsoft ActiveX Data Objects x.x Library
    Dim Cn As ADODB.Connection
    Dim Rs As ADODB.Recordset
    Dim xConnect As String, Cible As String
    Dim Fichier As String, Dossier As String, Feuille As String
    Dim i As Long
     
    'nom du répertoire contenant les classeurs à regrouper
    Dossier = "C:\nom dossier"
    'Nom de la feuille dans les classeurs fermés
    'Ne pas oublier le symbole $ après le nom de la feuille
    Feuille = "Feuil1$"
    i = 2
     
    Fichier = Dir(Dossier & "\*.xls")
    'boucle sur les fichiers du repertoire
    Do While Len(Fichier) > 0
        xConnect = "DRIVER={Microsoft Excel Driver (*.xls)};" & _
        "ReadOnly=1;DBQ=" & Dossier & "\" & Fichier
        'connection classeur
        Set Cn = New ADODB.Connection
        Cn.Open xConnect
     
        'Requete
        Cible = "SELECT * FROM [" & Feuille & "];"
     
        Set Rs = New ADODB.Recordset
        Rs.Open Cible, xConnect, adOpenStatic, adLockOptimistic, adCmdText
     
        'Ecriture dans la feuille de calcul
        If Not Rs.EOF Then Cells(i, 1).CopyFromRecordset Rs
        i = Cells(i, 1).End(xlDown).Row + 1
     
        Rs.Close
        Cn.Close
        Set Cn = Nothing
        Set Rs = Nothing
        Fichier = Dir()
    Loop
     
    MsgBox "Terminé"
    Le seul problème c'est que ce code ne fonctionne que pour la version Excel 2003.

    J'utilise la version 2007 et il m'arrive de recevoir et de travailler sur les deux versions.

    Donc j'ai crée un fichier xlsm contenant le code ci-dessus en modifiant "xls" en "xlsx", en prenant soin d'activer différentes bibliothèques recommandées.

    Mais cette manip génère des erreurs.

    Je souhaite pouvoir consolider les données dans un fichier source et ce, quelque soit la version excel des fichiers reçus (xls, xlsx ou xlsm).

    Pourriez-vous me dire comment faire pour améliorer le code ci-dessus afin de pouvoir lire les données des fichiers xls, xlsx et xlsm et les consolider dans un fichiers source ?

  2. #2
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 333
    Points
    24 333
    Par défaut
    Bonjour,

    Citation Envoyé par doncamelo Voir le message
    Mais cette manip génère des erreurs.
    Et nous devons deviner lesquelles?

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 875
    Points : 1 394
    Points
    1 394
    Par défaut
    c'est peut être la chaine de connexion xConnect qui diffère pour les fichiers Excel2007.

  4. #4
    Membre habitué Avatar de doncamelo
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Décembre 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2007
    Messages : 129
    Points : 164
    Points
    164
    Par défaut
    Bonsoir,

    Comme l'a dit Benjîle, c'est la chaîne de connexion xConnect qui pose problème.

    Le message d'erreur est :

    Erreur d'exécution'-2147467259 (80004005)':
    [Microsoft][Gestionnaire de pilotes ODBC] source de données introuvable et nom de pilote non spécifié
    Auriez-vous une idée ?

  5. #5
    Expert éminent sénior
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Points : 11 272
    Points
    11 272

  6. #6
    Membre habitué Avatar de doncamelo
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Décembre 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2007
    Messages : 129
    Points : 164
    Points
    164
    Par défaut
    Merci kiki29,

    En prenant comme exemple le tutoriel, j'ai rajouter quelques lignes de codes et voici le résultats :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    Sub RequeteClasseurFerme_Excel2007()
        Dim Cn As ADODB.Connection
        Dim Fichier As String
        Dim NomFeuille As String, texte_SQL As String
        Dim Rst As ADODB.Recordset
     
     
        Dim dossier As String
        Dim i As Long
        Dim NomOnglet As String
        Dim LeFichier As String
        dossier = "C:\Consolidation Fichiers Excel\FichiersRecus"
        NomOnglet = "ENVOI$"
     
            i = 2
            LeFichier = Dir(dossier & "\*.xlsx")
     
     
            'Range("A2:IV65000").Clear
     
                    Do While Len(LeFichier) > 0
        'Définit le classeur fermé servant de base de données
        Fichier = "C:\Consolidation Fichiers Excel\FichierSource\R.xlsx"
        'Nom de la feuille dans le classeur fermé
        NomFeuille = "LeCons$"
     
        Set Cn = New ADODB.Connection
     
        '--- Connexion ---
        With Cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" _
                & Fichier & ";Extended Properties=""Excel 12.0;HDR=YES;"""
            .Open
        End With
        '-----------------
     
     
        '
        '... la requête ...
        '
                 Cible = "SELECT * FROM [" & NomFeuille & "];"
                Set Rst = New ADODB.Recordset
                Rst.Open Cible, Cn, adOpenStatic, adLockOptimistic, adCmdText
     
        'Ecriture dans la feuille de calcul
     
                If Not Rst.EOF Then Cells(i, 1).CopyFromRecordset Rst
     
                i = Cells(i, 1).End(xlDown).Row + 1
     
     
        '--- Fermeture connexion ---
        Cn.Close
        Set Cn = Nothing
               Set Rst = Nothing
                LeFichier = Dir()
     
            Loop
     
            MsgBox "Consolidation terminée"
     
    End Sub
    J'ai une erreur à la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    i = Cells(i, 1).End(xlDown).Row + 1
    Quand i est de type integer,

    j'ai l'erreur:

    Erreur d'exécution '6':
    Dépassement de capacité
    Quand je le passe en Long,

    j'ai l'erreur:

    Erreur d'exécution '1004';
    Erreur définie par l'application ou par l'objet
    Je suis bloqué là dessus
    Voyez-vous le problème ?

  7. #7
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 333
    Points
    24 333
    Par défaut
    Bonjour,

    Ta cellule de référence étant la dernière remplie, le End(XlDown) te positionne en bas de feuille.
    Le +1 te fait sortir de la feuille.

    Il vaut mieux utiliser cette technique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    i = Cells(Rows.Count, 1).End(xlUp).Row + 1

  8. #8
    Membre habitué Avatar de doncamelo
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Décembre 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2007
    Messages : 129
    Points : 164
    Points
    164
    Par défaut
    Merci beaucoup AlainTech,

    Je n'ai plus d'erreurs mais mon fichier de consolidation est vide après exécution de la procédure.

    Je vais essayer de voir ce qui cloche.

    Merci pour votre aide.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/04/2014, 23h17
  2. Enregistrer les données dans une nouvelle feuille
    Par khantouch dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 05/07/2013, 12h29
  3. [XL-2003] Comment fusionner tous les classeurs fermés, erreur d'éxécution
    Par banyan dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 11/12/2011, 18h47
  4. Copier les données de plusieurs colonnes dans une nouvelle feuille
    Par lolonico1974 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/07/2010, 08h51
  5. Copier les valeurs d'une feuille dans une nouvelle feuille en VBA
    Par muska78 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/06/2008, 11h44

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