cs_baz187rem
Messages postés78Date d'inscriptionvendredi 23 mars 2007StatutMembreDernière intervention21 juin 2010
-
29 mai 2008 à 09:01
cs_baz187rem
Messages postés78Date d'inscriptionvendredi 23 mars 2007StatutMembreDernière intervention21 juin 2010
-
30 mai 2008 à 07:53
Bonjour a tous !!
Je me retrouve aujourd'hui dans une situation un peu compliqué que je n'arrive pas a expliquer et a résoudre.
J'ai différent fichiers texte qui ont la meme structure mais pas forcément le meme nombre de ligne. Ce que je ne comprend pas c'est lorsque j'ouvre un fichier ou un autre, un va fonctionner l'autre va me renvoyer une erreur 52 "Bad file name or number".
J'ai regarder la valeur du freefile a l'ouverture et il a 1 donc un seul fichier d'ouvert et en plus il n'est pas déjà ouvert par ailleur.
Qu'arrive t il sachant qu'un autre va très bien se comporter alors qu'il y a moins de lignes dans le fichier... Quelqu'un peut m'aider ?
Je met un bout de code :
Public Sub FiltrageFichier(chemin As String)
Dim LectureLigne As String
Dim mCol As New Collection
Dim FileNumber As Integer
FileNumber = FreeFile
Dim oldCompteSlots As Integer
Dim nbpasse As Integer
Open chemin For Input As #FileNumber
oldCompteSlots = CptSlots
nbpasse = 1
While Not EOF(FileNumber)
Input #FileNumber, LectureLigne
If Mid(Trim(LectureLigne), 1, 5) = "Wafer" Then
If nbpasse = 1 Then
Input #FileNumber, LectureLigne
Input #FileNumber, LectureLigne
While InStr(1, LectureLigne, "Aver.") = 0
If LectureLigne <> "" And Mid(LectureLigne, 1, 1) <> "(" Then
If CptSlots > 24 Then
RAZFeuille "MODELS"
Close #FileNumber
MsgBox "La somme des slots des fichiers a traiter est supérieur à 25.", vbCritical, "Erreur"
End
End If
Set mCol = DecomposeLigne(LectureLigne)
With TabSlots(CptSlots)
.Num = Trim(mCol.Item(2))
.M = Trim(mCol.Item(3))
.D = Trim(mCol.Item(4))
.RR = Trim(mCol.Item(5))
.OR = Trim(mCol.Item(6))
.Tx = Trim(mCol.Item(7))
.Ty = Trim(mCol.Item(8))
End With
CptSlots = CptSlots + 1
End If
Input #FileNumber, LectureLigne
Wend
nbpasse = nbpasse + 1
ElseIf nbpasse = 2 Then
If LectureLigne <> "" And Mid(LectureLigne, 1, 1) <> "(" Then
Set mCol = DecomposeLigne(LectureLigne)
With TabSlots(oldCompteSlots)
.SX = Trim(mCol.Item(3))
.SY = Trim(mCol.Item(4))
.RW = Trim(mCol.Item(5))
.OW = Trim(mCol.Item(6))
.TX = Trim(mCol.Item(7))
.TY = Trim(mCol.Item(8))
.Enspec = CompareSpec(.TranswX, Txt_TranslationSpec)
If .Enspec = True Then
.Enspec = CompareSpec(.TranswY, Txt_TranslationSpec)
End If
End With
oldCompteSlots = oldCompteSlots + 1
End If
Input #FileNumber, LectureLigne
Wend
nbpasse = nbpasse + 1
Else
Close #FileNumber
End If
End If
Wend
Close #FileNumber
End Sub
Ps : Y'a pas une facon pour colorer le texte facon VB ca serait plus lisible pour vous ....
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 29 mai 2008 à 11:25
Salut
Sur quelle ligne as-tu cette erreur ?
Tu fais une boucle de lecture While-Wend (nota : While-Wend est obsolète, utiliser de préférence Do While-Loop).
Mais tu fais plusieurs Input à l'intérieur : pas bon :
Supposons que le premier Input après le While soit la dernière ligne du fichier, si tu en fais un autre derrière (*), il y aura erreur, mais pas celle dont tu parles.
(*) d'autant que tu peux en faire un paquet puisque du refais des Input dans une autre boucle à l'intérieur !
La suggestion de RenField est surement la solution.
Dis nous sur quelle ligne tu as l'erreur, cela va éclairer le problème.
Attention aussi :
Input ne lit qu'une variable de la ligne, pas la ligne entière. Si tu as une virgule dans la ligne, la lecture sera incomplète et pourra perturber le prochain Input
--> Voir Line Input
Tout dépend de la structure de ton fichier
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
cs_baz187rem
Messages postés78Date d'inscriptionvendredi 23 mars 2007StatutMembreDernière intervention21 juin 20101 29 mai 2008 à 18:28
Mon fichier ne comporte pas de virgule mais des points comme décimal encore une chance ^^
Sinon j'ai modifier un peu la boucle a la place du while wend je suis donc passé par le fameux do while loop. (C'est la meme chose je trouve mais bon)
En fait le debbugger me renvoie sur la ligne do while not EOF(FileNumber)
et si je survole avec la souris, le FileNumber est = 1
En ce qui concerne mes plusieurs appels de lineInput je trouve cela un peu normal car je lis la ligne entière et si je trouve pas l'item que je cherche je passe a la suivante. Par contre une fois que je l'ai trouver, je saute x ligne (correspondant aux X lignes d'appel de input ...)
ps bis : Le lien donne la source a compiler mais j'ai pas vb6 ^^
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 30 mai 2008 à 01:18
Ok
Je n'avais pas fait gaffe, mais tu as un Close #FileNumber en plein milieu de tes boucles.
Je pense que tu dois y passer, mais comme tu ne sors pas de la boucle, il continue et quand il recommence, le fichier étant fermé, il génère l'erreur.
A l'emplacement de ton Close, si tu n'as plus rien à faire dans ta boucle de lecture, remplace ton Close par un "Exit Do" à condition d'avoir utiliser Do-Loop à la place du While-Wend
(le Close est fait au sortir de la boucle)
Vala
Jack, MVP VB NB : Je ne répondrai pas aux messages privés
<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
cs_baz187rem
Messages postés78Date d'inscriptionvendredi 23 mars 2007StatutMembreDernière intervention21 juin 20101 30 mai 2008 à 07:53
ha pas bete le exit do je vais tester ca aujourd'hui...
Bon je l'ai tester en direct et super cela fonctionne !! Et en effet finalement quand j'y repense c'est bien cela... Je continue de boucler, le fichier fermer donc c'est normal qu'il n'arrive plus a parcourir le fichier qui est fermé !!
Super en tout cas merci à toi Jack pour avoir trouver la solution et a toi MPi² d'avoir essayer et Renfield aussi ^^