Boucle Do While/Loop dans boucle For Next

Résolu
cs_ATitus Messages postés 32 Date d'inscription samedi 8 mai 2004 Statut Membre Dernière intervention 9 février 2010 - 7 déc. 2006 à 12:18
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 - 11 déc. 2006 à 23:46
Bonjour.

Voila j'ai une boucle de lecture d'un fichier texte, qui me permet de trouver le nombre d'occurences d'une valeur
= = =
Cherche ValeurX

Do
While
Not
EOF
(1)
( Nombre de ValeurX  Trouvés =)
Loop

La aucun probleme cela marche pour la recherche de ValeurX.
= = =
Cela  devient delicat dans une boucle for next permettant de faire varier la variableValeurX

for ValeurX = 1 to 100
 
  Do
While
Not
EOF
(1)
   ( Nombre de ValeurX  Trouvés = )
   Loop

NextValeurX
---

Dans ce cas la, le nombre d'occurence trouvés quelque soit ValeurX de 1 à 100 reste identique.
Comment faire pour repartir en debut de boucle Do/Loop à chaque Boucle For/next

Merci de toute astuce

@ +












 






ATitus_[8D]

16 réponses

cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 22
9 déc. 2006 à 21:08
Ce n'est peut-être pas la meilleure façon d'y arriver, mais j'irais avec queque chose comme ça.
Comme le fichier contient plusieurs lignes et chaque lignes contient plusieurs chiffres et que tu veux chercher plusieurs valeurs, ça prendrait une triple boucle... Comme je n'aime pas les triples boucles, j'opte pour un Function qui retourne Vrai ou Faux selon que les valeurs sont toutes trouvées ou non.

Comme tu sembles vouloir éventuellement rechercher plus de 2 valeurs, aussi bien y aller avec une méthode plus dynamique. J'utilise des Inputbox (que je n'aime pas) pour les besoins de la cause. Il suffit d'entrer les chiffres à rechercher et -1 lorsqu'on en a assez.

Option Explicit

Sub Go()
    Dim I As Integer, strTemp As String
    Dim Lignes() As String, Valeurs() As Integer
    Dim Donnée As Integer
    Dim Total As Integer
   
    ReDim Valeurs(0) 'tableau des valeurs à rechercher
   
    Do
        Donnée = InputBox("Entrez une valeur à rechercher (-1 pour sortir)")
        If Donnée = -1 Then Exit Do
        ReDim Preserve Valeurs(I)
        If IsNumeric(Donnée) Then
            Valeurs(I) = Donnée
            I = I + 1
        End If
    Loop
   
    Open "C:\File.txt" For Binary As #1
    strTemp = Space$(LOF(1))
    Get #1, , strTemp
    Close #1
   
    Lignes = Split(strTemp, vbCrLf)  'fichier séparé par ligne
   
    'Vérifier chaque ligne
    For I = 0 To UBound(Lignes)
        If Recherche(Valeurs, Lignes(I)) Then
            Total = Total + 1
        End If
    Next
   
    MsgBox Total & " lignes contiennent les valeurs recherchées"
End Sub

Function Recherche(TableauValeurs, Chaine As String) As Boolean
    Dim I As Integer, J As Integer
    Dim Chiffres() As String, nbItems As Integer
   
    Chiffres = Split(Chaine, ";") 'tableau des chiffres d'une ligne
   
    For I = 0 To UBound(Chiffres)
        For J = 0 To UBound(TableauValeurs)
            If CInt(Chiffres(I)) = CInt(TableauValeurs(J)) Then
                nbItems = nbItems + 1                If nbItems UBound(TableauValeurs) + 1 Then Recherche True
            End If
        Next
    Next

End Function

MPi
3
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
7 déc. 2006 à 12:24
C'est surtout qu'à partir de la seconde occurence de ta boucle For, tu n'execute plus la boucle Do puisque Eof(1) est à True.
Il faudrait fermer et réouvrir le fichier pour relancer la boucle Do.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
7 déc. 2006 à 12:56
Mets la boucle for dans la boucle Loop, pardi ....
0
cs_ATitus Messages postés 32 Date d'inscription samedi 8 mai 2004 Statut Membre Dernière intervention 9 février 2010
7 déc. 2006 à 13:26
Hum .

