Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Boucle Do while not avec un test if

6 réponses
Avatar
---DGI972---
Bonjour,
Je sollicite quelqu'un pour me donner un petit coup de pouce ou un coup
de pied au c....
Voila mon Pb
Je lis un fichier BA.CTE en entrée et j'extrais des zones A , B , C,
D, E.
Je reconstitue avec mes zones une nouvelle chaine de caractère et je
l'écris dans un fichier de sortie BA.TXT.
Jusque la facile et cela fonctionne correctement, mais on m'a demandé
que si la zone B et ou C et ou D est vide (avec des espaces) de ne pas
recopier la ligne dans le fichier de sortie.
J'ai donc rajouté un test If B<>" " else if C<>" " else
if D<>" " j'écrie dans le fichier sinon je passe le tour.
Mais cela ne marche pas.

Voiçi les lignes de codes:

Option Explicit
Dim fso, objShell, A, B, C, D, E, fileIn, fileOut, Sline, StrIn
Set fso = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
Set fileIn = fso.OpenTextFile("C:\MAR\PROGRAM\BA.CTE", 1, True)
Set fileOut = fso.OpenTextFile("C:\MAR\PROGRAM\BA.TXT", 2,
True)'fichier temporaire de sortie

Do While not fileIn.AtEndOfStream

SLine = fileIn.ReadLine
A=18079 '1er block en dur
B=Mid(Sline,198,11) '3 ieme Block de donnée
C=Mid(Sline,218,5) '2 ieme Block de donnée
D=Mid(Sline,223,2) '4 ieme Block de donnée clef
E=Mid(Sline,225,12) '5 ieme Block de donnée ancien numéros

strIn = A
strIn = strIn & C
strIn = strIn & B
strIn = strIn & D
strIn = strIn & " " ' Pour mettre un espace
strIn = strIn & E
If B<>" " else if C<>" " else if D<>" " then
fileOut.WriteLine strIn

Loop

fileOut.Close
Set A = Nothing
Set B = Nothing
Set C = Nothing
Set D = Nothing
Set E = Nothing
Set fso = Nothing
Set objShell = Nothing
Set fileIn = Nothing
Set fileOut = Nothing
Set objShell =Nothing

--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net

6 réponses

Avatar
Fabrice Canel [MSFT]
Bonjour,

Il semble qu'il faille ecrire dans le fichier sie B, C, D ne valident pas
les conditions proposees.
Je suggeste donc de remplacer

strIn = A
strIn = strIn & C
strIn = strIn & B
strIn = strIn & D
strIn = strIn & " " ' Pour mettre un espace
strIn = strIn & E
If B<>" " else if C<>" " else if D<>" " then
fileOut.WriteLine strIn

par

If (B<>" ") and (C<>" ") and (D<>" ") then
strIn = A
strIn = strIn & C
strIn = strIn & B
strIn = strIn & D
strIn = strIn & " " ' Pour mettre un espace
strIn = strIn & E
fileOut.WriteLine strIn
end if

Ce qui optimisera le calcul en ne calculant strIn que si la condition est
verifiee.

Cordialement,
Fabrice Canel


"---DGI972---" <gilles.dermigny@*NOSPAM*laposte.net> wrote in message
news:
Bonjour,
Je sollicite quelqu'un pour me donner un petit coup de pouce ou un coup de
pied au c....
Voila mon Pb
Je lis un fichier BA.CTE en entrée et j'extrais des zones A , B , C, D,
E.
Je reconstitue avec mes zones une nouvelle chaine de caractère et je
l'écris dans un fichier de sortie BA.TXT.
Jusque la facile et cela fonctionne correctement, mais on m'a demandé que
si la zone B et ou C et ou D est vide (avec des espaces) de ne pas
recopier la ligne dans le fichier de sortie.
J'ai donc rajouté un test If B<>" " else if C<>" " else if
D<>" " j'écrie dans le fichier sinon je passe le tour.
Mais cela ne marche pas.

