yo612
Messages postés16Date d'inscriptionmercredi 21 février 2007StatutMembreDernière intervention19 juillet 2007
-
9 mars 2007 à 21:47
yo612
Messages postés16Date d'inscriptionmercredi 21 février 2007StatutMembreDernière intervention19 juillet 2007
-
11 mars 2007 à 12:15
Bonsoir,
Voilà j'ai presque fini mon soft, mais je rame depuis quelques temps avec la fonction split.
J'ouvre un fichier
je le split
je récupère chaque split
MAIS !!! Je n'ai que la première ligne du fichier. Les autres lignes du fichier ne s'affiche pas.
J'ai raté un For Each quelque part ou est-ce dans mon while not EOF qu'il faut que je rajoute qqchose ????
Un ptit coup de main SVP
Merci
Voici un extrait de mon code :
----------------------------------------------------------------------------
'ouvre le fichier source pour lecture
Open Filename For Input As #i
'lit toutes les lignes jusqu'à la fin du fichier
While Not EOF(i)
'met la première ligne lue dans la variable a
Line Input #i, a
checkdate = Left(a, 10)
'vérifie si la première ligne contient une date, sinon saute l'entête du fichier
If IsDate(checkdate) = True Then
While Not EOF(i)
Templire = Templire & a & crlf
Line Input #i, a
'compte le nombre de lignes lues
CptLine = CptLine + 1
tablo = Split(Templire, Chr(9))
Wend
lire = "D" & tablo(0) & crlf & "T" & tablo(2) & crlf & "M" & tablo(1) & crlf & "^" & crlf
CptLine = CptLine + 1
Unload Me
MsgBox CptLine & " lignes converties", vbInformation, "Nombre de lignes"
End If
Wend
---------------------------------------------------------------------------
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 9 mars 2007 à 23:21
Split réinitialise le Tableau à chaque passage
C'est pratique pour séparer une chaîne en morceau, mais ça ne conserve pas les données précédentes.
Il faudrait que tu passes par un tableau dynamique si tu veux conserver tes données
De plus, pour vérifier ta date, tu pourrais le faire tout juste avant le premier While et éliminer le deuxième
'ouvre le fichier source pour lecture
Open Filename For Input As #i
'met la première ligne lue dans la variable a
Line Input #i, a
checkdate = Left(a, 10)
'vérifie si la première ligne contient une date, sinon saute l'entête du fichier
If IsDate(checkdate) = True Then
While Not EOF(i)
......
yo612
Messages postés16Date d'inscriptionmercredi 21 février 2007StatutMembreDernière intervention19 juillet 2007 9 mars 2007 à 23:31
lire est une variable que j'affiche dans une textbox et également me sert à enregistrer le résultat dans un nouveau fichier avec print nouveaufichier, lire
Pour la vérification de la date, je pense pas pouvoir faire autrement car avant les données que je veux conserver et qui commence par une date, il y a une entête dans le fichier et qui est de longueur variable (en nombre de lignes, je parle)
Pour le tableau dynamique, je ne connais pas du tout.
je pensais mettre un for each qqchose
plus un i = i +1
mais je rame car je ne trouve pas d'expression exacte qui pourrait me convenir
Je suis sûr que l'on peut lire un fichier en entier et trouver les colonnes qui vont bien, comme quand on importe un fichier dans excel, mais je ne trouve pas la fonction ou les fonctions...
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 10 mars 2007 à 14:38
Tu dis que tu récupères chaque Split(), mais ce n'est pas le cas
While Not EOF(i)
Templire = Templire & a & crlf
Line Input #i, a
'compte le nombre de lignes lues
CptLine = CptLine + 1
'ici tablo contiendra bien les parties de Templire, en principe ...
tablo = Split(Templire, Chr(9))
'mais tu ne fais rien avec et tu reboucles
'il faudrait peut-être que tu mettes cette ligne ici plutôt qu'après le Wend
lire = lire & "D" & tablo(0) & vbcrlf & "T" &
tablo(2) & vbcrlf & "M" & tablo(1) & vbcrlf & "^" &
vbcrlf
Wend
Et tu devrais quand même enlever le premier While, je pense (j'avais dit le deuxième...)
Mais ne connaissant pas ton fichier et ne comprenant pas vraiment à quoi sert la condition de date... (?)
Est-ce que cette date est toujours sur la première ligne du fichier ? Peut-elle être sur une autre ligne et est-ce à partir de là que tu commences à lire le fichier ? Est-ce qu'il peut y avoir plusieurs dates dans le fichier ??? plusieurs inconnues, quoi...
yo612
Messages postés16Date d'inscriptionmercredi 21 février 2007StatutMembreDernière intervention19 juillet 2007 10 mars 2007 à 15:52
Bonjour,
Merci de ta réponse mais j'ai trouvé la boulette et m'a obligé à refaire le while not EOF
La date n'est jamais sur la première ligne (sauf cas particulier), il y a toujours un entête + vbcrlf + la date et les données + vbcrlf + date et données, etc...
J'ai gardé le premier while car il me sert à boucler jusqu'à trouver la ligne avec la date
le second while me permet de boucler sur le fichier à partir de la ligne ou il y a la date.
Voici mes modifs :
While Not EOF(i)
'met la première ligne lue dans la variable a
Line Input #i, a
'Vérifie si la première ligne contient une date
checkdate = Left(a, 10)
If IsDate(checkdate) = True Then
CptLine = 1
While Not EOF(i)
'transforme la ligne lue en tableau
tablo = Split(a, Chr(9), 4)
lire = lire & crlf & tablo(0) & crlf & tablo(1) & crlf & tablo(2) & crlf
Line Input #i, a
'compte le nombre de lignes lues
CptLine = CptLine + 1
Wend
'transforme la dernière ligne lue en tableau
tablo = Split(a, Chr(9), 4)
lire = lire & crlf & tablo(0) & crlf & tablo(1) & crlf & tablo(2) & crlf
wend
Ce n'est qu'un extrait du code et peut-être j'ai oublié des copier-coller
Mais bon, chez mois maintenant ça marche.
Une ptiote question conne :
Dans un inputbox, si l'user clique sur annuler, l'aide m'indique que ca renvoie une chaîne de longueur nulle. Ah ! comment je fais pour le détecter ?
Merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
yo612
Messages postés16Date d'inscriptionmercredi 21 février 2007StatutMembreDernière intervention19 juillet 2007 10 mars 2007 à 15:56
Ah j'ai oublié de coller un End If après le premier wend
et puis je crois voir des ptites erreurs, j'aurais du copier tout mon code mais à partir du second while not EOF, j'ai 3 pages de codes, donc....
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 10 mars 2007 à 20:57
Personnellement, je préfère utiliser Do Until plutôt que While. Ça permet de sortir avec un Exit Do
Donc, tu dois premièrement trouver une date et ensuite lire le reste du fichier.
Tu pourrais donc faire une première boucle pour trouver la date et sortir de cette boucle lorsque trouvée. Ensuite, tu démarres une seconde boucle pour la lecture du reste du fichier.
open Fichier.... as #i
Do Until EOF(i)
'met la première ligne lue dans la variable a
Line Input #i, a
'Vérifie si la première ligne contient une date
checkdate = Left(a, 10)
If IsDate(checkdate) = True Then
CptLine = 1 ' si tu commences le compteur ici ...
Exit Do
Loop
'2e boucle
Do Until EOF(i)
Line Input #i, a
tablo = Split(a, Chr(9), 4)
'ici tu mets crlf que je ne connais pas (?) est-ce un saut de ligne ?
lire = lire & vbCrLf & tablo(0) & vbCrLf & tablo(1) & vbCrLf & tablo(2) & vbCrLf
CptLine = 1
yo612
Messages postés16Date d'inscriptionmercredi 21 février 2007StatutMembreDernière intervention19 juillet 2007 11 mars 2007 à 00:47
Merci beaucoup pour le vbnullstring.
Des fois on cherche midi à 14 heures pendant des jours alors que la solution est toute simple. Heureusement qu'il y a des forums pour l'entraide.
Pour le crlf, c'est effectivement une variable qui vaut :
crlf = Chr$(13) + Chr$(10)
Je ne connaissais pas vbcrlf et donc ca m'évitait de me retaper à chaque fois les chr (xx)
Pour ta boucle, je n'ai pas testé mais si effectivement la première s'arrète dès qu'il a trouvé une date il passe à la deuxième boucle qui elle relit une ligne, donc ma première ligne passe aux oubliettes, non ?
le exit do obéit au if.. then précédent et passe au suivant do until eof ??? c'est bien ça ?
si oui effectivement c'est mieux que le while.
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 11 mars 2007 à 03:02
Le Exit Do permet de sortir du Do...While ou Do...Until
C'est donc dire que tu boucles jusqu'à ce qu'une condition soit vérifiée. Si, à ce moment tu n'as plus besoin de continuer la boucle tu mets Exit Do pour en sortir.
La même chose peut être affectée au For...Next avec Exit For
Très utile dans bien des cas, bien qu'on puisse utiliser d'autres méthodes...
yo612
Messages postés16Date d'inscriptionmercredi 21 février 2007StatutMembreDernière intervention19 juillet 2007 11 mars 2007 à 12:15
super super sympa pour les newsbies comme moi qui démarre en prog.
Comme je fais tout à la force du poignet, pas de stage, pas de cours, juste des bouqins qui reste malgré tout très généraliste, je suis heureux de pouvoir trouver des gens comme vous qui donnent volontiers un petit coup de main aux débutants.
Merci encore.
Je reviendrais sûrement quand à nouveau je ramerai dur sur une prochaine ligne