Boucle Do While/Loop dans boucle For Next [Résolu]

cs_ATitus 33 Messages postés samedi 8 mai 2004Date d'inscription 9 février 2010 Dernière intervention - 7 déc. 2006 à 12:18 - Dernière réponse : cs_MPi 3877 Messages postés mardi 19 mars 2002Date d'inscription 23 août 2018 Dernière intervention
- 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]
Afficher la suite 

Votre réponse

16 réponses

Meilleure réponse
cs_MPi 3877 Messages postés mardi 19 mars 2002Date d'inscription 23 août 2018 Dernière intervention - 9 déc. 2006 à 21:08
3
Merci
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

Merci cs_MPi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de cs_MPi
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 7 déc. 2006 à 12:24
0
Merci
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 #
Commenter la réponse de cs_casy
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 7 déc. 2006 à 12:56
0
Merci
Mets la boucle for dans la boucle Loop, pardi ....
Commenter la réponse de jmfmarques
cs_ATitus 33 Messages postés samedi 8 mai 2004Date d'inscription 9 février 2010 Dernière intervention - 7 déc. 2006 à 13:26
0
Merci
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
Commenter la réponse de cs_ATitus
drikce06 2247 Messages postés lundi 29 mai 2006Date d'inscription 29 mai 2008 Dernière intervention - 7 déc. 2006 à 13:53
0
Merci
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:
Commenter la réponse de drikce06
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 7 déc. 2006 à 17:00
0
Merci
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 ...
Commenter la réponse de jmfmarques
cs_casy 7745 Messages postés mercredi 1 septembre 2004Date d'inscription 24 septembre 2014 Dernière intervention - 7 déc. 2006 à 17:09
0
Merci
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 #
Commenter la réponse de cs_casy
lilo44 174 Messages postés vendredi 25 janvier 2002Date d'inscription 15 février 2007 Dernière intervention - 7 déc. 2006 à 17:19
0
Merci
Je crois surtout que c'est pas très clair cette histoire :)
Commenter la réponse de lilo44
jmfmarques 7668 Messages postés samedi 5 novembre 2005Date d'inscription 22 août 2014 Dernière intervention - 7 déc. 2006 à 17:34
0
Merci
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 ...
Commenter la réponse de jmfmarques
cs_MPi 3877 Messages postés mardi 19 mars 2002Date d'inscription 23 août 2018 Dernière intervention - 7 déc. 2006 à 23:41
0
Merci
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
Commenter la réponse de cs_MPi
cs_ATitus 33 Messages postés samedi 8 mai 2004Date d'inscription 9 février 2010 Dernière intervention - 9 déc. 2006 à 13:41
0
Merci
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
Commenter la réponse de cs_ATitus
cs_MPi 3877 Messages postés mardi 19 mars 2002Date d'inscription 23 août 2018 Dernière intervention - 9 déc. 2006 à 17:31
0
Merci
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
Commenter la réponse de cs_MPi
cs_ATitus 33 Messages postés samedi 8 mai 2004Date d'inscription 9 février 2010 Dernière intervention - 9 déc. 2006 à 18:11
0
Merci
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
Commenter la réponse de cs_ATitus
cs_ATitus 33 Messages postés samedi 8 mai 2004Date d'inscription 9 février 2010 Dernière intervention - 11 déc. 2006 à 14:29
0
Merci
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 _
Commenter la réponse de cs_ATitus
cs_ATitus 33 Messages postés samedi 8 mai 2004Date d'inscription 9 février 2010 Dernière intervention - 11 déc. 2006 à 14:31
0
Merci
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 _
Commenter la réponse de cs_ATitus
cs_MPi 3877 Messages postés mardi 19 mars 2002Date d'inscription 23 août 2018 Dernière intervention - 11 déc. 2006 à 23:46
0
Merci
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
Commenter la réponse de cs_MPi

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.