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 :

Lecture csv sans ouverture ADO ou pas [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre expérimenté Avatar de CODYCO
    Homme Profil pro
    Webplanneur
    Inscrit en
    Avril 2009
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webplanneur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 217
    Par défaut Lecture csv sans ouverture ADO ou pas
    Un nouveau bonjour à tous et un nouveau problème

    Mon soucis :

    Je détermine par une boite de dialogue aupres de l'utilisateur un fichier csv contenant des données que je veux juste importer dans un classeur.

    Jusqu'à présent j'ouvrais mon fichier je copier les parties dont j'ai besoin et je collé sur ma feuille excel, seulement voila j'aimerais obtimiser mon code et donc ralentir le traitement car cette copie est longue...

    J'ai trouver différente chose en cherchant sur le forum et sur nénette, comme:

    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
     
    Sub importFichierTexte_ADO()
        Dim Rc As ADODB.Recordset
        Dim Cn As String, Chemin As String, Fichier As String
        Dim i As Long
     
        Chemin = V_Imp
        V_file = Mid(V_Imp, InStrRev(V_Imp, "\") + 1)
        Chemin = Replace(Chemin, V_file, "")
        Fichier = V_file
     
        Cn = "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
            "Dbq=" & Chemin & ";Extensions=csv,tab,txt"
     
        Set Rc = New ADODB.Recordset
        Rc.Open Source:="SELECT * FROM " & Fichier, ActiveConnection:=Cn
     
        If Not Rc.EOF Then
            'For i = 0 To Rc.Fields.Count - 1 'recuperation entetes
            'Cells(1, 1).Offset(0, i) = Rc.Fields(i).Name
            'Next
            Range("A2").CopyFromRecordset Rc
        End If
     
        Rc.Close
    End Sub
    mais cela me retourne un message d'erreur "Pilote ODBC texte erreur de syntaxe dans la close From ...?

    et pas d'autre solution trouvé sur le forum...

  2. #2
    Expert confirmé
    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
    Par défaut
    Salut, as-tu vu ceci , c'est pour une concaténation non ADO de CSV, donc à adapter.

    sinon, voir la syntaxe ici et lire également ceci

  3. #3
    Membre expérimenté Avatar de CODYCO
    Homme Profil pro
    Webplanneur
    Inscrit en
    Avril 2009
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webplanneur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 217
    Par défaut
    Merci KiKi pour ta piste, j'ai utilisé ces tuto pour ma solution meme si je ne trouve pas vraiment comment le faire avec un fichier csv...

    A l'heure actuel ca donne ceci
    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
     
    Sub RequeteClasseurFerme()
        Dim Cn As ADODB.Connection
        Dim Fichier As String
        Dim NomFeuille As String, texte_SQL As String
        Dim Rst As ADODB.Recordset
     
        'Définit le classeur fermé servant de base de données
        Fichier = V_Imp
        'Nom de la feuille dans le classeur fermé
        NomFeuille = "Feuil1"
     
        Set Cn = New ADODB.Connection
     
        '--- Connection ---
        With Cn
            .Provider = "Microsoft.Jet.OLEDB.4.0"
            .ConnectionString = "Data Source=" & Fichier & _
                ";Extended Properties=Excel 8.0;"
            .Open
        End With
        '-----------------
     
        'Définit la requête.
        '/!\ Attention à ne pas oublier le symbole $ après le nom de la feuille.
        texte_SQL = "SELECT * FROM [" & NomFeuille & "$]"
     
        Set Rst = New ADODB.Recordset
        Set Rst = Cn.Execute(texte_SQL)
     
        'Ecrit le résultat de la requête dans la cellule A2
        Worksheets("Liste").Activate                                                          'Active le feuille liste
        Range("A5").Select
        Range("A5").CopyFromRecordset Rst
     
        '--- Fermeture connexion ---
        Cn.Close
        Set Cn = Nothing
     
    End Sub
    Ce code fonctionne presque seul bémole un bug sur la ligne Range("A5").Copy...

    Erreur ma méthode CopyFromRecordset a échouer... je ne sais pourquoi...

    Autre élément donc je ne trouve les paramètres pour "Extended Properties" pour fichier csv...

    Merci de vos lumières.

  4. #4
    Membre expérimenté Avatar de CODYCO
    Homme Profil pro
    Webplanneur
    Inscrit en
    Avril 2009
    Messages
    217
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Webplanneur
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 217
    Par défaut
    Bon ne parvenant pas à écrire l'ensemble des données d'un bloc je suis passé par une méthode détournée qui fonctionne mais qui est relativement longue...

    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
     
    Set Rst = New ADODB.Recordset
        Set Rst = Cn.Execute(texte_SQL)
     
     
        ' Compte le nombre de colonne et remet pointeur à 1
        fldCount = Rst.Fields.Count
        Rst.MoveFirst
        x = Rst.RecordCount
        Worksheets("Liste").Range("A5").CopyFromRecordset Rst
        L = 5
        'Ecrit le résultat de la requête dans la cellule
        For iCol = 1 To fldCount
            While Not (Rst.EOF)
            x = Rst.RecordCount
            Worksheets("Liste").Cells(L, iCol).Value = Rst.Fields(iCol - 1).Value
            Rst.MoveNext
            L = L + 1
     
            Wend
        Rst.MoveFirst
        L = 5
        Next
    ... Si vous aviez une solution ou savoir pourquoi mon "Range("A5").CopyFromRecordset Rc" ne marche pas...

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

Discussions similaires

  1. [XL-2010] Ouverture .csv depuis script VBA et fermeture après de ce .csv sans enregistrer
    Par kythi dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 28/06/2013, 12h44
  2. Lire fichier CSV sans l'ouvrir - ADO connexion
    Par Many31 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 06/06/2012, 13h45
  3. [XL-2003] Conversion automatique d'un .csv à l'ouverture sans macro
    Par smar6ty4 dans le forum Excel
    Réponses: 3
    Dernier message: 05/01/2012, 16h00
  4. forcer l'ouverture en lecture seule sans messages
    Par ozthewizard dans le forum Excel
    Réponses: 2
    Dernier message: 28/09/2011, 14h20
  5. [XL-2007] Test si fichier protégé en lecture (sans ouverture dudit fichier)
    Par chadom dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/07/2010, 11h08

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