cs_ATitus
Messages postés32Date d'inscriptionsamedi 8 mai 2004StatutMembreDernière intervention 9 février 2010
-
7 déc. 2006 à 12:18
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 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
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201822 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
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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 #
cs_ATitus
Messages postés32Date d'inscriptionsamedi 8 mai 2004StatutMembreDerniè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
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 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 #
jmfmarques
Messages postés7668Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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 ...
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201822 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)
cs_ATitus
Messages postés32Date d'inscriptionsamedi 8 mai 2004StatutMembreDerniè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 :
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.
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201822 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
....
cs_ATitus
Messages postés32Date d'inscriptionsamedi 8 mai 2004StatutMembreDerniè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].
cs_ATitus
Messages postés32Date d'inscriptionsamedi 8 mai 2004StatutMembreDerniè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.
cs_ATitus
Messages postés32Date d'inscriptionsamedi 8 mai 2004StatutMembreDerniè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.
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201822 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...