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-E] Extraire des lignes depuis plusieurs classeurs fermés


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [VBA-E] Extraire des lignes depuis plusieurs classeurs fermés
    Bonjour

    Je dispose d'un dossier contenant n classeurs excel qui possèdent la même structure, mais dont les données diffèrent. Je souhaite extraire de tous ces classeurs (en les gardant fermés!) les lignes non vides d'une feuille particulière, et les coller les unes à la suite des autres dans une feuille d'un autre classeur.

    Pour cela, je me suis basé sur le très bon tuto de Silkyroad qui permet d'extraire des données depuis des classeurs fermés.

    Lorsque je cherche à faire l'extraction depuis un seul classeur fermé, et que je spécifie son nom dans le code, c'est OK. Par contre, lorsque je créé une boucle While pour faire cela sur tous les classeurs de mon dossier, là ça plante: j'ai une "automation error -2147217865" argghh!
    Je ne vois pas du tout d'où peut venir le problème ...

    Voici 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
    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
    64
    65
    Sub RequeteClasseurFerme()
     
    Dim Repertoire As String
    Dim Cn As ADODB.Connection
    Dim Fichier As String
    Dim NomFeuille As String, texte_SQL As String
    Dim Rst As ADODB.Recordset
    Dim x As Integer
     
    'empeche le scintillement de l'écran
    Application.ScreenUpdating = False
     
    'Définit le classeur fermé servant de base de données
    Repertoire = "D:\Documents and Settings\stephen.durand\My Documents\Skills Assessment\Outil admin summary"
    Fichier = Dir(Repertoire & "\*.xls")
     
        ' va parcourir le répertoire pour y trouver tous les fichiers excel,et pour chaque fichier trouvé, 
        'en extraire le contenu de la feuille "export input table" et le placer dans la feuille 
        '"global input table" du classeur actif
     
        Do While Fichier <> ""
     
            Set Cn = New ADODB.Connection
     
            'Etablit la connection
            With Cn
                .Provider = "Microsoft.Jet.OLEDB.4.0"
                .ConnectionString = "Data Source=" & Fichier & _
                 ";Extended Properties=Excel 8.0;"
                .Open
            End With
     
            'Nom de la feuille dans le classeur fermé
             NomFeuille = "export input table"
     
            'Définit la requête (Attention à ne pas oublier le symbole $ après le nom de la feuille).
     
             texte_SQL = "SELECT * FROM [" & NomFeuille & "$] WHERE Id_skill <> 0"
     
             Set Rst = New ADODB.Recordset
             Set Rst = Cn.Execute(texte_SQL)
     
             'Ecrit le résultat de la requête à partir de la première ligne du classeur actif 
            'qu'il trouve vide (dont la cellule Ai est vide)
     
             x = ThisWorkbook.Sheets("Global input table").Range("A65536").End(xlUp).Row + 1
     
            ThisWorkbook.Sheets("Global input table").Cells(x, 1).CopyFromRecordset Rst
     
            'Ferme la connection
     
            Rst.Close
            Set Rst = Nothing
            Cn.Close
            Set Cn = Nothing
     
        'passe au fichier suivant
        Fichier = Dir
        Loop
     
    Application.ScreenUpdating = True
     
    MsgBox "Opération terminée."
     
    End Sub
    Merci!

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    Où ton erreur ? sur quelle ligne ?
    Si c'est dans la boucle, essaie d'ajouter un DoEvents après ouverture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            With Cn
                .Provider = "Microsoft.Jet.OLEDB.4.0"
                .ConnectionString = "Data Source=" & Fichier & _
                 ";Extended Properties=Excel 8.0;"
                .Open
                DoEvents '******
            End With
    Tu dis

    Edit
    Idem après tes deux "Close"

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta prompte réponse.
    J'ai bien réessayé avec tes indications, mais le code plante toujours à la ligne suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Set Rst = Cn.Execute(texte_SQL)
    c'est curieux car j'ai bien testé cette routine sans le While, et ça fonctionnait bien...

  4. #4
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    manque peu-être le répertoire...?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ...
     .ConnectionString = "Data Source=" & Repertoire  & "\" & Fichier & _
    ....

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Ardèche (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 652
    Points : 1 114
    Points
    1 114
    Par défaut
    Bonjour à tous

    Peut être déterminer le nom du fichier à l'intérieur de la boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fichier = Dir(repertoire\&"*.xls")
        While fichier <> ""
        fichier = repertoire &"\" & fichier

    A+
    Michel_M
    Michel_M

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Un grand merci !
    Bien vu Bbil, c'était bien ça. Ca marche niquel maintenant!
    Grand merci ouskel'n'or et Michel_M pour avoir planché dessus aussi.
    A bientôt!

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

Discussions similaires

  1. Extraire des données depuis Chrome via VBA
    Par Korleone dans le forum VBA Access
    Réponses: 2
    Dernier message: 06/01/2015, 00h52
  2. [XL-2010] Copier des données depuis plusieurs classeurs vers un classeur de Recap
    Par bdel1724 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/11/2014, 20h14
  3. Extraires des lignes de plusieurs onglets dans un nouvel onglet
    Par Dantesques dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 19/03/2013, 10h09
  4. [XL-2007] Récupérer des données de plusieurs classeurs fermés
    Par hdisnice dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 02/12/2011, 10h10
  5. Réponses: 5
    Dernier message: 22/07/2011, 17h13

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