Bonjour a tous,
je recherche l'equivalent de EOF pour une ligne.
J'ai vu un jour EOB (pour end of block) mais je ne sais plus si c'est en VB
ou delphi ou autre.
mon probleme est de tester tous les caracteres d'une ligne jusqu a la fin,
mais en cours de traitement je modifie cette ligne:
numficin2 = FreeFile
Open ficin2 For Input As #numficin2
Do While Not EOF(numficin2) ' Vérifie si la fin du fichier est atteinte.
Line Input #numficin2, ligneencours ' Lit une ligne de données.
For i = 1 To Len(ligneencours) 'teste tous les caracteres de la
ligne
'traitement qui modifie le nombre de caractere de la ligne
Next i
Loop
peut etre en cas de modif sur la ligne mettre un goto vers le For ?
numficin2 = FreeFile
Open ficin2 For Input As #numficin2
Do While Not EOF(numficin2) ' Vérifie si la fin du fichier est atteinte.
Line Input #numficin2, ligneencours ' Lit une ligne de données.
lignemodif:
For i = 1 To Len(ligneencours) 'teste tous les caracteres de la
ligne
If macondition = True Then
'je modifie
GoTo lignemodif
Else
'je touche a rien je continue
End If
Next i
Loop
Des suggestions?
Si quelqu'un peux m'aider merci d'avance.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Jean-Marc
"h.Bezard" a écrit dans le message de news:3fdb550d$0$6972$
Bonjour a tous, je recherche l'equivalent de EOF pour une ligne. J'ai vu un jour EOB (pour end of block) mais je ne sais plus si c'est en
VB
ou delphi ou autre. mon probleme est de tester tous les caracteres d'une ligne jusqu a la fin, mais en cours de traitement je modifie cette ligne:
numficin2 = FreeFile Open ficin2 For Input As #numficin2 Do While Not EOF(numficin2) ' Vérifie si la fin du fichier est atteinte. Line Input #numficin2, ligneencours ' Lit une ligne de données. For i = 1 To Len(ligneencours) 'teste tous les caracteres de la ligne 'traitement qui modifie le nombre de caractere de la ligne Next i Loop
peut etre en cas de modif sur la ligne mettre un goto vers le For ?
numficin2 = FreeFile Open ficin2 For Input As #numficin2 Do While Not EOF(numficin2) ' Vérifie si la fin du fichier est atteinte. Line Input #numficin2, ligneencours ' Lit une ligne de données. lignemodif: For i = 1 To Len(ligneencours) 'teste tous les caracteres de la ligne If macondition = True Then 'je modifie GoTo lignemodif Else 'je touche a rien je continue End If Next i Loop
Des suggestions? Si quelqu'un peux m'aider merci d'avance.
Bonjour, l'instruction appropriée ici est : Exit For C'est en gros ce que tu voulais faire avec ton goto, en plus joli.
Jean-Marc
Voyageur
"h.Bezard" <hbezard--retirer-moi--@club-internet.fr> a écrit dans le message
de news:3fdb550d$0$6972$7a628cd7@news.club-internet.fr...
Bonjour a tous,
je recherche l'equivalent de EOF pour une ligne.
J'ai vu un jour EOB (pour end of block) mais je ne sais plus si c'est en
VB
ou delphi ou autre.
mon probleme est de tester tous les caracteres d'une ligne jusqu a la fin,
mais en cours de traitement je modifie cette ligne:
numficin2 = FreeFile
Open ficin2 For Input As #numficin2
Do While Not EOF(numficin2) ' Vérifie si la fin du fichier est atteinte.
Line Input #numficin2, ligneencours ' Lit une ligne de données.
For i = 1 To Len(ligneencours) 'teste tous les caracteres de la
ligne
'traitement qui modifie le nombre de caractere de la ligne
Next i
Loop
peut etre en cas de modif sur la ligne mettre un goto vers le For ?
numficin2 = FreeFile
Open ficin2 For Input As #numficin2
Do While Not EOF(numficin2) ' Vérifie si la fin du fichier est atteinte.
Line Input #numficin2, ligneencours ' Lit une ligne de données.
lignemodif:
For i = 1 To Len(ligneencours) 'teste tous les caracteres de la
ligne
If macondition = True Then
'je modifie
GoTo lignemodif
Else
'je touche a rien je continue
End If
Next i
Loop
Des suggestions?
Si quelqu'un peux m'aider merci d'avance.
Bonjour,
l'instruction appropriée ici est : Exit For
C'est en gros ce que tu voulais faire avec ton goto, en plus joli.
"h.Bezard" a écrit dans le message de news:3fdb550d$0$6972$
Bonjour a tous, je recherche l'equivalent de EOF pour une ligne. J'ai vu un jour EOB (pour end of block) mais je ne sais plus si c'est en
VB
ou delphi ou autre. mon probleme est de tester tous les caracteres d'une ligne jusqu a la fin, mais en cours de traitement je modifie cette ligne:
numficin2 = FreeFile Open ficin2 For Input As #numficin2 Do While Not EOF(numficin2) ' Vérifie si la fin du fichier est atteinte. Line Input #numficin2, ligneencours ' Lit une ligne de données. For i = 1 To Len(ligneencours) 'teste tous les caracteres de la ligne 'traitement qui modifie le nombre de caractere de la ligne Next i Loop
peut etre en cas de modif sur la ligne mettre un goto vers le For ?
numficin2 = FreeFile Open ficin2 For Input As #numficin2 Do While Not EOF(numficin2) ' Vérifie si la fin du fichier est atteinte. Line Input #numficin2, ligneencours ' Lit une ligne de données. lignemodif: For i = 1 To Len(ligneencours) 'teste tous les caracteres de la ligne If macondition = True Then 'je modifie GoTo lignemodif Else 'je touche a rien je continue End If Next i Loop
Des suggestions? Si quelqu'un peux m'aider merci d'avance.
Bonjour, l'instruction appropriée ici est : Exit For C'est en gros ce que tu voulais faire avec ton goto, en plus joli.
Jean-Marc
Voyageur
h.Bezard
Euh je ne crois pas car le "Exit For" va me faire resortir en fin de boucle or je veux rerentrer dans la boucle For en prenant compte de la nouvelle longueur de la ligne.
Je me trompe?
A+Voyageur
"Jean-Marc" a écrit dans le message de news: 3fdb57b2$0$27211$
"h.Bezard" a écrit dans le
message
de news:3fdb550d$0$6972$
> numficin2 = FreeFile > Open ficin2 For Input As #numficin2 > Do While Not EOF(numficin2) ' Vérifie si la fin du fichier est
atteinte.
> Line Input #numficin2, ligneencours ' Lit une ligne de données. > lignemodif: > For i = 1 To Len(ligneencours) 'teste tous les caracteres de la > ligne > If macondition = True Then > 'je modifie > GoTo lignemodif > Else > 'je touche a rien je continue > End If > Next i > Loop > > Des suggestions? > Si quelqu'un peux m'aider merci d'avance.
Bonjour, l'instruction appropriée ici est : Exit For C'est en gros ce que tu voulais faire avec ton goto, en plus joli.
Jean-Marc
> Voyageur > > >
Euh je ne crois pas car le "Exit For" va me faire resortir en fin de boucle
or je veux rerentrer dans la boucle For en prenant compte de la nouvelle
longueur de la ligne.
Je me trompe?
A+Voyageur
"Jean-Marc" <nospamjean_marc_n2@yahoo.fr> a écrit dans le message de news:
3fdb57b2$0$27211$ba620e4c@reader0.news.skynet.be...
"h.Bezard" <hbezard--retirer-moi--@club-internet.fr> a écrit dans le
message
de news:3fdb550d$0$6972$7a628cd7@news.club-internet.fr...
> numficin2 = FreeFile
> Open ficin2 For Input As #numficin2
> Do While Not EOF(numficin2) ' Vérifie si la fin du fichier est
atteinte.
> Line Input #numficin2, ligneencours ' Lit une ligne de données.
> lignemodif:
> For i = 1 To Len(ligneencours) 'teste tous les caracteres de la
> ligne
> If macondition = True Then
> 'je modifie
> GoTo lignemodif
> Else
> 'je touche a rien je continue
> End If
> Next i
> Loop
>
> Des suggestions?
> Si quelqu'un peux m'aider merci d'avance.
Bonjour,
l'instruction appropriée ici est : Exit For
C'est en gros ce que tu voulais faire avec ton goto, en plus joli.
Euh je ne crois pas car le "Exit For" va me faire resortir en fin de boucle or je veux rerentrer dans la boucle For en prenant compte de la nouvelle longueur de la ligne.
Je me trompe?
A+Voyageur
"Jean-Marc" a écrit dans le message de news: 3fdb57b2$0$27211$
"h.Bezard" a écrit dans le
message
de news:3fdb550d$0$6972$
> numficin2 = FreeFile > Open ficin2 For Input As #numficin2 > Do While Not EOF(numficin2) ' Vérifie si la fin du fichier est
atteinte.
> Line Input #numficin2, ligneencours ' Lit une ligne de données. > lignemodif: > For i = 1 To Len(ligneencours) 'teste tous les caracteres de la > ligne > If macondition = True Then > 'je modifie > GoTo lignemodif > Else > 'je touche a rien je continue > End If > Next i > Loop > > Des suggestions? > Si quelqu'un peux m'aider merci d'avance.
Bonjour, l'instruction appropriée ici est : Exit For C'est en gros ce que tu voulais faire avec ton goto, en plus joli.
Jean-Marc
> Voyageur > > >
Jean-Marc
"h.Bezard" a écrit dans le message de news:3fdb7270$0$6982$
Euh je ne crois pas car le "Exit For" va me faire resortir en fin de
boucle
or je veux rerentrer dans la boucle For en prenant compte de la nouvelle longueur de la ligne.
Je me trompe?
A+Voyageur
Hello, je n'avais pas compris ce que tu voulais. Tu souhaites donc parcourir une chaine, la modifier en fonction de ceci ou cela, et continuer jusqu'à ce que tu sois sur d'avoir fait toutes les modifs à faire ou que la fin de chaine soit atteinte.
Tu peux utiliser une construction comme ceci: au lieu d'une boucle de i à len(chaine), tu parcours ta chaine dans un while. Tu dois gérer manuelement ton indice courant (le i de ta boucle devient ici pCur) et tu dois gérer aussi la condition de sortie de ta boucle (inProgress) Comme cette condition dépend sans doute entre autre de la longueur, tu dois recalculer la longueur apres avoir modifié ta chaine.
Evidemmment, sans savoir ce que tu veux faire, ce n'est peut être (surement) pas la solution la plus simple mais en tout cas c'est un moyen classique de faire ce genre de choses.
Remarque: En général, sauf contraintes très particulières, on ne fait pas de modification "en place". On travaille dans une variable temporaire et on réassigne à la fin.
Ci joint un petit exemple (il faut une form et un command Button) qui illustre la méthode.
Bonne prog, Jean-Marc ---------------------------------------------------------------------------- --- ' ' Ce programme est un exemple pour ce cas particulier ' c'est un MAUVAIS exemple, très inefficace. On peut faire tout ' ça en une ligne (REPLACE) avec les instructions de VB6 mais c'est dans un ' but d'exemple uniquement !!!! ' Option Explicit
Private Sub Command1_Click() Dim chaine As String
chaine = "WLE PEWTIWT OIWSEAU SWUWR LAW BRWANCHEWWW" chaine = TraiteChaine(chaine) MsgBox chaine End Sub
' Supprime les W dans la chaine, 1 par 1, par parcours de toute la chaine ' Cette fonction n'utilise VOLONTAIREMENT pas Replace ou Instr ' ou Mid en statement; la modification se fait en place. ' Private Function TraiteChaine(chaine As String) As String Dim pCur As Long Dim instLength As Long Dim inProgress As Boolean
inProgress = True instLength = Len(chaine) pCur = 1 While inProgress If Mid$(chaine, pCur, 1) = "W" Then If pCur = 1 Then If instLength > 1 Then chaine = Mid$(chaine, 2) Else chaine = "" pCur = 0 End If Else If pCur = instLength Then chaine = Mid$(chaine, 1, pCur - 1) pCur = 0 Else chaine = Mid$(chaine, 1, pCur - 1) & Mid$(chaine, pCur + 1) pCur = pCur End If End If instLength = Len(chaine) Else pCur = pCur + 1 End If If pCur = 0 Or pCur > instLength Then inProgress = False End If Wend TraiteChaine = chaine End Function
"h.Bezard" <hbezard--retirer-moi--@club-internet.fr> a écrit dans le message
de news:3fdb7270$0$6982$7a628cd7@news.club-internet.fr...
Euh je ne crois pas car le "Exit For" va me faire resortir en fin de
boucle
or je veux rerentrer dans la boucle For en prenant compte de la nouvelle
longueur de la ligne.
Je me trompe?
A+Voyageur
Hello,
je n'avais pas compris ce que tu voulais. Tu souhaites donc parcourir une
chaine,
la modifier en fonction de ceci ou cela, et continuer jusqu'à ce que tu sois
sur d'avoir fait toutes les modifs à faire ou que la fin de chaine soit
atteinte.
Tu peux utiliser une construction comme ceci:
au lieu d'une boucle de i à len(chaine), tu parcours ta chaine dans un
while.
Tu dois gérer manuelement ton indice courant (le i de ta boucle devient ici
pCur)
et tu dois gérer aussi la condition de sortie de ta boucle (inProgress)
Comme cette condition dépend sans doute entre autre de la longueur, tu dois
recalculer
la longueur apres avoir modifié ta chaine.
Evidemmment, sans savoir ce que tu veux faire, ce n'est peut être (surement)
pas la
solution la plus simple mais en tout cas c'est un moyen classique de faire
ce genre de choses.
Remarque: En général, sauf contraintes très particulières, on ne fait
pas de modification "en place". On travaille dans une variable temporaire et
on
réassigne à la fin.
Ci joint un petit exemple (il faut une form et un command Button) qui
illustre la méthode.
Bonne prog,
Jean-Marc
----------------------------------------------------------------------------
---
'
' Ce programme est un exemple pour ce cas particulier
' c'est un MAUVAIS exemple, très inefficace. On peut faire tout
' ça en une ligne (REPLACE) avec les instructions de VB6 mais c'est dans un
' but d'exemple uniquement !!!!
'
Option Explicit
Private Sub Command1_Click()
Dim chaine As String
chaine = "WLE PEWTIWT OIWSEAU SWUWR LAW BRWANCHEWWW"
chaine = TraiteChaine(chaine)
MsgBox chaine
End Sub
' Supprime les W dans la chaine, 1 par 1, par parcours de toute la chaine
' Cette fonction n'utilise VOLONTAIREMENT pas Replace ou Instr
' ou Mid en statement; la modification se fait en place.
'
Private Function TraiteChaine(chaine As String) As String
Dim pCur As Long
Dim instLength As Long
Dim inProgress As Boolean
inProgress = True
instLength = Len(chaine)
pCur = 1
While inProgress
If Mid$(chaine, pCur, 1) = "W" Then
If pCur = 1 Then
If instLength > 1 Then
chaine = Mid$(chaine, 2)
Else
chaine = ""
pCur = 0
End If
Else
If pCur = instLength Then
chaine = Mid$(chaine, 1, pCur - 1)
pCur = 0
Else
chaine = Mid$(chaine, 1, pCur - 1) & Mid$(chaine, pCur +
1)
pCur = pCur
End If
End If
instLength = Len(chaine)
Else
pCur = pCur + 1
End If
If pCur = 0 Or pCur > instLength Then
inProgress = False
End If
Wend
TraiteChaine = chaine
End Function
"h.Bezard" a écrit dans le message de news:3fdb7270$0$6982$
Euh je ne crois pas car le "Exit For" va me faire resortir en fin de
boucle
or je veux rerentrer dans la boucle For en prenant compte de la nouvelle longueur de la ligne.
Je me trompe?
A+Voyageur
Hello, je n'avais pas compris ce que tu voulais. Tu souhaites donc parcourir une chaine, la modifier en fonction de ceci ou cela, et continuer jusqu'à ce que tu sois sur d'avoir fait toutes les modifs à faire ou que la fin de chaine soit atteinte.
Tu peux utiliser une construction comme ceci: au lieu d'une boucle de i à len(chaine), tu parcours ta chaine dans un while. Tu dois gérer manuelement ton indice courant (le i de ta boucle devient ici pCur) et tu dois gérer aussi la condition de sortie de ta boucle (inProgress) Comme cette condition dépend sans doute entre autre de la longueur, tu dois recalculer la longueur apres avoir modifié ta chaine.
Evidemmment, sans savoir ce que tu veux faire, ce n'est peut être (surement) pas la solution la plus simple mais en tout cas c'est un moyen classique de faire ce genre de choses.
Remarque: En général, sauf contraintes très particulières, on ne fait pas de modification "en place". On travaille dans une variable temporaire et on réassigne à la fin.
Ci joint un petit exemple (il faut une form et un command Button) qui illustre la méthode.
Bonne prog, Jean-Marc ---------------------------------------------------------------------------- --- ' ' Ce programme est un exemple pour ce cas particulier ' c'est un MAUVAIS exemple, très inefficace. On peut faire tout ' ça en une ligne (REPLACE) avec les instructions de VB6 mais c'est dans un ' but d'exemple uniquement !!!! ' Option Explicit
Private Sub Command1_Click() Dim chaine As String
chaine = "WLE PEWTIWT OIWSEAU SWUWR LAW BRWANCHEWWW" chaine = TraiteChaine(chaine) MsgBox chaine End Sub
' Supprime les W dans la chaine, 1 par 1, par parcours de toute la chaine ' Cette fonction n'utilise VOLONTAIREMENT pas Replace ou Instr ' ou Mid en statement; la modification se fait en place. ' Private Function TraiteChaine(chaine As String) As String Dim pCur As Long Dim instLength As Long Dim inProgress As Boolean
inProgress = True instLength = Len(chaine) pCur = 1 While inProgress If Mid$(chaine, pCur, 1) = "W" Then If pCur = 1 Then If instLength > 1 Then chaine = Mid$(chaine, 2) Else chaine = "" pCur = 0 End If Else If pCur = instLength Then chaine = Mid$(chaine, 1, pCur - 1) pCur = 0 Else chaine = Mid$(chaine, 1, pCur - 1) & Mid$(chaine, pCur + 1) pCur = pCur End If End If instLength = Len(chaine) Else pCur = pCur + 1 End If If pCur = 0 Or pCur > instLength Then inProgress = False End If Wend TraiteChaine = chaine End Function
h.Bezard
Salut, j'ai perseveré en attendant une reponse, et le Goto qui me renvoie avant la boucle for a l air de marcher :
F = 1 repasseligne: For I = F To Len(Ligneencours) 'teste tous les caracteres de la ligne 'je teste mes conditions if MESCONDITIONS Then 'je modifie ma ligne F = Debutmodif 'pour ne pas refaire ce qui est deja fais GoTo repasseligne End If Next I il faut encore que je le verifie. mais ta maniere de faire me parait plus saine que les goto,mais elle me ferai aussi modifier mon code en profondeur. Donc merci beaucoup pour cette reponse rapide, que je mettrai en ouevre sur mes prochain code.
A+ Voyageur
"Jean-Marc" a écrit dans le message de news: 3fdc2de2$0$2865$
"h.Bezard" a écrit dans le
message
de news:3fdb7270$0$6982$ > Euh je ne crois pas car le "Exit For" va me faire resortir en fin de boucle > or je veux rerentrer dans la boucle For en prenant compte de la nouvelle > longueur de la ligne. > > Je me trompe? > > A+Voyageur
Hello, je n'avais pas compris ce que tu voulais. Tu souhaites donc parcourir une chaine, la modifier en fonction de ceci ou cela, et continuer jusqu'à ce que tu
sois
sur d'avoir fait toutes les modifs à faire ou que la fin de chaine soit atteinte.
Tu peux utiliser une construction comme ceci: au lieu d'une boucle de i à len(chaine), tu parcours ta chaine dans un while. Tu dois gérer manuelement ton indice courant (le i de ta boucle devient
ici
pCur) et tu dois gérer aussi la condition de sortie de ta boucle (inProgress) Comme cette condition dépend sans doute entre autre de la longueur, tu
dois
recalculer la longueur apres avoir modifié ta chaine.
Evidemmment, sans savoir ce que tu veux faire, ce n'est peut être
(surement)
pas la solution la plus simple mais en tout cas c'est un moyen classique de faire ce genre de choses.
Remarque: En général, sauf contraintes très particulières, on ne fait pas de modification "en place". On travaille dans une variable temporaire
et
on réassigne à la fin.
Ci joint un petit exemple (il faut une form et un command Button) qui illustre la méthode.
--- ' ' Ce programme est un exemple pour ce cas particulier ' c'est un MAUVAIS exemple, très inefficace. On peut faire tout ' ça en une ligne (REPLACE) avec les instructions de VB6 mais c'est dans
un
' but d'exemple uniquement !!!! ' Option Explicit
Private Sub Command1_Click() Dim chaine As String
chaine = "WLE PEWTIWT OIWSEAU SWUWR LAW BRWANCHEWWW" chaine = TraiteChaine(chaine) MsgBox chaine End Sub
' Supprime les W dans la chaine, 1 par 1, par parcours de toute la chaine ' Cette fonction n'utilise VOLONTAIREMENT pas Replace ou Instr ' ou Mid en statement; la modification se fait en place. ' Private Function TraiteChaine(chaine As String) As String Dim pCur As Long Dim instLength As Long Dim inProgress As Boolean
inProgress = True instLength = Len(chaine) pCur = 1 While inProgress If Mid$(chaine, pCur, 1) = "W" Then If pCur = 1 Then If instLength > 1 Then chaine = Mid$(chaine, 2) Else chaine = "" pCur = 0 End If Else If pCur = instLength Then chaine = Mid$(chaine, 1, pCur - 1) pCur = 0 Else chaine = Mid$(chaine, 1, pCur - 1) & Mid$(chaine, pCur
+
1) pCur = pCur End If End If instLength = Len(chaine) Else pCur = pCur + 1 End If If pCur = 0 Or pCur > instLength Then inProgress = False End If Wend TraiteChaine = chaine End Function
Salut,
j'ai perseveré en attendant une reponse, et le Goto qui me renvoie avant la
boucle for a l air de marcher :
F = 1
repasseligne:
For I = F To Len(Ligneencours) 'teste tous les caracteres de la
ligne
'je teste mes conditions
if MESCONDITIONS Then
'je modifie ma ligne
F = Debutmodif 'pour ne pas refaire ce qui est deja fais
GoTo repasseligne
End If
Next I
il faut encore que je le verifie.
mais ta maniere de faire me parait plus saine que les goto,mais elle me
ferai aussi modifier mon code en profondeur.
Donc merci beaucoup pour cette reponse rapide, que je mettrai en ouevre sur
mes prochain code.
A+ Voyageur
"Jean-Marc" <nospamjean_marc_n2@yahoo.fr> a écrit dans le message de news:
3fdc2de2$0$2865$ba620e4c@reader1.news.skynet.be...
"h.Bezard" <hbezard--retirer-moi--@club-internet.fr> a écrit dans le
message
de news:3fdb7270$0$6982$7a628cd7@news.club-internet.fr...
> Euh je ne crois pas car le "Exit For" va me faire resortir en fin de
boucle
> or je veux rerentrer dans la boucle For en prenant compte de la nouvelle
> longueur de la ligne.
>
> Je me trompe?
>
> A+Voyageur
Hello,
je n'avais pas compris ce que tu voulais. Tu souhaites donc parcourir une
chaine,
la modifier en fonction de ceci ou cela, et continuer jusqu'à ce que tu
sois
sur d'avoir fait toutes les modifs à faire ou que la fin de chaine soit
atteinte.
Tu peux utiliser une construction comme ceci:
au lieu d'une boucle de i à len(chaine), tu parcours ta chaine dans un
while.
Tu dois gérer manuelement ton indice courant (le i de ta boucle devient
ici
pCur)
et tu dois gérer aussi la condition de sortie de ta boucle (inProgress)
Comme cette condition dépend sans doute entre autre de la longueur, tu
dois
recalculer
la longueur apres avoir modifié ta chaine.
Evidemmment, sans savoir ce que tu veux faire, ce n'est peut être
(surement)
pas la
solution la plus simple mais en tout cas c'est un moyen classique de faire
ce genre de choses.
Remarque: En général, sauf contraintes très particulières, on ne fait
pas de modification "en place". On travaille dans une variable temporaire
et
on
réassigne à la fin.
Ci joint un petit exemple (il faut une form et un command Button) qui
illustre la méthode.
---
'
' Ce programme est un exemple pour ce cas particulier
' c'est un MAUVAIS exemple, très inefficace. On peut faire tout
' ça en une ligne (REPLACE) avec les instructions de VB6 mais c'est dans
un
' but d'exemple uniquement !!!!
'
Option Explicit
Private Sub Command1_Click()
Dim chaine As String
chaine = "WLE PEWTIWT OIWSEAU SWUWR LAW BRWANCHEWWW"
chaine = TraiteChaine(chaine)
MsgBox chaine
End Sub
' Supprime les W dans la chaine, 1 par 1, par parcours de toute la chaine
' Cette fonction n'utilise VOLONTAIREMENT pas Replace ou Instr
' ou Mid en statement; la modification se fait en place.
'
Private Function TraiteChaine(chaine As String) As String
Dim pCur As Long
Dim instLength As Long
Dim inProgress As Boolean
inProgress = True
instLength = Len(chaine)
pCur = 1
While inProgress
If Mid$(chaine, pCur, 1) = "W" Then
If pCur = 1 Then
If instLength > 1 Then
chaine = Mid$(chaine, 2)
Else
chaine = ""
pCur = 0
End If
Else
If pCur = instLength Then
chaine = Mid$(chaine, 1, pCur - 1)
pCur = 0
Else
chaine = Mid$(chaine, 1, pCur - 1) & Mid$(chaine, pCur
+
1)
pCur = pCur
End If
End If
instLength = Len(chaine)
Else
pCur = pCur + 1
End If
If pCur = 0 Or pCur > instLength Then
inProgress = False
End If
Wend
TraiteChaine = chaine
End Function
Salut, j'ai perseveré en attendant une reponse, et le Goto qui me renvoie avant la boucle for a l air de marcher :
F = 1 repasseligne: For I = F To Len(Ligneencours) 'teste tous les caracteres de la ligne 'je teste mes conditions if MESCONDITIONS Then 'je modifie ma ligne F = Debutmodif 'pour ne pas refaire ce qui est deja fais GoTo repasseligne End If Next I il faut encore que je le verifie. mais ta maniere de faire me parait plus saine que les goto,mais elle me ferai aussi modifier mon code en profondeur. Donc merci beaucoup pour cette reponse rapide, que je mettrai en ouevre sur mes prochain code.
A+ Voyageur
"Jean-Marc" a écrit dans le message de news: 3fdc2de2$0$2865$
"h.Bezard" a écrit dans le
message
de news:3fdb7270$0$6982$ > Euh je ne crois pas car le "Exit For" va me faire resortir en fin de boucle > or je veux rerentrer dans la boucle For en prenant compte de la nouvelle > longueur de la ligne. > > Je me trompe? > > A+Voyageur
Hello, je n'avais pas compris ce que tu voulais. Tu souhaites donc parcourir une chaine, la modifier en fonction de ceci ou cela, et continuer jusqu'à ce que tu
sois
sur d'avoir fait toutes les modifs à faire ou que la fin de chaine soit atteinte.
Tu peux utiliser une construction comme ceci: au lieu d'une boucle de i à len(chaine), tu parcours ta chaine dans un while. Tu dois gérer manuelement ton indice courant (le i de ta boucle devient
ici
pCur) et tu dois gérer aussi la condition de sortie de ta boucle (inProgress) Comme cette condition dépend sans doute entre autre de la longueur, tu
dois
recalculer la longueur apres avoir modifié ta chaine.
Evidemmment, sans savoir ce que tu veux faire, ce n'est peut être
(surement)
pas la solution la plus simple mais en tout cas c'est un moyen classique de faire ce genre de choses.
Remarque: En général, sauf contraintes très particulières, on ne fait pas de modification "en place". On travaille dans une variable temporaire
et
on réassigne à la fin.
Ci joint un petit exemple (il faut une form et un command Button) qui illustre la méthode.
--- ' ' Ce programme est un exemple pour ce cas particulier ' c'est un MAUVAIS exemple, très inefficace. On peut faire tout ' ça en une ligne (REPLACE) avec les instructions de VB6 mais c'est dans
un
' but d'exemple uniquement !!!! ' Option Explicit
Private Sub Command1_Click() Dim chaine As String
chaine = "WLE PEWTIWT OIWSEAU SWUWR LAW BRWANCHEWWW" chaine = TraiteChaine(chaine) MsgBox chaine End Sub
' Supprime les W dans la chaine, 1 par 1, par parcours de toute la chaine ' Cette fonction n'utilise VOLONTAIREMENT pas Replace ou Instr ' ou Mid en statement; la modification se fait en place. ' Private Function TraiteChaine(chaine As String) As String Dim pCur As Long Dim instLength As Long Dim inProgress As Boolean
inProgress = True instLength = Len(chaine) pCur = 1 While inProgress If Mid$(chaine, pCur, 1) = "W" Then If pCur = 1 Then If instLength > 1 Then chaine = Mid$(chaine, 2) Else chaine = "" pCur = 0 End If Else If pCur = instLength Then chaine = Mid$(chaine, 1, pCur - 1) pCur = 0 Else chaine = Mid$(chaine, 1, pCur - 1) & Mid$(chaine, pCur
+
1) pCur = pCur End If End If instLength = Len(chaine) Else pCur = pCur + 1 End If If pCur = 0 Or pCur > instLength Then inProgress = False End If Wend TraiteChaine = chaine End Function