Voiçi les lignes de codes:

Option Explicit
Dim fso, objShell, A, B, C, D, E, fileIn, fileOut, Sline, StrIn
Set fso = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
Set fileIn = fso.OpenTextFile("C:MARPROGRAMBA.CTE", 1, True)
Set fileOut = fso.OpenTextFile("C:MARPROGRAMBA.TXT", 2, True)'fichier
temporaire de sortie

Do While not fileIn.AtEndOfStream

SLine = fileIn.ReadLine
A079 '1er block en dur
B=Mid(Sline,198,11) '3 ieme Block de donnée
C=Mid(Sline,218,5) '2 ieme Block de donnée
D=Mid(Sline,223,2) '4 ieme Block de donnée clef
E=Mid(Sline,225,12) '5 ieme Block de donnée ancien numéros

strIn = A
strIn = strIn & C
strIn = strIn & B
strIn = strIn & D
strIn = strIn & " " ' Pour mettre un espace
strIn = strIn & E
If B<>" " else if C<>" " else if D<>" " then
fileOut.WriteLine strIn

Loop

fileOut.Close
Set A = Nothing
Set B = Nothing
Set C = Nothing
Set D = Nothing
Set E = Nothing
Set fso = Nothing
Set objShell = Nothing
Set fileIn = Nothing
Set fileOut = Nothing
Set objShell =Nothing

--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net



Avatar
jbongran
---DGI972--- wrote:
Bonjour,
Je sollicite quelqu'un pour me donner un petit coup de pouce ou un
coup de pied au c....
Voila mon Pb
Je lis un fichier BA.CTE en entrée et j'extrais des zones A , B , C,
D, E.
Je reconstitue avec mes zones une nouvelle chaine de caractère et je
l'écris dans un fichier de sortie BA.TXT.
Jusque la facile et cela fonctionne correctement, mais on m'a demandé
que si la zone B et ou C et ou D est vide (avec des espaces) de ne pas
recopier la ligne dans le fichier de sortie.
J'ai donc rajouté un test If B<>" " else if C<>" " else
if D<>" " j'écrie dans le fichier sinon je passe le tour.
Mais cela ne marche pas.

Voiçi les lignes de codes:

Option Explicit
Dim fso, objShell, A, B, C, D, E, fileIn, fileOut, Sline, StrIn
Set fso = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
Set fileIn = fso.OpenTextFile("C:MARPROGRAMBA.CTE", 1, True)
Set fileOut = fso.OpenTextFile("C:MARPROGRAMBA.TXT", 2,
True)'fichier temporaire de sortie

Do While not fileIn.AtEndOfStream

SLine = fileIn.ReadLine
A079 '1er block en dur
B=Mid(Sline,198,11) '3 ieme Block de donnée
C=Mid(Sline,218,5) '2 ieme Block de donnée
D=Mid(Sline,223,2) '4 ieme Block de donnée clef
E=Mid(Sline,225,12) '5 ieme Block de donnée ancien numéros

strIn = A
strIn = strIn & C
strIn = strIn & B
strIn = strIn & D
strIn = strIn & " " ' Pour mettre un espace
strIn = strIn & E
If B<>" " else if C<>" " else if D<>" " then
fileOut.WriteLine strIn

Loop

fileOut.Close
Set A = Nothing
Set B = Nothing
Set C = Nothing
Set D = Nothing
Set E = Nothing
Set fso = Nothing
Set objShell = Nothing
Set fileIn = Nothing
Set fileOut = Nothing
Set objShell =Nothing


Par exemple
If Not InStr(B & C & D, " ") > 0 Then
fileOut.WriteLine strIn
End If

