extraire des doublons d'une chaine de caractères

finarobert

XLDnaute Nouveau
Supporter XLD
Bonjour
J'ai une chaine de caractères qui peut être très longue de type :AZEDZEZSDAZEDZFREZQSSUAAZEDZAAAEZQSSU

je cherche un programme vba pour extraire de cette chaines les doublons (ou plus) d'au moins 5 caractères:
Par exemple dans mon exemple, j'ai 3 fois AZEDZ et 2 fois EZQSSSU
pouvez vous me donner une solution à ce problème?
merci
Boby
 
Solution
Bonsoir
perso 2 boucles imbriquées et un dico tu a ton truc pour 5,6,7,etc....
reste a savoir ce que tu veux faire des chaines de longeur inférieure a d'autres qui sont contenues dans les plus grandes
et cela peut se régler facilement
exemple
VB:
Sub test()
    Dim Dic As Object, A&, B&, Elem, Chaine$

    Chaine = "AZEDZEZSDAZEDZFREZQSSUAAZEDZAAAEZQSSU"

    Set Dic = CreateObject("scripting.dictionary")

    For i = 1 To Len(Chaine)
        For B = 5 To Len(Chaine) - (i - 1)
            Dic(Mid(Chaine, i, B)) = Dic(Mid(Chaine, i, B)) + 1
        Next
    Next
    'lecture du dico
    For Each Elem In Dic
        If Dic(Elem) > 1 Then Debug.Print Elem & "--->" & Dic(Elem)
    Next
End Sub
et on peut transformer ça en fonction et...

finarobert

XLDnaute Nouveau
Supporter XLD
je pense que ça va demander une sérieuse adaptation. On verra tout ça demain. Maintenant dodo 🥱😴 !
Bonne-nuit .
Tired Good Night GIF by Max
123 soleil, c'est bon, il n'est pas 5 fois.....Quand c'est tard, il vaut mieux aller se coucher.....
 

patricktoulon

XLDnaute Barbatruc
Bonsoir
perso 2 boucles imbriquées et un dico tu a ton truc pour 5,6,7,etc....
reste a savoir ce que tu veux faire des chaines de longeur inférieure a d'autres qui sont contenues dans les plus grandes
et cela peut se régler facilement
exemple
VB:
Sub test()
    Dim Dic As Object, A&, B&, Elem, Chaine$

    Chaine = "AZEDZEZSDAZEDZFREZQSSUAAZEDZAAAEZQSSU"

    Set Dic = CreateObject("scripting.dictionary")

    For i = 1 To Len(Chaine)
        For B = 5 To Len(Chaine) - (i - 1)
            Dic(Mid(Chaine, i, B)) = Dic(Mid(Chaine, i, B)) + 1
        Next
    Next
    'lecture du dico
    For Each Elem In Dic
        If Dic(Elem) > 1 Then Debug.Print Elem & "--->" & Dic(Elem)
    Next
End Sub
et on peut transformer ça en fonction et même utilisable en formule
demo.gif
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @patricktoulon ;),

Il y a un petit problème selon moi.

Si on compte le nombre de caractères des doublons (fréquence par nombre de caractères) et qu'on somme alors on trouve un nombre de caractères pour les doublons (47) supérieur à la longueur de la chaine source (37) ?
1701461175335.png



Avec le code du mon fichier du message #8 (finarobert- Extraire- v2a.xlsm), les composants des doublons sont exclus, ce qui donne : 27 caractères pour les doublons pour 37 caractères de la chaine source.
1701461237460.png
 

patricktoulon

XLDnaute Barbatruc
re
@mapomme
je n'ai pas regardé ton fichier
c'est bien pour ça que j'ai dis
faut il encore savoir ce qu'il veux faire des doublons INSTR DE LONGUEUR INFERIEURES
et puis surtout quand je lis l'énoncé qui est contradictoire finalement
je cherche un programme vba pour extraire de cette chaines les doublons (ou plus) d'au moins 5 caractères:
Par exemple dans mon exemple, j'ai 3 fois AZEDZ et 2 fois EZQSSSU
pouvez vous me donner une solution à ce problème?
a aucun moment il demande de les exclure
cela dit comme je l'ai dit dans le dico facile de faire un remove si instr >0
 

patricktoulon

