Trouver plusieurs instances d'un même caractère dans un fichier texte. [Résolu]

Signaler
Messages postés
14
Date d'inscription
dimanche 10 juillet 2005
Statut
Membre
Dernière intervention
31 janvier 2009
-
Messages postés
577
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
20 novembre 2010
-
Bonjour à tous, voila mon titre explique déjà beaucoup ^^
Déjà j'ai été assez dégouté de ne pas trouver une fonction qui permet de faire cela.
Alors j'ai décider d'en faire une moi même à l'arrache pour faire un teste, j'optimiserai plus tard.

Private Sub Command1_Click()
Dim test As Integer
Dim test1 As Integer
Dim test2 As Integer
test1 = 1
test = 1
Do Until test = 0
test = InStr(test1, Text1.Text, "#")
test1 = test + 1
test2 = test2 + 1
Loop
MsgBox test2 - 1
End Sub

En gros il trouve le prochain caractère "#", puis réitère la fonction a cet emplacement + 1 jusqu'a ce qu'il n'y est plus de "#"

Tout content de moi, ça marche nickel dans ma textbox et dans des petits fichiers texte.
Seulement avec un gros fichier texte d'une 100 de ko, il me sort une erreur 6 de type overflow (je suppose qu'une fois compilé ça dois crasher)

Comment résoudre cette erreur ?

10 réponses

Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
5 avril 2013
6
Sans rien modifier en ce qui concerne la préférence à donner à la fonction spli.


Si, donc, il s'agit d'un exercice que tu t'imposes, voilà, en code, ce que je t'exposais plus haut :


 Dim cpt As Long '(pour le cas où tu aurais un très grand nombre de #
 Dim toto As String
 toto = Text1.Text
 Do While InStr(toto, "#")
   cpt = cpt + 1
   toto = Mid(toto, InStr(toto, "#") + 1)
 Loop
 MsgBox cpt
Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
5 avril 2013
6
Bonjour,

je me demande comment tu fais pour loger tout celà dans une textbox...

Mais bon ...
1) il est clair que si tu types en integer ta variable test (position à l'aide de Instr) elle n'aura que la limite d'un Integer ! Type-la en Long...!
2) Idem pour test2 (puisque test + 1


3) vaudra mieux typer en long également test2 (juste pour le cas où le nombre de tes # dépasserait lui aussi la limite d'un integer).


Essaye donc et tu verras.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
42
salut,
tu as de l'overflow juste en cherchant avec "#" ?
ton texte n'est composé que de dièses?

désolé ton titre n'est pas suffisant!
tu veux quoi, compter les occurrences d'un caractère? celles de chaque caractère? leurs positions?

juste compter un seul... : MsgBox UBound(Split(Text1.Text, "#"))
les autres propositions sont présentes sur codyx.org
bonne soirée
<hr size="2" width="100%" />Prenez un instant pour répondre à [sujet-SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp 
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Comme dit jmf0, problème de type de variable

Integer = entier 16 bits signé soit pour valeur max 32767. C'est un peu juste pour compter jusqu'à 102400 (100ko)

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
14
Date d'inscription
dimanche 10 juillet 2005
Statut
Membre
Dernière intervention
31 janvier 2009

Je loge pas tout ça dans une textbox, j'ouvre le fichier avec fileopen mais la c'était juste pour essayer.

Mon texte contient exactement 4 # pour ça que je comprends pas qu'il y est overflow...
Je veux compter les occurrences du caractère # dans un fichier texte gros de 100ko
Messages postés
14
Date d'inscription
dimanche 10 juillet 2005
Statut
Membre
Dernière intervention
31 janvier 2009

Casy et jmf0 j'ai essayé de mettre en Long mais toujours la même erreur, ça dois venir de mon code :/ il ne doit pas aimer la loop...
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Si tu as mis les 3 variables en Long, je ne vois pas coment tu pourrais avoir un dépassement de capacité. Il faudrait que tu traite un texte de plus de 2Go, chose que de toute façon ne supporte pas le textbox.

--> J'ai fait le test, ça marche c'est moi

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
1566
Date d'inscription
mardi 26 décembre 2000
Statut
Membre
Dernière intervention
5 avril 2013
6
La logique de ton code est bonne.
Ton mécanisme réinvente toutefois la roue (intéresse-toi, comme le suggère PCPT) à la fonction Split !
S'il s'agit toutefois d'un exercice que tu t'imposes :
Il n'est pas adroit d'utiliser instr, à chaque fois, sur toute la longueur de ta chaîne (ralentissements assurés).
Il vaut mieux, alors, soustraire à chaque fois de ta chaine celle qui précède le instr trouvé et réitérer sur la chaîne restante (donc de plus en plus courte). Un compteur est alors à utiliser.
Messages postés
14
Date d'inscription
dimanche 10 juillet 2005
Statut
Membre
Dernière intervention
31 janvier 2009

En effet casy ça ne me provoquer pas d'overflow mais vitesse d'execution beaucoup trop lente.
En revanche jmf0 ça marche très bien ^^ 50 fois plus rapide que mon code !

Merci à tous !
Messages postés
577
Date d'inscription
vendredi 26 septembre 2008
Statut
Membre
Dernière intervention
20 novembre 2010
4
Bonjour

Et le Split, ça donne quoi, du point de vue de la vitesse ?