Ou comme ça:
A = 18079 '1er block en dur
B = Mid(Sline,198,11) '3 ieme Block de donnée
C = Mid(Sline,218,5) '2 ieme Block de donnée
D = Mid(Sline,223,2) '4 ieme Block de donnée clef
E=Trim(Mid(Sline,225,12) '5 ieme Block de donnée ancien numéros
If Len(Trim(B)) > 0 And Len(Trim(C)) > 0 And Len(Trim(D)) > 0 Then
fileOut.WriteLine strIn
End If
Ps: Les lignes "Set A= Nothing" a "Set E = Nothing" ne servent à rien

Avatar
---DGI972---
jbongran a exprimé avec précision :
---DGI972--- wrote:
Bonjour,
Je sollicite quelqu'un pour me donner un petit coup de pouce ou un
coup de pied au c....
Voila mon Pb
Je lis un fichier BA.CTE en entrée et j'extrais des zones A , B , C,
D, E.
Je reconstitue avec mes zones une nouvelle chaine de caractère et je
l'écris dans un fichier de sortie BA.TXT.
Jusque la facile et cela fonctionne correctement, mais on m'a demandé
que si la zone B et ou C et ou D est vide (avec des espaces) de ne pas
recopier la ligne dans le fichier de sortie.
J'ai donc rajouté un test If B<>" " else if C<>" " else
if D<>" " j'écrie dans le fichier sinon je passe le tour.
Mais cela ne marche pas.

Voiçi les lignes de codes:

Option Explicit
Dim fso, objShell, A, B, C, D, E, fileIn, fileOut, Sline, StrIn
Set fso = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
Set fileIn = fso.OpenTextFile("C:MARPROGRAMBA.CTE", 1, True)
Set fileOut = fso.OpenTextFile("C:MARPROGRAMBA.TXT", 2,
True)'fichier temporaire de sortie

Do While not fileIn.AtEndOfStream

SLine = fileIn.ReadLine
A079 '1er block en dur
B=Mid(Sline,198,11) '3 ieme Block de donnée
C=Mid(Sline,218,5) '2 ieme Block de donnée
D=Mid(Sline,223,2) '4 ieme Block de donnée clef
E=Mid(Sline,225,12) '5 ieme Block de donnée ancien numéros

strIn = A
strIn = strIn & C
strIn = strIn & B
strIn = strIn & D
strIn = strIn & " " ' Pour mettre un espace
strIn = strIn & E
If B<>" " else if C<>" " else if D<>" " then
fileOut.WriteLine strIn

Loop

fileOut.Close
Set A = Nothing
Set B = Nothing
Set C = Nothing
Set D = Nothing
Set E = Nothing
Set fso = Nothing
Set objShell = Nothing
Set fileIn = Nothing
Set fileOut = Nothing
Set objShell =Nothing


Par exemple
If Not InStr(B & C & D, " ") > 0 Then
fileOut.WriteLine strIn
End If

Ou comme ça:
A = 18079 '1er block en dur
B = Mid(Sline,198,11) '3 ieme Block de donnée
C = Mid(Sline,218,5) '2 ieme Block de donnée
D = Mid(Sline,223,2) '4 ieme Block de donnée clef
E=Trim(Mid(Sline,225,12) '5 ieme Block de donnée ancien numéros
If Len(Trim(B)) > 0 And Len(Trim(C)) > 0 And Len(Trim(D)) > 0 Then
fileOut.WriteLine strIn
End If
Ps: Les lignes "Set A= Nothing" a "Set E = Nothing" ne servent à rien


Merci j'essaye cela dans 2 heures,
Mais la variable B doit avoir 11 espaces la C 5 espaces et la D 2
espaces.
J'était persuadé de libérer proprement les variables en faisant SET
A=Nothing
Je vous donne le résultat tout à l'heure.
Merci

--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net


Avatar
Fred
Dans le message :,
---DGI972--- <gilles.dermigny@*NO SPAM* laposte.net> disait :
jbongran a exprimé avec précision :
---DGI972--- wrote:
Bonjour,
Je sollicite quelqu'un pour me donner un petit coup de pouce ou un
coup de pied au c....
Voila mon Pb
Je lis un fichier BA.CTE en entrée et j'extrais des zones A , B , C,
D, E.
Je reconstitue avec mes zones une nouvelle chaine de caractère et je
l'écris dans un fichier de sortie BA.TXT.
Jusque la facile et cela fonctionne correctement, mais on m'a
demandé que si la zone B et ou C et ou D est vide (avec des
espaces) de ne pas recopier la ligne dans le fichier de sortie.
J'ai donc rajouté un test If B<>" " else if C<>" "
else if D<>" " j'écrie dans le fichier sinon je passe le tour.
Mais cela ne marche pas.

Voiçi les lignes de codes:

Option Explicit
Dim fso, objShell, A, B, C, D, E, fileIn, fileOut, Sline, StrIn
Set fso = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
Set fileIn = fso.OpenTextFile("C:MARPROGRAMBA.CTE", 1, True)
Set fileOut = fso.OpenTextFile("C:MARPROGRAMBA.TXT", 2,
True)'fichier temporaire de sortie

Do While not fileIn.AtEndOfStream

SLine = fileIn.ReadLine
A079 '1er block en dur
B=Mid(Sline,198,11) '3 ieme Block de donnée
C=Mid(Sline,218,5) '2 ieme Block de donnée
D=Mid(Sline,223,2) '4 ieme Block de donnée clef
E=Mid(Sline,225,12) '5 ieme Block de donnée ancien numéros

strIn = A
strIn = strIn & C
strIn = strIn & B
strIn = strIn & D
strIn = strIn & " " ' Pour mettre un espace
strIn = strIn & E
If B<>" " else if C<>" " else if D<>" " then
fileOut.WriteLine strIn

Loop

fileOut.Close
Set A = Nothing
Set B = Nothing
Set C = Nothing
Set D = Nothing
Set E = Nothing
Set fso = Nothing
Set objShell = Nothing
Set fileIn = Nothing
Set fileOut = Nothing
Set objShell =Nothing


Par exemple
If Not InStr(B & C & D, " ") > 0 Then
fileOut.WriteLine strIn
End If

Ou comme ça:
A = 18079 '1er block en dur
B = Mid(Sline,198,11) '3 ieme Block de donnée
C = Mid(Sline,218,5) '2 ieme Block de donnée
D = Mid(Sline,223,2) '4 ieme Block de donnée clef
E=Trim(Mid(Sline,225,12) '5 ieme Block de donnée ancien numéros
If Len(Trim(B)) > 0 And Len(Trim(C)) > 0 And Len(Trim(D)) > 0 Then
fileOut.WriteLine strIn
End If
Ps: Les lignes "Set A= Nothing" a "Set E = Nothing" ne servent à rien


Merci j'essaye cela dans 2 heures,
Mais la variable B doit avoir 11 espaces la C 5 espaces et la D 2
espaces.
J'était persuadé de libérer proprement les variables en faisant SET
A=Nothing
Je vous donne le résultat tout à l'heure.
Merci


Bonjour,
L'énoncé de ton problème n'est pas très clair ("et ou" en informatique
c'est un tantinet ambigü :-))
Soit :
- lorsqu'aucune des variables n'est remplie avec des blancs, je copie la
ligne
Soit :
- lorsqu'au moins une des trois variables n'est pas remplie avec de
blancs, je copie la ligne.
Soit :
- une autre solution peut-être ??

Première hypothèse, tu peux prendre la solution de Fabrice.
Deuxième hypothèse, tu prends la solution de Fabrice avec la modif
suivante :
If (B<>" ") or (C<>" ") or (D<>" ")) then
Troisième hypothèse, tu reformules ta phrase, éventuellement en donnant
des exemples ?


--
Fred



Avatar
---DGI972---
Le 15/06/2005, Fabrice Canel [MSFT] a supposé :
Bonjour,

Il semble qu'il faille ecrire dans le fichier sie B, C, D ne valident pas les
conditions proposees.
Je suggeste donc de remplacer

strIn = A
strIn = strIn & C
strIn = strIn & B
strIn = strIn & D
strIn = strIn & " " ' Pour mettre un espace
strIn = strIn & E
If B<>" " else if C<>" " else if D<>" " then
fileOut.WriteLine strIn

par

If (B<>" ") and (C<>" ") and (D<>" ") then
strIn = A
strIn = strIn & C
strIn = strIn & B
strIn = strIn & D
strIn = strIn & " " ' Pour mettre un espace
strIn = strIn & E
fileOut.WriteLine strIn
end if

Ce qui optimisera le calcul en ne calculant strIn que si la condition est
verifiee.

Cordialement,
Fabrice Canel


"---DGI972---" <gilles.dermigny@*NOSPAM*laposte.net> wrote in message
news:
Bonjour,
Je sollicite quelqu'un pour me donner un petit coup de pouce ou un coup de
pied au c....
Voila mon Pb
Je lis un fichier BA.CTE en entrée et j'extrais des zones A , B , C, D, E.
Je reconstitue avec mes zones une nouvelle chaine de caractère et je
l'écris dans un fichier de sortie BA.TXT.
Jusque la facile et cela fonctionne correctement, mais on m'a demandé que
si la zone B et ou C et ou D est vide (avec des espaces) de ne pas recopier
la ligne dans le fichier de sortie.
J'ai donc rajouté un test If B<>" " else if C<>" " else if
D<>" " j'écrie dans le fichier sinon je passe le tour.
Mais cela ne marche pas.

Voiçi les lignes de codes:

Option Explicit
Dim fso, objShell, A, B, C, D, E, fileIn, fileOut, Sline, StrIn
Set fso = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
Set fileIn = fso.OpenTextFile("C:MARPROGRAMBA.CTE", 1, True)
Set fileOut = fso.OpenTextFile("C:MARPROGRAMBA.TXT", 2, True)'fichier
temporaire de sortie

Do While not fileIn.AtEndOfStream

SLine = fileIn.ReadLine
A079 '1er block en dur
B=Mid(Sline,198,11) '3 ieme Block de donnée
C=Mid(Sline,218,5) '2 ieme Block de donnée
D=Mid(Sline,223,2) '4 ieme Block de donnée clef
E=Mid(Sline,225,12) '5 ieme Block de donnée ancien numéros

strIn = A
strIn = strIn & C
strIn = strIn & B
strIn = strIn & D
strIn = strIn & " " ' Pour mettre un espace
strIn = strIn & E
If B<>" " else if C<>" " else if D<>" " then
fileOut.WriteLine strIn

Loop

fileOut.Close
Set A = Nothing
Set B = Nothing
Set C = Nothing
Set D = Nothing
Set E = Nothing
Set fso = Nothing
Set objShell = Nothing
Set fileIn = Nothing
Set fileOut = Nothing
Set objShell =Nothing

-- Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net




Cela fonctionne correctement, merci.
Je me suis embrouillé dans les if et mes boucles.La structure est
tellement claire et simple.
Encore merci.

Pouvez vous me confirmer qu'il n'est pas nécéssaire de libérer les
variables avec SET X = Nothing ?

--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net


Avatar
---DGI972---
Fred vient de nous annoncer :
Dans le message :,
---DGI972--- <gilles.dermigny@*NO SPAM* laposte.net> disait :
jbongran a exprimé avec précision :
---DGI972--- wrote:
Bonjour,
Je sollicite quelqu'un pour me donner un petit coup de pouce ou un
coup de pied au c....
Voila mon Pb
Je lis un fichier BA.CTE en entrée et j'extrais des zones A , B , C,
D, E.
Je reconstitue avec mes zones une nouvelle chaine de caractère et je
l'écris dans un fichier de sortie BA.TXT.
Jusque la facile et cela fonctionne correctement, mais on m'a
demandé que si la zone B et ou C et ou D est vide (avec des
espaces) de ne pas recopier la ligne dans le fichier de sortie.
J'ai donc rajouté un test If B<>" " else if C<>" "
else if D<>" " j'écrie dans le fichier sinon je passe le tour.
Mais cela ne marche pas.

Voiçi les lignes de codes:

Option Explicit
Dim fso, objShell, A, B, C, D, E, fileIn, fileOut, Sline, StrIn
Set fso = CreateObject("Scripting.FileSystemObject")
Set objShell = CreateObject("WScript.Shell")
Set fileIn = fso.OpenTextFile("C:MARPROGRAMBA.CTE", 1, True)
Set fileOut = fso.OpenTextFile("C:MARPROGRAMBA.TXT", 2,
True)'fichier temporaire de sortie

Do While not fileIn.AtEndOfStream

SLine = fileIn.ReadLine
A079 '1er block en dur
B=Mid(Sline,198,11) '3 ieme Block de donnée
C=Mid(Sline,218,5) '2 ieme Block de donnée
D=Mid(Sline,223,2) '4 ieme Block de donnée clef
E=Mid(Sline,225,12) '5 ieme Block de donnée ancien numéros

strIn = A
strIn = strIn & C
strIn = strIn & B
strIn = strIn & D
strIn = strIn & " " ' Pour mettre un espace
strIn = strIn & E
If B<>" " else if C<>" " else if D<>" " then
fileOut.WriteLine strIn

Loop

fileOut.Close
Set A = Nothing
Set B = Nothing
Set C = Nothing
Set D = Nothing
Set E = Nothing
Set fso = Nothing
Set objShell = Nothing
Set fileIn = Nothing
Set fileOut = Nothing
Set objShell =Nothing


Par exemple
If Not InStr(B & C & D, " ") > 0 Then
fileOut.WriteLine strIn
End If

Ou comme ça:
A = 18079 '1er block en dur
B = Mid(Sline,198,11) '3 ieme Block de donnée
C = Mid(Sline,218,5) '2 ieme Block de donnée
D = Mid(Sline,223,2) '4 ieme Block de donnée clef
E=Trim(Mid(Sline,225,12) '5 ieme Block de donnée ancien numéros
If Len(Trim(B)) > 0 And Len(Trim(C)) > 0 And Len(Trim(D)) > 0 Then
fileOut.WriteLine strIn
End If
Ps: Les lignes "Set A= Nothing" a "Set E = Nothing" ne servent à rien


Merci j'essaye cela dans 2 heures,
Mais la variable B doit avoir 11 espaces la C 5 espaces et la D 2
espaces.
J'était persuadé de libérer proprement les variables en faisant SET
A=Nothing
Je vous donne le résultat tout à l'heure.
Merci


Bonjour,
L'énoncé de ton problème n'est pas très clair ("et ou" en informatique c'est
un tantinet ambigü :-))
Soit :
- lorsqu'aucune des variables n'est remplie avec des blancs, je copie la
ligne
Soit :
- lorsqu'au moins une des trois variables n'est pas remplie avec de blancs,
je copie la ligne.
Soit :
- une autre solution peut-être ??

Première hypothèse, tu peux prendre la solution de Fabrice.
Deuxième hypothèse, tu prends la solution de Fabrice avec la modif suivante :
If (B<>" ") or (C<>" ") or (D<>" ")) then
Troisième hypothèse, tu reformules ta phrase, éventuellement en donnant des
exemples ?


Il faut bien remplir une des 3 conditions ou les trois à la fois.
La variable B ne doit contenir 11 espaces vide la C 5 espaces vides et
la D 2 espaces vides.
Mais effectivement j'ai utilisé la solution de Fabrice
Merci encore pour les réponses contructives.

--
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net