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 :

connexion ADO fichier texte, problème de séparateur


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2005
    Messages : 98
    Par défaut connexion ADO fichier texte, problème de séparateur
    Bonjour,

    Après de multiples recherches infructeuses, je viens à vous pour le cas où on aurait une réponse à ma question (ce que je ne doute point )

    le lien suivant fait ce qu eje veux (ce que j'avais déja fait) sauf à une exception, il ne gère pas les fichiers textes avec comme séparateur une tabulation... :

    http://excel.developpez.com/sources/...XT#CompilerTxt

    Le problème que j'ai est que je n'ai qu'un champ fields alors que je devrais en avoir 15 (quand j'affiche la valeur de mon fields, j'ai tout à la suite)

    Quelqu'un aurait-il une idée ?

    Merci d'avance

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour Laville,

    Je pense que le problème pourrait se trouver ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     '--- recuperation de la première ligne
                    For i = 0 To Rc.Fields.Count - 1
                    x = x & Rc.Fields(i).Name & ";"
                    Next i
                    Print #1, Left(x, Len(x) - 1) & vbCrLf;
    essayez :

    remplacer le ";" par "!"
    Dernière modification par AlainTech ; 31/08/2007 à 05h38. Motif: Balises [code], pas [quote]!

  3. #3
    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
    Remplacer plutôt ";" par chr(9) dans

    Print #1, "Champ1;Champ2" & vbCrLf;
    Print #1, Rc.GetString(, , ";", vbCrLf, "");

    Soit au final qqch comme
    Print #1, "Champ1" & Chr(9) & "Champ2" & Chr(9) &....& "ChampX" & vbCrLf;
    Print #1, Rc.GetString(, , Chr(9), vbCrLf, "");

    et en modifiant le code
    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
     
            .....
            cn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                   "Data Source=" & Chemin & ";" & _
                   "Extended Properties=""text;HDR=No;FMT=Delimited"""
     
            Set Rc = New ADODB.Recordset
            Rc.Open Source:="SELECT * FROM [" & Fichier & "]", ActiveConnection:=cn
            If Not Rc.EOF Then
                Print #1, Rc.GetString(, , Chr(9), vbCrLf, "");
            End If
     
            Rc.Close
            x = ""
            .....
    qui remplacera
    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
     
            .....
            cn = "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
            "Dbq=" & Chemin & ";Extensions=asc,csv,tab,txt"
     
            Set Rc = New ADODB.Recordset
            Rc.Open Source:="SELECT * FROM [" & Fichier & "]", ActiveConnection:=cn
     
            If Not Rc.EOF Then
     
                    '--- recuperation de la première ligne
                    For i = 0 To Rc.Fields.Count - 1
                    x = x & Rc.Fields(i).Name & ";"
                    Next i
                    Print #1, Left(x, Len(x) - 1) & vbCrLf;
                    '---
     
                Print #1, Rc.GetString(, , ";", vbCrLf, "");
            End If
     
            Rc.Close
            x = ""
            .....

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2005
    Messages : 98
    Par défaut
    Bonjour et merci à vous de vous pencher sur mon problème.

    Tout d'abord, le lien que j'avais donné était un exemple (la connexion est la même, le reste moins). Je vais donc mettre un bout de code pour que vous comprenniez mieux ce que je veux faire :

    - je fais la connexion comme marqué ci-dessus, jusque là pas de soucis, mon Ocnn contient 550 rows (la première n'est pas prise en compte et sont les noms de mes colonnes), mais oCnn.fields.count est égal à 1 alors que je voudrais qu'il soit égal à mon nombre de colonnes.
    - quand le fichier a pour séparateur un ; impec ca fonctionne (fichier .csv), mais quand c'est une tabulation, c'est le drame il me le prend comme une seule colonne et quand je fais un msgbox ocnn.fields(0) (il y a qu'une colonne donc....) et bien j'ai toutes mes valeurs à la suite, avec les tabulations qui les séparent.
    - Maintenant, soit effectivement je découpe chaque ligne (laborieux), soit il éxiste un paramètre me permettant de définir automatiquement le type de séparateur. Une troisième solution serait que je formatte le fichier en entrée (selon le type de séparateur, je met ce qui va bien mais bon, lourd aussi....)


    Voila un bout de mon code :

    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
        'Se connecte au fichier texte sélectionné
        oCnn.Driver = "{Microsoft Text Driver (*.txt; *.csv)};Extensions=asc,csv,tab,txt"
        oCnn.Connexion ("DefaultDir=" & dirname(csvFileName) & ";Extended Properties=""Excel 8.0;MaxScanRows=0;HDR=YES;IMEX=1""")
        'Récupère les données
        Set oRec = oCnn.OpenRecordSet("SELECT * FROM [" & ExtractFileName(csvFileName) & "]")
            Application.ScreenUpdating = False 'Optimise le traitement de la Macro
     
            Do While Not oRec.EOF
     
                iCurRow = iCurRow + 1
                iCurCol = 0
                'liste des colonnes de FrmFB avec la correspondance pour le fichier texte
                cSourceCols.moveFirst
                Do
                    iCurCol = iCurCol + 1
                    If (cSourceCols.Current.SourceName <> "") Then
                        If (cSourceCols.Current.name = cstKeyBonusCible) Then
                            iColBonus = iCurCol
                        End If
                        On Error Resume Next
                        If (cSourceCols.Current.datatype = "date") Then
                            wsFB.Cells(iCurRow, iCurCol) = IIf(IsNull(oRec.Fields(cSourceCols.Current.SourceName).Value), "", CDate(oRec.Fields(cSourceCols.Current.SourceName).Value))
                        ElseIf (cSourceCols.Current.datatype = "numeric") Then
                            wsFB.Cells(iCurRow, iCurCol) = CDbl(IIf(IsNull(oRec.Fields(cSourceCols.Current.SourceName).Value), "0", oRec.Fields(cSourceCols.Current.SourceName).Value))
                        Else
                            wsFB.Cells(iCurRow, iCurCol) = IIf(IsNull(oRec.Fields(cSourceCols.Current.SourceName).Value), "", oRec.Fields(cSourceCols.Current.SourceName).Value)
                        End If
                        If (cSourceCols.Current.datatype = "mixed") And (wsFB.Cells(iCurRow, iCurCol) <> "") Then
                            wsFB.Cells(iCurRow, iCurCol) = "'" & wsFB.Cells(iCurRow, iCurCol)
                        End If
                        On Error GoTo 0
                    End If
                    If (cSourceCols.Current.name = cstKeySalaire) Then
                        iColTotal = iCurCol
                    End If
                Loop Until Not cSourceCols.moveNext
    cSourceCols est un objet retournant la liste des colonnes du formulaire recevant les données avec le nom de chaque colonne ainsi que son équivalent par rapport aux colonnes du fichier texte ou csv.

    Mon problème étant qu'ils peuvent très bien importer un fichier csv, texte, etc (les séparateurs changent donc...)

    Merci encore

  5. #5
    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
    Une solution, à toi de l'adapter à ton contexte
    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
    Sub ConcatenationFichiers_CSVTAB_ADO()
    Dim Rc As ADODB.Recordset
    Dim cn As String, Chemin As String, Fichier As String
    Dim i As Long
    Dim Ar() As String
    Dim sTab As String
    Dim sCsv As String
     
        sTab = Chr(9)
        sCsv = Chr(59)
        Close
        Chemin = ThisWorkbook.Path & Application.PathSeparator & "TestCsvTab"
     
        Open ThisWorkbook.Path & Application.PathSeparator & "Compilation_CsvTab.txt" For Output As #1
            Fichier = Dir(Chemin & "\*.txt")
                Do While Fichier <> ""
                    cn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                         "Data Source=" & Chemin & ";" & _
                         "Extended Properties=""text;HDR=No;FMT=Delimited"""
     
                    Set Rc = New ADODB.Recordset
                    Rc.Open Source:="SELECT * FROM [" & Fichier & "]", ActiveConnection:=cn
                    If Not Rc.EOF Then
                        Ar = Split(Rc.GetString(, , sTab, vbCrLf, ""), sTab)
                        Print #1, Join(Ar, sTab);
                       ' Ou Print #1, Join(Ar, sCsv);
                    End If
                    Rc.Close
     
                    Fichier = Dir
                Loop
        Close #1
    End Sub

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    98
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Mars 2005
    Messages : 98
    Par défaut
    Merci de ta solution kiki, je la testerais en dernier recours (car j'avoue toujours avoir une préférence pour la gestion automatique des séparateurs, ce qui serait tout de même logique )

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

Discussions similaires

  1. [PHP & fichier texte] Probléme de retour chariot
    Par hunteshiva dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 17/10/2011, 11h36
  2. [XL-2003] Import fichier texte - problème avec séparateur milliers
    Par nmicoud dans le forum Excel
    Réponses: 4
    Dernier message: 15/04/2009, 13h48
  3. [VBA E07] Importation d'un fichier texte : problème FieldInfo
    Par Amanck dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/02/2009, 16h47
  4. Réponses: 4
    Dernier message: 28/11/2008, 12h23
  5. Réponses: 11
    Dernier message: 25/01/2007, 18h20

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