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 des données depuis plusieurs fichiers fermés par ADO : la boucle ne traite que le premier fichier


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 25
    Par défaut Copier des données depuis plusieurs fichiers fermés par ADO : la boucle ne traite que le premier fichier
    Bonjour,

    en m'inspirant du très bon boisgontierjacques, j'ai adapté son code pour mon usage.
    Source : http://boisgontierjacques.free.fr/pa...ado.htm#Import
    J'arrive très bien à copier des données depuis un fichier fermé.
    Or, je souhaite copier des données depuis plusieurs fichiers fermés (tous identique de par leur structure, mais différent de part leur contenu).
    Ma boucle ne copie que les données du premier fichier, alors que la variable "odmfile" change bien à chaque boucle ...

    Où est mon erreur ?

    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
     
    Sub abracadabra()   'tool to consolidate data from several closed files
    ' Microsoft ActiveX DataObject must be activated
        Dim counter As Integer
        Dim odmfile As String         'string containing the path and the name of a file : c:\toto\file.xlsx
        Dim t_odmFileList As ListObject	'Table containing a list with the path and the name of each files : c:\toto\file1.xlsx
        Dim Source As ADODB.Connection
        Dim Requete As ADODB.Recordset
     
        Set t_odmFileList = Range("t_odmFileList").ListObject
     
        Application.ScreenUpdating = False
     
        For counter = 1 To t_odmFileList.DataBodyRange.Rows.Count
            odmfile = t_odmFileList.DataBodyRange(counter, 2).Value
            Set Source = New ADODB.Connection
            Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & odmfile & ";Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1'"
            Set Requete = Source.Execute("[Feuil1$A1:L100]")
            [K1].CopyFromRecordset Requete        'copy data in temporary table
            Requete.Close
            Source.Close
            Set Requete = Nothing
            Set Source = Nothing
        Next counter
     
        Application.ScreenUpdating = True
    End Sub

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Pourquoi ne poses-tu pas directement la question à l'auteur de la procédure ?
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 25
    Par défaut
    Bonjour,

    je me suis inspiré de sa procédure pour la connexion au fichier fermé.
    Sa procédure ne propose pas de boucle.
    C'est dans la boucle que je rencontre le problème.

    De plus, j'évite les messages privés pour faire partager la réflexion, l'analyse et la solution au problème au plus grand nombre.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Il suffit d'isoler ce code dans une procédure indépendante en prévoyant deux arguments (la source et la cible).
    Si tu publiais la version d'origine (sans la boucle), ce serait plus simple pour t'aider.
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    20
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 20
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            [K1].CopyFromRecordset Requete        'copy data in temporary table
    Cela copie les données de TOUS les fichiers au même emplacement de destination.
    A la fin de la boucle, on a en K1 les données du dernier fichier traité.
    Il faudrait faire évoluer K1 à chaque nouveau fichier.

    HTH,
    --
    AP

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 25
    Par défaut
    Voici le code d'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Sub RecupTableur2()
      ' Microsoft ActiveX DataObject doit être coché
      Set cnn = New ADODB.Connection
      répertoire = ThisWorkbook.Path
      fichier = "AdoSource.xls"
      cnn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & répertoire & "\" & fichier & ";Extended Properties='Excel 12.0;HDR=Yes'"
      Set rs = cnn.Execute("[Feuil1$A1:C100]")
      [A2].CopyFromRecordset rs
      rs.Close
      cnn.Close
      Set rs = Nothing
      Set cnn = Nothing
    End Sub
    Voici mon code avec une procédure indépendante

    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
     
    Sub abracadabra()   'tool to consolidate data from several closed files
        Dim counter As Integer
        Dim odmfile As String	'string containing the path and the name of a file : c:\toto\file.xlsx
        Dim t_odmFileList As ListObject	'Table containing a list with the path and the name of each files : c:\toto\file1.xlsx
        Set t_odmFileList = Range("t_odmFileList").ListObject
     
        Application.ScreenUpdating = False
     
        For counter = 1 To t_odmFileList.DataBodyRange.Rows.Count
            odmfile = t_odmFileList.DataBodyRange(counter, 2).Value
            Call RecupData(odmfile)
        Next counter
     
        Application.ScreenUpdating = True
    End Sub
     
    Sub RecupData(odmfile As String)
      ' Microsoft ActiveX DataObject doit être coché
      Dim Source As ADODB.Connection
      Dim Requete As ADODB.Recordset
      Set Source = New ADODB.Connection
     
      Source.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & odmfile & ";Extended Properties='Excel 12.0 Xml;HDR=YES;IMEX=1'"
      Set Requete = Source.Execute("[Feuil1$A1:L100]")
      [K1].CopyFromRecordset Requete        'copy data in a temporary table
      Requete.Close
      Source.Close
      Set Requete = Nothing
      Set Source = Nothing
    End Sub

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 25
    Par défaut
    Citation Envoyé par Ardus Petus Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            [K1].CopyFromRecordset Requete        'copy data in temporary table
    Cela copie les données de TOUS les fichiers au même emplacement de destination.
    A la fin de la boucle, on a en K1 les données du dernier fichier traité.
    Il faudrait faire évoluer K1 à chaque nouveau fichier.

    HTH,
    --
    AP
    Bonjour,

    K1 est une cellule qui récupère temporairement la copie avant de la mettre au bon endroit.
    Je n'ai donc pas de souci à écraser les données à chaque nouvelle boucle.

Discussions similaires

  1. [XL-2010] Copier des données depuis un classeur fermé vers l'ouvert
    Par NCall dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 15/06/2018, 14h20
  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. [XL-2007] Importation des données sur plusieurs fichiers fermés
    Par starid dans le forum Excel
    Réponses: 8
    Dernier message: 18/07/2009, 17h54
  4. Compiler des données de plusieurs fichiers
    Par kirua2150 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/06/2007, 22h25
  5. [VBA-E] Extraire des lignes depuis plusieurs classeurs fermés
    Par stoof dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 07/05/2007, 12h26

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