Lire dans un fichier sans l'ouvrir

davidm

XLDnaute Nouveau
Bonjour,

Peut on recupérer des données d'un fichier sans l'ouvrir au préalable ?

Merci de votre aide

Davidm
 

davidm

XLDnaute Nouveau
Re : Lire dans un fichier sans l'ouvrir

Hasco,

Pour le moment on peut les nommer colonne1 et colonne3 je les modifierais par la suite.
Merci

Edit : en fait je souhaite renvoyer les colonnes intitulées colonne1 et colonne3 des fichiers (fichieràdupliquer cad qu'on doit faire des copier coller de ses fichiers manuellement afin de simuler le grand nombre de fichiers) et on doit coller les données dans le fichier synthese.
Merci
 
Dernière édition:
G

Guest

Guest
Re : Lire dans un fichier sans l'ouvrir

Bonjour David,

Patiente et longueur de temps....blablabla....;)

voici qui fera ce que tu demandes à partir de l'exemple que tu avais fourni dans tes précédents post.

Une recommandation toutefois. Eviter de nommer les colonne avec des mots réservés comme 'Date' (transformée ci-dessous en LaDate). En effet Date et une fonction SQL qui pourrait entrer en conflit avec un champ nommé Date, surtout si celui-ci n'est pas entouré de ` ou de [].

Petit plus: une procédure pour lister les champs du recordset vers une cellule, soit en ligne (horizontalement) soit en colonne (verticalement).

Code:
Sub TestImport()
    'Attention il y a trois S dans le nom de la feuille
    If IsDate(Sheets("Sommaire").Range("A1")) Then
        ImportDonnées ThisWorkbook.Path & "\fichieradupliquer.xls", "esssai", Year(Sheets("Sommaire").Range("A1"))
    End If
End Sub
Sub ImportDonnées(NomCompletFichier As String, NomOnglet, Annee)
'
' La référence à Microsoft ActiveX Data Objects 2.n Library doit être cochée
'
 
    Dim cnx As ADODB.Connection
    Dim rsT As ADODB.Recordset
    Dim SQL As String
 
 
    'Il faut éviter les espaces dans les noms de champs (Source de problèmes)
    'Ou alors les entrourer de []
    'Il faut éviter les noms de champs qui sont des mots du langage VB (ex: Date)
    'Initialisation de la chaine SQL
    SQL = "SELECT LaDate ,Colonne1, Colonne3 From [" & NomOnglet & "$]" _
        & " WHERE YEAR(LaDate)>=" & Annee _
        & " ORDER BY LaDate;"
 
    'Initialisation de la connexion au fichier
    Set cnx = New ADODB.Connection
    cnx.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
          "Data Source=" & NomCompletFichier & _
          ";Extended Properties=""Excel 8.0;HDR=YES;"""
 
    'Initialisation du recordset
 
    Set rsT = New ADODB.Recordset
    rsT.CursorLocation = adUseClient
 
    'Chargement du recordset
    rsT.Open SQL, cnx, adOpenStatic, adLockReadOnly
 
    'S'il n'est pas vide copie dans la feuille
    If Not rsT.EOF Then
        'Pour copier tout le recordset entêtes de champs inclus
        With Sheets("Sommaire")
            'Lister le noms de champs à partir de A2 en ligne
             ListerChamps rsT, .Range("A2"), True
            .Range("A" & Rows.Count).End(xlUp).Offset(1, 0).CopyFromRecordset rsT
        End With
    End If
    Set rsT = Nothing
    cnx.Close
    Set cnx = Nothing
 
End Sub
Sub ListerChamps(rs As ADODB.Recordset, CelluleDepart As Range, Optional bHorizontale As Boolean = True)
    Dim i As Integer
    If rs.State = adStateOpen Then
        For i = 0 To rs.Fields.Count - 1
            If bHorizontale Then
                CelluleDepart.Offset(, i) = rs.Fields(i).Name
            Else
                CelluleDepart.Offset(, i) = rs.Fields(i).Name
            End If
        Next i
    End If
End Sub

Si tu ne veux pas que la date s'affiche:

