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 :

Lire fichier CSV sans l'ouvrir - ADO connexion


Sujet :

Macros et VBA Excel

  1. #1
    Membre actif Avatar de Many31
    Profil pro
    Inscrit en
    Février 2007
    Messages
    198
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 198
    Points : 210
    Points
    210
    Par défaut Lire fichier CSV sans l'ouvrir - ADO connexion
    Salut à Tous,

    J'essaye d'importer dans un Fichier Excel, des données de fichier CSV.
    Le soucis c'est qu'ils sont 250... Et les ouvrir un par un prend un temps important. J'ai donc essayé via les connexions ADO mais je suis bloqué

    J'ai pas mal cherché sur les sites anglophone mais je ne trouve rien de concluant. Le dernier code que j'ai écrit et qui semble marcher mieux que les précédents est celui-ci:

    Mais il bug sur la requête SQL =/ Set Rst = Cn.Execute(texte_SQL)
    "The microsoft data base engine couldn't find the object"
    Je ne sais pas quoi mettre dans texte_SQL =/ ni si quelqu'un à une autre méthode pour lire des CSV sans les ouvrir...

    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
    Sub Methode4()
        Dim Cn As ADODB.Connection
        Dim Fichier As String
        Dim NomFeuille As String, texte_SQL As String
        Dim Rst As ADODB.Recordset
        Dossier = "C:\Documents and Settings\..."
        FichierCSV = "Nomfichier.csv"
     
        Set Cn = New ADODB.Connection
        Cn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Dossier & ";Extended Properties = text"
        Cn.Open
        '-----------------
        texte_SQL = "SELECT * FROM [" & NomFichierCSV & "$]"
        Set Rst = New ADODB.Recordset
        Set Rst = Cn.Execute(texte_SQL)
     
        Range("A2").CopyFromRecordset Rst 
        Cn.Close
        Set Cn = Nothing
    End Sub
    Question subsidiaire :
    Cn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Dossier & ";Extended Properties = text" --> Marche
    Cn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Dossier & ";Extended Properties = text;HDR=YES;FMT=Delimited\" --> Marche pas hors c'est la ligne recommandée =/


    Merci d'avance pour votre aide
    Da vinci Code....


    Code??? qui a dit Code?

  2. #2
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Bonjour,

    2 idées, juste en passant car je ne fais pas d'ADO sur ce type de source.

    1) Peut-etre que ton dossier contient des espaces et que cela fiche la muise.

    2) regarde l'exemple ci-dessous sur une source AS400. Le String de connection est défini comme tel avant utilisation. Cela pourrait aider.

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    Public Sub ReadFileI5Full(ByVal Input_File As String, ByVal Target_worksheet As String, ByVal Target_range As String)
    'ReadFileI5Full : get I5 data from Lib.file(member) and insert that in Worksheet at désired range cell
    'usage : ReadFileI5Full (File, Worksheet, Range)
    ' Input_File : can be either Lib.file
    '                    or Lib.File(member)
    ' Target_Worksheet : Must be a valid Worksheet Name : if exists : cleared before fullfillment
    '                                              if not exists : will be created
    ' Target_Range     : Must be a valid cell name : Example "A1"
     
        On Error GoTo ErrorHandler
     
        Dim cn          As New ADODB.Connection
        Dim rs          As New ADODB.Recordset
        Dim sConn       As String
        Dim SqlString   As String
        Dim FileName    As String
        Dim DSN_Name As String
        Dim ws          As String 'Results Storing Worksheet name
        Dim Rg          As String 'results Cells top left
        Dim cellule     As Range
        Dim CompA       As Integer
        Dim idx         As Long
        Dim sheet_found As Boolean
        Dim ActShName   As String
        Dim Rec_nbr     As Long   'Record Set record Count
     
     
     
     
     
        sConn = "provider=IBMDA400;Data source=xxx.xxx.xxx.xxx;USER ID=USERID;PASSWORD=PASWWORD"
        FileName = Trim(Input_File)
        ws = Trim(Target_worksheet)
        Rg = Trim(Target_range)
     
        'check target Worsksheet exists and if not build
        sheet_found = False
        For idx = 1 To Sheets.Count
            If Sheets(idx).Name = ws Then
                Application.DisplayAlerts = False
                Sheets(idx).Cells.Clear
                Application.DisplayAlerts = True
                sheet_found = True
                Exit For
            End If
        Next idx
        'Build Ws
        If Not sheet_found Then
            ActShName = ActiveSheet.Name
            Sheets.Add
            ActiveSheet.Name = ws
            Sheets(ActShName).Activate
        End If
     
        'Open Connection
        cn.ConnectionString = sConn
        cn.Open
        SqlString = "SELECT * FROM " & FileName & ""
     
        'open record Set
        rs.Open SqlString, cn
        Rec_nbr = rs.RecordCount
     
     
     
        'Paste Fields names in line 1
        Set cellule = Worksheets(ws).Range(Rg)
        For CompA = 0 To rs.Fields.Count - 1
            cellule.Offset(0, CompA).Value = rs.Fields(CompA).Name
        Next CompA
        'Paste results line above names
        Worksheets(ws).Range(Rg).Offset(1, 0).CopyFromRecordset rs
     
        rs.Close
        cn.Close
        Set cn = Nothing
        Set rs = Nothing
        'MsgBox Rec_nbr & " records imported from I5"
     
        Exit Sub
    ErrorHandler:
        ' clean up
        If Not cn Is Nothing Then
            If cn.State = adstateopen Then cn.Close
        End If
        Set cn = Nothing
        If Not rs Is Nothing Then
            If rs.State = adstateopen Then rs.Close
        End If
        If Err <> 0 Then
          MsgBox Err.Source & "-->" & Err.Description, , "Error"
        End If
     
    End Sub
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  3. #3
    Membre actif Avatar de Many31
    Profil pro
    Inscrit en
    Février 2007
    Messages
    198
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 198
    Points : 210
    Points
    210
    Par défaut
    J'ai mal au crane lol mais je vais essayer de regarder cette source merci

    Au pire je vais essayer de changer l'extension des csv en xls et de les lires de façon classique
    Da vinci Code....


    Code??? qui a dit Code?

  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
    12 773
    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 : 12 773
    Points : 28 637
    Points
    28 637
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    J'essaye d'importer dans un Fichier Excel, des données de fichier CSV.
    Le soucis c'est qu'ils sont 250... Et les ouvrir un par un prend un temps important. J'ai donc essayé via les connexions ADO mais je suis bloqué
    Tu dis que c'est lent mais as-tu essayé de placer l'instruction ci-dessous en tête de procédure. Cela accélère l'exécution.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.ScreenUpdating = False
    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 actif Avatar de Many31
    Profil pro
    Inscrit en
    Février 2007
    Messages
    198
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 198
    Points : 210
    Points
    210
    Par défaut
    J'ai même tenté le

    Application.visible = False...

    Mais finalement j'ai trouvé pour le lien ADO vers ce CSV:

    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 Methode4()
        Dim Cn As ADODB.Connection
        Dim Fichier As String
        Dim NomFeuille As String, texte_SQL As String
        Dim Rst As ADODB.Recordset
        On Error GoTo ADO_ERROR
        Dossier = "Lien_Dossier" 'penser à terminer par un \
        FichierCSV = "Nom_Fichier_CSV" 'penser à l'extension .csv
     
        Set Cn = New ADODB.Connection
        Cn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Dossier & ";Extended Properties=""text;HDR=Yes;FMT=Delimited(;)"";Persist Security Info=False"
        Cn.ConnectionTimeout = 40
        Cn.Open
        '-----------------
        texte_SQL = "SELECT * FROM " & FichierCSV
     
        Set Rst = New ADODB.Recordset
        Rst.ActiveConnection = Cn
        Rst.Source = texte_SQL
        Rst.Open
     
        i = 2
        If Rst.EOF <> True Then
            While Rst.EOF = False
                'Variable() = Rst.Fields(0)
                i = i + 1
                Rst.MoveNext
            Wend
        End If
        Rst.Close
        Set Rst = Nothing
        Cn.Close
        Set Cn = Nothing
    ADO_ERROR:
        If Err <> 0 Then
            Debug.Assert (Err = 0)
            MsgBox (Err.Description)
            Resume Next
        End If
    End Sub
    Da vinci Code....


    Code??? qui a dit Code?

  6. #6
    Membre émérite Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 392
    Points : 2 985
    Points
    2 985
    Par défaut
    Mais finalement j'ai trouvé pour le lien ADO vers ce CSV:
    Il manquait le Slash de fin ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Dossier = "Lien_Dossier" 'penser à terminer par un \
    Si oui, nous n'aurions pu trouver.... d'où l'importance d'un code réel ou équivalent !!!
    (\ _ /) Cordialement G@dz
    (='.'=)

    (")-(") Vous avez des neurones. Sollicitez-les. . Si vous êtes aidé, pensez à Voter.

  7. #7
    Membre actif Avatar de Many31
    Profil pro
    Inscrit en
    Février 2007
    Messages
    198
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 198
    Points : 210
    Points
    210
    Par défaut
    Oui et non... c'était un des défauts de mon premier code mais pas le seul
    L'autre erreur était dans la déclaration du séparateur du csv
    et pas
    Je m'appercois également que j'ai un "." dans le nom de mon fichier csv

    exemple "Nom.fichier.csv" -> et ça ca passe pas

    Faut que je trouve une methode pour soit remplacer ce point par un autre caractère soit trouver pourquoi l'ADO ne voit pas l'extension CSV
    Da vinci Code....


    Code??? qui a dit Code?

  8. #8
    Membre actif Avatar de Many31
    Profil pro
    Inscrit en
    Février 2007
    Messages
    198
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2007
    Messages : 198
    Points : 210
    Points
    210
    Par défaut
    Finalement j'ai choisi la méthode bourrin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Remplacement_Nom_Fichier(Chemin As String)
        Fich = Dir(Chemin & "*.csv")
        Do While Fich <> ""
                Texte = Left(Fich, Len(Fich) - 4)
                Texte = Replace(Texte, ".", "_") & ".csv"
                Name Chemin & Fich As Chemin & Texte
            Fich = Dir
        Loop
    End Sub
    Un grand merci pour votre aide

    (j'esp que ça va marcher sur des roulettes maintenant )
    Da vinci Code....


    Code??? qui a dit Code?

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

Discussions similaires

  1. ZIP : Lire un fichier zip sans l'ouvrir
    Par pracede2005 dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 29/05/2008, 09h19
  2. lire fichier csv
    Par nico0812 dans le forum C#
    Réponses: 4
    Dernier message: 17/04/2007, 18h40
  3. lire fichier csv et en extraire des infos
    Par isaglada dans le forum VBScript
    Réponses: 2
    Dernier message: 12/02/2007, 13h04
  4. [W3C] Lire fichier *.mid sans plugin midi ?
    Par Lareine dans le forum Balisage (X)HTML et validation W3C
    Réponses: 12
    Dernier message: 14/11/2005, 13h23

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