Il y a peu etre une solution, en comptant en premier le nombre de lignes du fichier texte de depart. Une Fois le nombre de lignes trouvés, il doit etre possible de remplacer Do While, par une boucle avec comme fin le nombre de lignes ?


1) chargement du fichier et comptage des lignes
2) (Traiement) recherche nombre d'occurences de la ValeurX(1) 
      On boucle sur autant de lignes que possede le fichier texte 
      Et pour toutes les ValeurX() possibles.

ATitus
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
drikce06 Messages postés 2237 Date d'inscription lundi 29 mai 2006 Statut Membre Dernière intervention 29 mai 2008 11
7 déc. 2006 à 13:53
Salut, il me semble que les propositions de 333139 casy et de =615490 jmfmarques sont plus appropriées et moins compliquées!

 Drikce 06

Si la réponse vous convient: Réponse acceptée. Si la réponse vous convient pas:
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
7 déc. 2006 à 17:00
Il n'a en plus même pas besoin d'une boucle For !...


La seule boucle While not(EOF) suffit, assortie d'un simple compteur s'incrémentant de 1 ) à chaque occurence trouvée ...
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
7 déc. 2006 à 17:09
Je crois que tu n'as pas bien compris le problème jmf.

Le but (de ce que j'ai compris), c'est de compter le nombre de 1 dans le fichier, puis le nombre de 2, de 3, ......

D'ou la double boucle.

Cependant comme on ne sait pas du tout comment est codée la boucle Do While, il est difficile de proposer d'autre solution que celle que j'ai proposé, et qui est très loin d'etre propre. Il vaudrait mieux pouvoir ouvrir une seule fois le fichier, mais encore une fois cela dépend du code inconnu de la boucle Do While.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
0
lilo44 Messages postés 174 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 15 février 2007 2
7 déc. 2006 à 17:19
Je crois surtout que c'est pas très clair cette histoire :)
0
jmfmarques Messages postés 7668 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
7 déc. 2006 à 17:34
Vu, Casy ! Tu as peut-être raison.

Mais alors tout n'est en effet pas clair du tout et, dans un tel cas, il devrait faire (à l'intérieur du While) une boucle for à l'envers (partant de 100 et allant vers 1, affin de ne pas compter un 2, par exemple, qui se trouverait dans "92" )

Mais attendons des explications plus claires, en effet ...
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 22
7 déc. 2006 à 23:41
Je pense aussi comme Casy qu'il cherche à compiler le nombre de diverses valeurs, d'où la boucle.

Je pense que le mieux est de stocker son fichier dans une String et de boucler cette chaîne plutôt que d'ouvrir et fermer le fichier. Il pourrait aussi se créer un tableau dynamique pour stocker les divers comptes... (?)

ATitus, explique un peu plus clairement ce que tu cherches à faire et à récolter comme résultat(s)

MPi
0
cs_ATitus Messages postés 32 Date d'inscription samedi 8 mai 2004 Statut Membre Dernière intervention 9 février 2010
9 déc. 2006 à 13:41
RE.

Merci à tous pour vos idées et commentaires.
Bon je vais reprendre un peu mon explicatif.

J'ai donc un fichier texte de plusieurs lignes contenant des valeurs numeriques,  il n'y a aucune valeurs numerique en double par ligne, on a toujour le meme nombre de valeurs par ligne,  ces valeurs sont separés par des points virgules style :

1;2;3;54;65;89;100;122;356
3;5;9;21;32;45;56;67;78
... ect

Au debut je cherchais simplement le nombre de sortie totales d'une valeur, ou de 2 ensemble(combien de 1 & 56 sur les meme lignes)   la aucun probleme avec la boucle :
Do
While
Not
EOF
(1)
   ( Nombre de Valeur1  Trouvés = )
ou 
   ( Nombre de Valeur1 &  Valeur2 Trouvés = )

 Loop

Ce genre de boucle est suffisant pour une recherche unique.
Si on souhaite faire une autre recherche la boucle Do Eof(1) est à True, donc fin.

Il y a bien sur la possibilité de faire :
Comme casy l'indique =
fermer et réouvrir le fichier pour relancer la boucle Do.
ou de mettre selon   jmfmarques
for dans la boucle Loop


Mais il est vrai que le code ne serait pas tres "propre"

Une solution comme le preconise casy & MPI  .