Code:
SQL = "SELECT Colonne1, Colonne3 From [" & NomOnglet & "$]" _
        & " WHERE YEAR(LaDate)>=" & Annee _
        & " ORDER BY LaDate;"

A bientôt
 
Dernière modification par un modérateur:
G

Guest

Guest
Re : Lire dans un fichier sans l'ouvrir

Davidm,

Désolé, mais je crois que tu devrais rester dans le fil de discussion. Si je ne réponds pas c'est que je n'ai pas le temps.

Ce que je t'ai donné n'est qu'un exemple de ce que l'on peut faire, adapté aux fichiers que tu m'as donnés. Si tu veux des réponses plus précises, soit plus précis dans tes demandes, avec fichier joints,
exemple etc.....

Mais surtout reste dans le fil.

Merci

Je mets cette réponse dans le fif afin que quelqu'un peut-être reprenne la main et comprenne ou tu en es.

En MP à dit:
Bonjour Hasco et merci de m'avoir répondu.

J'ai essayé ton code mais rien ne se passe.

J'ai mis les deux fichiers (Synthese et fichieradupliquer) dans le meme fichier mais rien.

Sinon dans le code suivant :
Code:
Sub TestImport()
    'Attention il y a trois S dans le nom de la feuille
    If IsDate(Sheets("Sommaire").Range("A1")) Then
        ImportDonnées ThisWorkbook.Path & "\fichieradupliquer.xls", "esssai", Year(Sheets("Sommaire").Range("A1"))
    End If
End Sub

Je vois que tu fais appel au fichier "fichieradupliquer". et a l'onglet "esssai" alros que je souhaite qu'il ouvre chaque fichier contenu dans le dossier dans lequel il est et qu'il copie les informations suivant certains critères des onglets dont les nom sont différents de feuil1, 2, 3 et Listes. Est ce réalisable?

Je sais que je t'en demande beaucoup mais la j'ai pas le niveau nécessaire pour modifier moi meme le code, j'essai mais j'ai beaucoup de mal.

Merci

David m
 

davidm

XLDnaute Nouveau
Re : Lire dans un fichier sans l'ouvrir

Bonjour tout le monde,

En fait, pour expliquer, j'ai mon fichier "synthese" qui se situe dans le meme dossier qu'un nombre indéterminé de fichier du meme type que "Ficheradupliquer".

