Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Général VBA
Général VBA Forum général VBA . Pour les logiciels spécifiques (Access, Excel, Word, ...), postez dans les bons sous forums.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/06/2006, 02h56   #1
Invité de passage
 
Inscription : juin 2006
Messages : 23
Détails du profil
Informations personnelles :
Localisation : Maroc

Informations forums :
Inscription : juin 2006
Messages : 23
Points : 1
Points : 1
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 !
@lex(is) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2006, 04h07   #2
Invité de passage
 
Inscription : juin 2006
Messages : 23
Détails du profil
Informations personnelles :
Localisation : Maroc

Informations forums :
Inscription : juin 2006
Messages : 23
Points : 1
Points : 1
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 :
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!
@lex(is) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/06/2006, 04h23   #3
Invité de passage
 
Inscription : juin 2006
Messages : 23
Détails du profil
Informations personnelles :
Localisation : Maroc

Informations forums :
Inscription : juin 2006
Messages : 23
Points : 1
Points : 1
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.
@lex(is) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2006, 02h17   #4
Invité de passage
 
Inscription : juin 2006
Messages : 23
Détails du profil
Informations personnelles :
Localisation : Maroc

Informations forums :
Inscription : juin 2006
Messages : 23
Points : 1
Points : 1
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:

@lex(is) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2006, 07h35   #5
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 854
Points : 16 854
Envoyer un message via Skype™ à bbil
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...
bbil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/06/2006, 09h41   #6
Invité de passage
 
Inscription : juin 2006
Messages : 23
Détails du profil
Informations personnelles :
Localisation : Maroc

Informations forums :
Inscription : juin 2006
Messages : 23
Points : 1
Points : 1
Salut bbil,

Oui j'ai essaye, ca fonctionne pas non plus.
J'ai aussi essaye les fonctions CStr() et CCur(), sans succes...
@lex(is) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2006, 10h55   #7
Expert Confirmé
 
Inscription : mai 2005
Messages : 3 419
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 3 419
Points : 3 768
Points : 3 768
pour passer d'access à excel nul besoin de csv
faire données données externes nouvelle requête
__________________
Elle est pas belle la vie ?
random est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2006, 08h15   #8
Invité de passage
 
Inscription : juin 2006
Messages : 23
Détails du profil
Informations personnelles :
Localisation : Maroc

Informations forums :
Inscription : juin 2006
Messages : 23
Points : 1
Points : 1
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"...
@lex(is) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2006, 21h49   #9
Modérateur
 
Avatar de AlainTech
 
Homme Alain Gerard
Consultant informatique
Inscription : mai 2005
Messages : 3 675
Détails du profil
Informations personnelles :
Nom : Homme Alain Gerard
Âge : 58
Localisation : Belgique

Informations professionnelles :
Activité : Consultant informatique
Secteur : Finance

Informations forums :
Inscription : mai 2005
Messages : 3 675
Points : 7 645
Points : 7 645
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!
AlainTech est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2006, 04h40   #10
Invité de passage
 
Inscription : juin 2006
Messages : 23
Détails du profil
Informations personnelles :
Localisation : Maroc

Informations forums :
Inscription : juin 2006
Messages : 23
Points : 1
Points : 1
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...
@lex(is) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2006, 10h01   #11
Invité de passage
 
Inscription : juin 2006
Messages : 23
Détails du profil
Informations personnelles :
Localisation : Maroc

Informations forums :
Inscription : juin 2006
Messages : 23
Points : 1
Points : 1
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 :
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
Type de fichier : txt toto.txt (1,5 Ko, 3 affichages)
@lex(is) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2006, 10h44   #12
Membre chevronné
 
Avatar de Theocourant
 
Inscription : janvier 2005
Messages : 618
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations forums :
Inscription : janvier 2005
Messages : 618
Points : 700
Points : 700
Salut,

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

Code :
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 çà.
Theocourant est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2006, 11h42   #13
Invité de passage
 
Inscription : juin 2006
Messages : 23
Détails du profil
Informations personnelles :
Localisation : Maroc

Informations forums :
Inscription : juin 2006
Messages : 23
Points : 1
Points : 1
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:

Citation:
"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!
@lex(is) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/07/2006, 13h59   #14
Membre chevronné
 
Avatar de Theocourant
 
Inscription : janvier 2005
Messages : 618
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations forums :
Inscription : janvier 2005
Messages : 618
Points : 700
Points : 700
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 çà.
Theocourant est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2006, 11h15   #15
Invité de passage
 
Inscription : juin 2006
Messages : 23
Détails du profil
Informations personnelles :
Localisation : Maroc

Informations forums :
Inscription : juin 2006
Messages : 23
Points : 1
Points : 1
Ok merci quand meme Theocourant!

A+.
@lex(is) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 04h10   #16
Invité de passage
 
Inscription : juin 2006
Messages : 23
Détails du profil
Informations personnelles :
Localisation : Maroc

Informations forums :
Inscription : juin 2006
Messages : 23
Points : 1
Points : 1
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 :
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!
@lex(is) est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/07/2006, 11h19   #17
Inactif
 
Avatar de ouskel'n'or
 
Inscription : février 2005
Messages : 12 466
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 12 466
Points : 11 930
Points : 11 930
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à )
ouskel'n'or est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h05.


 
 
 
 
Partenaires

Hébergement Web