Il vaudrait mieux pouvoir ouvrir une seule fois le fichier,  stocker le fichier dans une String et de boucler cette chaîne plutôt que d'ouvrir et fermer le fichier. créer un tableau dynamique pour stocker les divers comptes.

Oui la je suis d'accord .

Mais cela depasse mes modestes connaissances en VBA, un exemple de code serait le bienvenu.

ATitus
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 22
9 déc. 2006 à 17:31
Est-ce que tu cherches à compter le nombre d'occurences d'une certaine valeur (ou plusieurs) dans tout le fichier ? ou déterminer sur quelles lignes elle(s) se trouve(nt) ?

En affectant ton fichier à une variable String, tu peux utiliser Split sur le délimiteur ";" après avoir remplacer les vbcrlf par des points-virgules
MaString = Replace(MaString, vbCrLf, ";")
Tablo = Split(MaString, ";")
ce qui te créera un tableau de tous les éléments du fichier (Tablo(0) à Ubound(Tablo).
 
Il s'agirait ensuite de boucler ce tableau pour retrouver le nombre de fois qu'une valeur apparaît.
For i = 0 to Ubound(Tablo)
If tablo(i) = Valeur then
Total = Total + 1
....

MPi
0
cs_ATitus Messages postés 32 Date d'inscription samedi 8 mai 2004 Statut Membre Dernière intervention 9 février 2010
9 déc. 2006 à 18:11
Je penche pour la recherche des occurences de 2 Valeurs (pour debuter ),  nombre de fois ou Val(1) & Val(2) sont sorties ensemble sur les meme lignes , sur toute les lignes du fichier.
 [Si le fichier fait 1000 lignes / sur combiens de lignes retrouvons nous les Val(1) & Val(2) ensembles].

Merci pour les exemples de codes .

ATitus
0
cs_ATitus Messages postés 32 Date d'inscription samedi 8 mai 2004 Statut Membre Dernière intervention 9 février 2010
11 déc. 2006 à 14:29
Re

Grand Merci  MPi pour cet exemple de code .

Quand tu dit : Ce n'est peut-être pas la meilleure façon d'y arriver, mais j'irais avec quelque chose comme ça.
A mon niveau c'est plus que parfais, j'etudie ligne par ligne le code , la fonction recherche  par exemple , c'est efficace et bien pensé . En fait j'etudie encore ce point la !

Je n'ai juste modifier que cette partie du code :

If CStr(Chiffres(I)) = CStr (TableauValeurs(J)) Then
à la place de
If CInt(Chiffres(I)) = CInt(TableauValeurs(J)) Then

Sur Excel ( vb6.3) cela donnait une incompatibilité de type,  en fait cela m'a permis de decouvrir un peu mieux les fonctions de conversion de type de données .

Je remercie encore tous les participants à ce post.

ATitus _
0
cs_ATitus Messages postés 32 Date d'inscription samedi 8 mai 2004 Statut Membre Dernière intervention 9 février 2010
11 déc. 2006 à 14:31
Re

Grand Merci  MPi pour cet exemple de code .

Quand tu dit : Ce n'est peut-être pas la meilleure façon d'y arriver, mais j'irais avec quelque chose comme ça.
A mon niveau c'est plus que parfais, j'etudie ligne par ligne le code , la fonction recherche  par exemple , c'est efficace et bien pensé . En fait j'etudie encore ce point la !

Je n'ai juste modifier que cette partie du code :

If CStr(Chiffres(I)) = CStr (TableauValeurs(J)) Then
à la place de
If CInt(Chiffres(I)) = CInt(TableauValeurs(J)) Then

Sur Excel ( vb6.3) cela donnait une incompatibilité de type,  en fait cela m'a permis de decouvrir un peu mieux les fonctions de conversion de type de données .

Je remercie encore tous les participants à ce post.

ATitus _
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 22
11 déc. 2006 à 23:46
Bien content que ça fasse ton bonheur.

Pour le CStr et le CInt, c'est à peu près la même chose. En fait, lors de comparaison, il faut s'assurer que les 2 données soient du même type. Je m'en rend compte souvent sous Excel... il n'en laisse pas passer...¦¬)

Chez moi le CStr ne causait pas de problème, mais bon, tu auras tout de même trouvé la faille...

MPi
0