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

VBA Discussion :

CSV trait d'union posant probleme


Sujet :

VBA

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Juin 2006
    Messages : 23
    Points : 6
    Points
    6
    Par défaut CSV trait d'union posant probleme
    Bonjour,

    Y'a que moi pour avoir des pbs comme ca...

    J'ai un fichier CSV construit a partir d'une BDD que je recupere (ODBC) et affiche sous Excel. Celui-ci contient des champs contenant simplement "-" (trait d'union).

    Certaine colonnes sous Excel sont a vide ou contient simplement "0" (zero) apres la recuperation des donnees. En utilisant le deboggueur, je me rend compte que lors de la premiere ligne du CSV lu par mon RecordSet, le programme reconnait "-" comme un objet de type "Long". Il n'affiche pas les prochais champs de type texte puisque l'objet est fixe de type "Long".

    C'est comprehensible ???

    Comment faire pr specifier le type d'un champ dans mon CSV avant de le parcourir avec mon RecordSet ???

    Si quelqu'un a la solu (je doute mais bon ca vaut le coup d'essayer), merci de me donner un coup de main !

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Juin 2006
    Messages : 23
    Points : 6
    Points
    6
    Par défaut ODBC Donnees erronees
    Bonjour,

    Je recupere des informations d'un fichier texte en utilisant une connexion ODBC pour les mettre dans des colonnes sous Excel.

    Deux colonnes sont mal renseignees: une devrait contenir des donnees de Type Currency (> 2 147 483 647) et contient uniquement des donnees de Type Long, une autre devrait contenir du String et contient... des zeros (Long).

    Voici 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
    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
     
    'Open the connexion to the text file
    cnx.ConnectionString = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=p:;" _
                           "Extensions=asc,csv,tab,txt;Persist Security Info=False;IMEX=1;"
    cnx.Open
     
    'Do and send the request
    requete = "Select * from [Export.txt]"
     
    rs.Open requete, cnx
     
    rowIndex = rowStart
    While Not (rs.EOF)
     
      'Sorting criterias
      If Not IsNull(rs.Fields(12)) Then
        If CLng(rs.Fields(12)) < CLng(Sheet1.Cells(2, 7).value) Then
          GoTo NotSelected
        End If
     
        If CLng(rs.Fields(12)) > CLng(Sheet1.Cells(3, 7).value) Then
          GoTo NotSelected
        End If
      Else
        If Sheet1.Cells(2, 7).value <> "" Then
          GoTo NotSelected
        End If
      End If
     
      Sheet1.Cells(rowIndex, 2).value = rs.Fields(0).value
      Sheet1.Cells(rowIndex, 3).value = rs.Fields(1).value
      Sheet1.Cells(rowIndex, 4).value = rs.Fields(2).value
      Sheet1.Cells(rowIndex, 5).value = rs.Fields(3).value
      Sheet1.Cells(rowIndex, 6).value = rs.Fields(21).value
      Sheet1.Cells(rowIndex, 7).value = rs.Fields(17).value
      Sheet1.Cells(rowIndex, 8).value = rs.Fields(18).value
      Sheet1.Cells(rowIndex, 9).value = rs.Fields(19).value
      Sheet1.Cells(rowIndex, 10).value = rs.Fields(20).value
      Sheet1.Cells(rowIndex, 11).value = rs.Fields(6).value
      Sheet1.Cells(rowIndex, 12).value = rs.Fields(23).value
      Sheet1.Cells(rowIndex, 13).value = rs.Fields(8).value
      Sheet1.Cells(rowIndex, 14).value = rs.Fields(9).value
      Sheet1.Cells(rowIndex, 15).value = rs.Fields(11).value
      Sheet1.Cells(rowIndex, 16).value = rs.Fields(7).value
      Sheet1.Cells(rowIndex, 17).value = rs.Fields(12).value
      Sheet1.Cells(rowIndex, 18).value = rs.Fields(13).value
      Sheet1.Cells(rowIndex, 19).value = rs.Fields(14).value
      Sheet1.Cells(rowIndex, 20).value = rs.Fields(15).value
      Sheet1.Cells(rowIndex, 21).value = rs.Fields(16).value
      Sheet1.Cells(rowIndex, 22).value = rs.Fields(10).value
      Sheet1.Cells(rowIndex, 25).value = rs.Fields(22).value
     
      rowIndex = rowIndex + 1
     
    NotSelected:
      rs.MoveNext
     
    Wend
     
    'Closing the connexion
    rs.Close
    J'ai vraiment vraiment besoin d'un coup de main, je bloque depuis trop longtemps!

    Merci!

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Juin 2006
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Ah oui pardon, je voulais rajouter que la premiere ligne du fichier texte pour les colonnes qui me posent probleme contient 1207710000 pour la colonne de type Currency et - (trait d'union uniquement) pour la colonne de type String.

    Merci d'avance.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Juin 2006
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Pas de reponse pour ce post ?
    Je trouve toujours pas...




    Nan, en fait je voulais faire l'effet d'une manif mais c'est celui-la que je voulais mettre:



    Mais je merite peut etre celui-la:


  5. #5
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    as-tu essayé de mettre la colonne au bon format ( texte..) avant de lancer ta procédure? ...si c'est ok il ne restera ensuite qu'a voir comment etablir automatiquement ce format...

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Juin 2006
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Salut bbil,

    Oui j'ai essaye, ca fonctionne pas non plus.
    J'ai aussi essaye les fonctions CStr() et CCur(), sans succes...

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    pour passer d'access à excel nul besoin de csv
    faire données données externes nouvelle requête
    Elle est pas belle la vie ?

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Juin 2006
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Bonjour Random,

    C'est une base Lotus Notes (pas access) dont je ne peux seulement passer par un CSV...

    Va falloir mieux pour meriter le statut de "Expert"...

  9. #9
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Va falloir nous donner de meilleures infos si tu veux des réponses correctes.

    Depuis le début tu nous distille les renseignements au compte gouttes.

    Si tu nous montrais, au moins, le contenu de ta base (ou du CSV) et ce que tu veux en obtenir, on pourrais, peut-être, t'aider.
    N'oubliez pas de cliquer sur quand vous avez obtenu ou trouvé vous-même la réponse à votre question.
    Si vous trouvez seul, pensez à poster votre solution. Elle peut servir à d'autres!
    Pensez aussi à voter pour les réponses qui vous ont aidés.
    ------------
    Je dois beaucoup de mes connaissances à mes erreurs!

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Juin 2006
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Ok tu as peut-etre raison, je vais essayer d'etre plus precis. Mais definir un probleme que l'on a du mal a cerner est toujours complexe...
    Je reformule mon probleme le plus simplement possible. Je laisse tomber le probleme des tirets et me concentre sur le second probleme.

    J'utilise une connexion ODBC (dont j'ai mis le code au-dessus) pour recuperer des donnees d'un fichier CSV (separe par des virgules). J'ai une colonne qui contient les valeurs suivantes (dans le fichier CSV):

    Amount
    1207710000
    42100000
    27360000
    13980000
    17910000
    106360000
    150000
    200000
    400000
    102460000
    0
    3000000000
    1000000000
    4360000
    300000000
    25000000000
    1000000
    1450000


    Lorsque je recupere ses valeurs pour les mettre dans une colonne sous Excel, je ne vois que les valeurs < 2 147 483 647 (donc de type Long) et pas superieur a cette valeur (j'ai un blanc a la place),

    En utilisant le deboggueur (watch sur un recordSet.Field()), je vois que la macro recupere les valeurs de type Long et affiche nulle pour les valeurs de type currency (> 2 147 483 647) provenant du CSV.

    Il faudrait que je puisse specifier a l'avance le type de la colonne, c'est a dire Currency pour avoir toutes les valeurs (Long et Currency).

    Je ne peux pas mettre l'ensemble du CSV parce que d'abord il est enorme mais aussi c'est des donnees confidentielles que je ne peux pas mettre en ligne...

    Voila... J'espere avoir ete clair...

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Juin 2006
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Comme j'ai vraiment vraiment besoin d'aide sur ce coup-la , j'ai fait une ptite macro simplissime comportant mon probleme. J'ai mis un fichier TXT en piece jointe a mettre dans C:\TEMP.

    Voici le code de la macro:

    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
     
     Sub test()
     
        Dim RowIndex As Integer
        Dim requete As String
        Dim cnx As New ADODB.Connection
        Dim rs As New ADODB.Recordset
     
        'Open the connexion to the text file
        cnx.ConnectionString = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=c:\TEMP\;Extensions=asc,csv,tab,txt;Persist Security Info=False;IMEX=1;"
        cnx.Open
     
        'Do and send the request
        requete = "Select * from [toto.txt]"
        rs.Open requete, cnx
     
        RowIndex = 1
     
        While Not (rs.EOF)
     
            'Deal name
            Sheet1.Cells(RowIndex, 1) = rs.Fields(0)
            RowIndex = RowIndex + 1
     
            rs.MoveNext
     
        Wend
     
        'Closing the connexion
        rs.Close
     
    End Sub
    (En reference: "Microsoft ActiveX Data Objects 2.8 Library")

    La macro "attaque" le fichier texte et affiche une colonne comportant les nombres de ce fichier. Elle n'affiche pas les nombres > 2 147 483 647. c'est mon probleme...
    Fichiers attachés Fichiers attachés

  12. #12
    Membre éclairé
    Avatar de Theocourant
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 618
    Points : 739
    Points
    739
    Par défaut
    Salut,

    Je ne sais pas si tu as remarqué mais cela se passe à ce niveau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets(1).Cells(RowIndex, 1) = rs.Fields(0)
    En rouge une petite erreur à corriger

    Le problème est que lorsque tu dépasses le seuil que tu as indiqué rs.Fields(0) prend la valeur Null ...

    Je ne sais pas si cela peut donner des pister de résolution

    +

    Théo
    Forums VB : lire la notice
    La touche existe pour être utilisée
    Pensez au tag
    Pour ceux n'ayant pas l'aide installée :
    - Aide MSDN pour VB6
    - Aide MSDN pour VBA
    Je ne réponds pas aux questions techniques par MP. Merci d'utiliser le forum fait pour çà.

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Juin 2006
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Salut Theocourant,

    Je comprend pas: l'"erreur" que tu as corrige permet de resoudre le probleme ? J'ai essaye mais ca ne fonctionne pas...

    Sinon j'avais deja remarque pour la valeure null:

    "En utilisant le deboggueur (watch sur un recordSet.Field()), je vois que la macro recupere les valeurs de type Long et affiche nulle pour les valeurs de type currency (> 2 147 483 647) provenant du CSV."
    Par contre, tu expliques peut-etre plus clairement...

    HELP!

  14. #14
    Membre éclairé
    Avatar de Theocourant
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    618
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 618
    Points : 739
    Points
    739
    Par défaut
    Citation Envoyé par @lex(is)
    Je comprend pas: l'"erreur" que tu as corrige permet de resoudre le probleme ? J'ai essaye mais ca ne fonctionne pas...
    La correction permet de faire tourner le code que tu nous as passé mais ne solutionne en rien ton problème ...

    Sinon je ne suis pas assez connaisseur pour comprendre plus loin le problème : je ne vais pas pouvoir t'aider plus désolé.

    Bonne continuation

    Théo
    Forums VB : lire la notice
    La touche existe pour être utilisée
    Pensez au tag
    Pour ceux n'ayant pas l'aide installée :
    - Aide MSDN pour VB6
    - Aide MSDN pour VBA
    Je ne réponds pas aux questions techniques par MP. Merci d'utiliser le forum fait pour çà.

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Juin 2006
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    Ok merci quand meme Theocourant!

    A+.

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Maroc

    Informations forums :
    Inscription : Juin 2006
    Messages : 23
    Points : 6
    Points
    6
    Par défaut
    J'ai finalement detourne le probleme en traitant le fichier CSV comme un fichier texte tout simple, en le lisant ligne par ligne (methode ReadLine) et en recuperant chaque champ separe par une virgule avec la fonction "Split":

    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
     
        Dim fs As New FileSystemObject
        Dim txtstream As TextStream
        Dim tabString() As String
     
        Set txtstream = fs.OpenTextFile("c:Export.csv")
     
        'ne pas traiter la premiere ligne contenant les noms des champs
        txtstream.ReadLine
     
        While Not txtstream.AtEndOfStream
            tabString = Split(txtstream.ReadLine, ",")
     
            Sheet1.Cells(rowIndex, 2) = tabString(0)
            ...
            Sheet1.Cells(rowIndex, 18) = tabString(12)
     
            rowIndex = rowIndex + 1        
        Wend

    Voili voilou... Merci pour ceux qui ont tente de m'aider!

  17. #17
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 543
    Points
    15 543
    Par défaut
    J'ai remplacé ton Délestage par résolu car si j'avais vu ta question, c'est la solution que je t'aurais conseillée et qui me semble la meilleure (mais j'étais pas là )

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

Discussions similaires

  1. Afficher un trait d'union dans un popupmenu
    Par MiJack dans le forum Débuter
    Réponses: 2
    Dernier message: 24/12/2008, 10h11
  2. Erreur 400 à cause d'un trait d'union
    Par Shara dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 06/06/2008, 17h09
  3. indexation fulltext des mots avec un trait d'union
    Par andraz dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 12/03/2007, 16h46
  4. Dll posant problemes a la compilation
    Par titor dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 06/05/2006, 18h48

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