XLDnaute Barbatruc
en fait si on va bien chercher
VB:
solei   >  6
soleil   >  6
oleil   >  6
azert   >  5
azerta   >  3
azertaz   >  3
azertaze   >  3
azertazer   >  3
azertazert   >  3
azertazerta   >  2
azertazertaz   >  2
azertazertaze   >  2
azertazertazer   >  2
azertazertazert   >  2
zerta   >  3
zertaz   >  3
zertaze   >  3
zertazer   >  3
zertazert   >  3
zertazerta   >  2
zertazertaz   >  2
zertazertaze   >  2
zertazertazer   >  2
zertazertazert   >  2
ertaz   >  3
ertaze   >  3
ertazer   >  3
ertazert   >  3
ertazerta   >  2
ertazertaz   >  2
ertazertaze   >  2
ertazertazer   >  2
ertazertazert   >  2
rtaze   >  3
rtazer   >  3
rtazert   >  3
rtazerta   >  2
rtazertaz   >  2
rtazertaze   >  2
rtazertazer   >  2
rtazertazert   >  2
tazer   >  3
tazert   >  3
tazerta   >  2
tazertaz   >  2
tazertaze   >  2
tazertazer   >  2
tazertazert   >  2
gqsdf   >  2
gqsdfg   >  2
gqsdfgq   >  2
gqsdfgqs   >  2
qsdfg   >  2
qsdfgq   >  2
qsdfgqs   >  2
sdfgq   >  2
sdfgqs   >  2
dfgqs   >  2
 

patricktoulon

XLDnaute Barbatruc
re
ok donc 5 caratères et 5 fois minimum
donc ceux ci sont bons
solei > 6
soleil > 6
oleil > 6
azert > 5
et si tu me dis oui mais certains ne sont pas des mots entiers
je te reponds que excel ça il n'en sait rien et c'est bien là ou est la limite d'excel car il n'a pas de dictionnaire
 

mapomme

XLDnaute Barbatruc
Supporter XLD
re
ok donc 5 caratères et 5 fois minimum
donc ceux ci sont bons
solei > 6
soleil > 6
oleil > 6
azert > 5
et si tu me dis oui mais certains ne sont pas des mots entiers
je te reponds que excel ça il n'en sait rien et c'est bien là ou est la limite d'excel car il n'a pas de dictionnaire
Quand j'ai trouvé un doublon (du plus long au plus court), je l'élimine des recherches suivantes de doublons.
Si je trouve soleil, je ne trouverai pas ensuite les doublons le composant (sauf s'ils sont ailleurs que dans les mots soleil).
 

finarobert

XLDnaute Nouveau
Supporter XLD
re
ok donc 5 caratères et 5 fois minimum
donc ceux ci sont bons
solei > 6
soleil > 6
oleil > 6
azert > 5
et si tu me dis oui mais certains ne sont pas des mots entiers
je te reponds que excel ça il n'en sait rien et c'est bien là ou est la limite d'excel car il n'a pas de dictionnaire
pas grave car ce sont des chaines de caractères (notes de musique)
 

patricktoulon

XLDnaute Barbatruc
Quand j'ai trouvé un doublon (du plus long au plus court), je l'élimine des recherches suivantes de doublons.
Si je trouve soleil, je ne trouverai pas ensuite les doublons le composant (sauf s'ils sont ailleurs que dans les mots soleil).
re
et comment veux tu que vba fasse la différence entre
soleil soleil!! toi mon soleil printanier qui ensoleille la plaine jusqu'au crépuscule
on fait quoi on le garde le ensoleille ?
si tu me dis oui alors ta reponse n'a pas de sens

apres @finarobert parle de musique
là je pense qu'il y a plus simple a faire (Do Ré Mi Fa Sol La Si Do ) ;)
 

mapomme

XLDnaute Barbatruc
Supporter XLD
soleil soleil!! toi mon soleil printanier qui ensoleille la plaine jusqu'au crépuscule
on fait quoi on le garde le ensoleille ?
si tu me dis oui alors ta reponse n'a pas de sens
Oui 🤪 !

J'ai dit :
  • Je recherche les doublons du plus long au plus court
  • si j'en trouve un, je compte sa fréquence et je retire de la chaine les caractères de ces doublons (remplacés par Chr(6) )
  • et je continue

  • donc "ensoleille" n'est pas doublon => je ne compte rien et ne remplace rien
  • arrivé à "soleil" c'est un doublon =>je le compte 3 fois et je retire les "soleil" de la chaine
  • et je continue
Je ne sais pas si j'ai raison mais c'est comme ça que j'ai raisonné (bien ou mal ?)


soleil soleil!! toi mon soleil printanier qui ensoleille la plaine jusqu'au crépuscule

nota : Je calme tout de suite tes ardeurs sentimentales, tu ne dois rien espérer, je ne serai jamais ton soleil printanier, non mais... 🤣.
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 209
Messages
2 086 259
Membres
103 167
dernier inscrit
miriame