XL 2010 Importer des données de plusieurs fichiers sans les ouvrir

filiph79

XLDnaute Occasionnel
Bonjour le forum,

Je souhaite "compiler" plusieurs classeurs (comportant une feuille de données) stockés dans un dossier sans ouvrir les fichiers sources.

J'y arrive en ouvrant chaque fichier puis en les refermant.

Sub Import_Donnees()
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Dim Wb As Workbook
Dim Chemin As String, MonFichier As String
Chemin = "C:\Users\p.hubert\Documents\Exercices\Excel\ExcelMAcroCommandes\CLasseursBoucle\"
MonFichier = Dir(Chemin & "*.xlsx")
Do While MonFichier <> ""
Set Wb = Workbooks.Open(Chemin & MonFichier)
Range("A2").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
ActiveWorkbook.Close
Range("A" & Rows.Count).End(xlUp).Offset(1, 0).PasteSpecial
MonFichier = Dir
Loop
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

J'ai trouvé des procédures permettant de copier des données d'1 fichier et pour une plage Fixe dans un autre fichier sans l'ouvrir mais je n'arrive pas à l'adapter à ma problématique : .
  • tous les fichiers du dossier
  • Plage variable commençant en ligne 2 jusqu'en ....

Quelqu'un peut il me venir en aide.

Merci
 
Solution
Bonjour,

J'en ai fait plusieurs versions et ai laissé un cnx en trop
Supprimer le 'cnx' pour avoir uniquement .Execute("SELECT * FROM [Feuil1$];")
vos feuilles s'appellent donc 'Feuil1$' également ?

J'ai rechargé une version corrigée du fichier dans le post#4

Cordialement

Deadpool_CC

XLDnaute Accro
J'ai trouvé des procédures permettant de copier des données d'1 fichier et pour une plage Fixe dans un autre fichier sans l'ouvrir mais je n'arrive pas à l'adapter à ma problématique
Bonjour,

Alors sans ouvrir le fichier ... je connais pas ...
Et pourquoi nous mettre un code qui n'est pas celui qui pose soucis.

Joins un fichiers exemple avec le code sur lequel tu bloques

A+
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Sans pouvoir tester et parce qu'on est voisin, ceci qui a pour prétention d'importer les données de toutes les feuilles nommées "Feuil1" de tous les classeurs du répertoire donné dans la feuille 'Feuil1' du classeur qui contient la macro.

Si vos données n'ont pas d'entête dans leur feuille 'Feuil1' alors modifiez le YES de la constante 'CNX_STRING' par 'NO'.

Pour avoir :
Const CNX_STRING As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=@SOURCE@;Extended Properties=""Excel 12.0;HDR=NO"";"

La boucle sur les fichiers et une boucle traditionnelle, elle ne devrait pas poser de problème.

Avant de la lancer, changez :
1 - le nom du chemin vers le répertoire qui contient les fichiers en incluant le \ de fin.
2 - le nom 'FEUIL1' par le nom de la feuille qui contient les données dans la ligne:
.Execute("SELECT * FROM [Feuil1$];")
Si votre feuille se nomme 'LaFeuille', la ligne sera :
.Execute("SELECT * FROM [LaFeuille$];")

🤞Croisons les doigts puisque nous n'avons pas plus de renseignement.🤞

VB:
Sub ImporterFichiers()
 Const CHEMIN As String = "C:\...\...\CLasseursBoucle\" ' A adapter
    Const CNX_STRING As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=@SOURCE@;Extended Properties=""Excel 12.0;HDR=NO"";"
 
    '
    ' objets adodb
    Dim rs As Object
    '
    ' variable de boucle sur fichiers du dossier
    Dim f As Variant
    '
    ' feuille de destination
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Feuil1")

    f = Dir(CHEMIN & "*.xlsx")
    While f <> ""
        With CreateObject("Adodb.Connection")
            .Cursorlocation = 3
            .Connectionstring = Replace(CNX_STRING, "@SOURCE@", CHEMIN & f)
            .Open

            Set rs = .Execute("SELECT * FROM [Feuil1$];") ' Adapter le nom de feuille
            If Not rs.EOF And Not rs.BOF Then
                ws.Cells(Rows.Count, 1).End(xlUp)(2).CopyFromRecordset rs
            End If
        End With
        '
        ' fermeture et destruction des objets Adodb
        If rs.State <> 0 Then rs.Close
        Set rs = Nothing
        '
        ' Prochain fichier s'il existe
        f = Dir
    Wend


End Sub

P.S. vous ne devriez pas publier vos chemins d'accès, à moins qu'ils soient super hyper bien protégés des petits curieux, mettez des faux chemins.

cordialement
[Edition] fichier re-chargé le 29-06-2022 11:35 pour correction 'cnx.execute'[/Edition]
 

Pièces jointes

  • Adodb ImporterFichierRepertoire.xlsm
    25.3 KB · Affichages: 8
Dernière édition:

filiph79

XLDnaute Occasionnel
Merci de vos réponses.
Merci Hasco pour avoir pris le temps de me fournir cet exemple.
Il me fait mesurer tout le chemin qui me reste à parcourir !!!!!!!
Quand j'exécute ce code, Excel m'alerte sur la ligne
Set rs = cnx.Execute("SELECT * FROM [Feuil1$];")
en m'indiquant que cnx est une variable non déclarée (l'option Déclaration de variable obligatoire est activée dans mon VBE).

cordialement
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

J'en ai fait plusieurs versions et ai laissé un cnx en trop
Supprimer le 'cnx' pour avoir uniquement .Execute("SELECT * FROM [Feuil1$];")
vos feuilles s'appellent donc 'Feuil1$' également ?

J'ai rechargé une version corrigée du fichier dans le post#4

Cordialement
 
Dernière édition:

Hasco

XLDnaute Barbatruc
Repose en paix
Re,

Adodb est une technologie d'accès aux données, souvent utilisée par les utilisateurs d'excel (entre autres) pour obtenir des données de classeurs fermés. Bien que vieillissante, cette technologie a toujours cours.
Le SELECT * FROM ... quant à lui est issu du langage SQL qui est un langage d'interrogation des données (une fois qu'on les a atteintes par adodb) et veut dire "sélectionne toutes les données de Feuil1".

Cordialement
 

Discussions similaires

  • Question
Microsoft 365 Code VBA
Réponses
10
Affichages
747

Statistiques des forums

Discussions
315 089
Messages
2 116 094
Membres
112 658
dernier inscrit
doro 76