Je souhaite donc faire la synthese de ces fichiers (du type Fichieradupliquer) avec les critères cités dans les messages précédents (récupération des colonnes1 et 3 en fonction de l'année --> onglet "Sommaire" range("A1").)

Pour conclure, j'arrive à réaliser ces différentes actions en visual basic mais en ouvrant chaque fichier (du type fichieradupliquer : je sais que je me répéte) un par un, ce qui prend beaucoup de temps.

Hasco m'a donc proposée une autre solution qui à l'air beaucoup plus rapide mais le probleme est que je ne comprend pas forcement comment cela fonctionne (de toute évidence je n'ai pas le niveau).

Voila, je suis donc pour le moment bloqué alors que je sais que la solution à mon probleme est a porté de main (mais malheureusement, je n'ai pas les bras assez long...).

davidm
 
G

Guest

Guest
Re : Lire dans un fichier sans l'ouvrir

David,

Quelques minutes pour toi,

Alors, dans:

Code:
Sub TestImport()
      If IsDate(Sheets("Sommaire").Range("A1")) Then
        ImportDonnées ThisWorkbook.Path & [COLOR=blue][COLOR=black]"\[/COLOR][B]fichieradupliquer.xls[/B][COLOR=black]"[/COLOR][B],[/B][/COLOR] [COLOR=blue][B]"esssai"[/B][/COLOR], Year(Sheets("Sommaire").Range("A1"))
    End If
End Sub

ThisWorkBook.Path = nom du répertoire(dossier) du classeur qui contient la macro

"fichieradupliquer.xls" est le nom du fichier dans lequel la procédure importDonnées fera la recherche.
"esssai" est le nom de la feuille dans laquelle faire la recherche.
Ces deux noms peuvent être remplacés par des variables.

Exemple:

Code:
Sub TestImport()
   Dim NomFichier as string
   Dim NomFeuille as string
   NomFichier="LeFichier.xls"
   NomFeuille="LaFeuille"
 
    If IsDate(Sheets("Sommaire").Range("A1")) Then
        ImportDonnées ThisWorkbook.Path & "\" & NomFichier, NomFeuille, Year(Sheets("Sommaire").Range("A1"))
    End If
End Sub

Mais comme madame Irma n'est pas là ces temps-ci, je n'ai aucun moyen de savoir comment sélectionner les fichiers et le nom de feuilles.

Je t'ai fait un exemple, à toi d'adapter et éventuellement revenir avec plus de précisions sur le choix des fichiers à ouvrir et des noms de feuilles concernées.

A bientôt donc pour de plus amples précisions
 

davidm

XLDnaute Nouveau
Re : Lire dans un fichier sans l'ouvrir

Bonjour Hasco et merci d'avoir pris du temps pour me répondre.

En fait, tout les documents seront placés dans le même dossier (le fichier synthese et le nombre indéterminé de fichier du type fichieradupliquer).

Je veux donc prendre les informations dans tous les fichiers du type fichieradupliqer mais leur nom varie (un de fichiers pourrait tres bien s'appeler dudu alors que l'autre vivi par exemple).

Ensuite les données à exporter se trouvent dans un onglet dont le nom varie en fonction du fichier dans lequel il se trouve, la seule chose qu'on sait avec certitude c'est qu'il ne s'agit pas des noms Feuil1, Feuil2, Feuil3 et Listes. Donc en résumé si il ne s'agit pas d'un de ces noms c'est que c'est le bon onglet.

Est ce que c'est plus clair ? (c'est difficile a expliquer)

Merci

Davidm
 

davidm

XLDnaute Nouveau
Re : Lire dans un fichier sans l'ouvrir

Bonjour,

J'ai déjà reparcouru le fil plusieurs fois et je n'arrive pas à faire fonctionner le code. J'ai fais des dizaines des tests mais rien à faire.

Je suis donc pour le moment bloqué.

Est ce que quelqu'un pourrait me renvoyer le fichier avec le code qui fonctionne?

Merci d'avance.

Davidm
 

davidm

XLDnaute Nouveau
Re : Lire dans un fichier sans l'ouvrir

Bonjour le fil,

Ci joint les deux fichiers avec le dernier code de Hasco.

Quand je lance la macro, il me marque "aucune valeur donnée pour un ou plusieurs paramètres requis".

Quand je clique sur débogage il me met sur la ligne :

Code:
    'Chargement du recordset
    rsT.Open SQL, cnx, adOpenStatic, adLockReadOnly

Avez vous le meme probleme ?

Merci d'avance

davidm
 

Pièces jointes

  • TEST.zip
    20.1 KB · Affichages: 34
  • TEST.zip
    20.1 KB · Affichages: 41
  • TEST.zip
    20.1 KB · Affichages: 40
G

Guest

Guest
Re : Lire dans un fichier sans l'ouvrir

Bonjour David,

Utiliser ADO pour extraire des données Excel à partir de noms de colonnes suppose que les noms des colonnes soit sur la première ligne de la feuille du fichier excel.

De plus si ADO rencontre 2 lignes vides il les interprète comme fin de table.

Dans le fichier fichieradupliquer.xls l'entête doit-être sur la première ligne.

A bientôt
 
Dernière modification par un modérateur:

davidm

XLDnaute Nouveau
Re : Lire dans un fichier sans l'ouvrir

Bonjour Hasco,

Ah d'accord, c'est ennuyeux, le probleme est que j'ai deux lignes (qui me servent de cartouche) avant le tableau contenant les données à extraire.

Ne peut on pas dire que les noms de colonnes sont en ligne 3 et donc de commencer la recherche à cet endroit ? enfin ou une astuce permettant d'arriver au meme résultat ?

Merci

Davidm
 

Discussions similaires

Réponses
5
Affichages
346
Réponses
8
Affichages
405

Membres actuellement en ligne

Statistiques des forums

Discussions
312 493
Messages
2 088 956
Membres
103 990
dernier inscrit
lamiadebz