Trouver et compter une répétion dans une chaine

Bonjour,

je souhaiterai repérer et récupérer les répétition de caractères dans une chaine.

Par exemple dans la chaine suivante:

"attcgaatgggtcaTATATATATATAagtccgattgg"

il y a une répétition de TA 6 fois consécutive....j'aimerai trouver un bout de code pour analyser cette chaine, identifier la répétiton et la compter...

Je suppose qu'il faut tester les caractères par paire avec une fonction MID et quand la paire est identique à la suivante on récupère et on compte, mais j'ai du mal à transcrire cela en VBA.

Pouvez vous m'aider?

Merci

Bonjour,

La chaine à trouver est-elle connue à l'avance ? Ont elles toujours 2 caractères de longueur ?

Est-ce qu'il faut ne repérer que les TA car dans la chaine il y a d'autres paires de caractères en doublons gg par exemple? Faut-il aussi les détecter malgré qu'il ne sont pas consécutifs dans la chaine ?

Le principe est de calculer le nombre de caractères de la chaine puis de la parcourir par paire.

Mais on peut commencer au caractère 1 ou au 2 et suivant cela les chaines trouvées seront différentes ?

Plein de questions auxquelles vous seul pouvez répondre.

bonjour

un essai pour les privés de vba

123tkd.xlsx (9.23 Ko)

cordialement

Bonjour,

la chaine à trouver n'est pas connue à l'avance et il peut y en avoir 2 ou 3 différentes dans une séquence, on peut commencer indifféremment au caractère 1 ou 2 mais dans l'absolue autant commencer au premier.

Pour l'instant je m'intéresse aux répétitions consécutives de 2 caractères, j'adapterai plus tard pour 3, 4 et 5.

Les séquences ont des longueurs variant de 100 à 600 caractères, et pour limiter les résultats, seules les répétitions supérieures à 5 sont intéressantes.

La solution de tulipe4 est intéressante mais suppose de connaitre le motif répété à l'avance, ce qui n'est pas le cas à moins de tester toutes les combinaisons possible entre A,T,G, et C.

Merci à vous deux.

bonsoir

pas sur ! mon cher

j'avais mis "TA" dans la formule ; MAIS si tu le mets dans une cel ( ce qui permettra de le" moduler" )puis que tu utlises cette cel dans la partie SUBSTITUE . et qu 'ensuite tu divises par le nbca rde cette cel ;ca devrait gazer ; du moins je le pense

cordialement

Bonjour,

Une proposition avec VBA à tester et adapter à votre configuration.

Cliquer le bouton Decompte et la chaine est décomposée dans la feuille Ch_Decomp et le décompte est inscrit dans la feuille Relevé

A vous de voir.

92doublonchaine.xlsm (22.00 Ko)

bonjour

ça ne vaudra jamais le vba mais ....

49tkd2.zip (3.78 Ko)

cordialement

Merci pour vos réponses, mais finalement la solution adéquate m'a été soufflée en très grande partie par "mapomme" sur un forum "ami"

Le principe consiste à tester tous les caractères de la séquence 2 par 2 et de les comparer aux 2 caractères suivants de la chaine, si ils sont identiques on incrémente un compteur et on décale le long de la chaine. Lorsqu'il n'y a plus de répétition, on sort pour copier le motif et son nombre de répétition (si supérieur à 4) dans une cellule, puis on reprend le test jusqu'à la fin de la séquence.

Sub test()
Dim i As Integer, NbrRepet As Integer, MaxRepet As Integer, n As Integer
Dim Motif As String, RestSeq As String, Cel As Range

For Each Cel In Range("B3", Range("B1024000").End(xlUp).Rows)

n = 2 'nombre de caractères à rechercher (n = 2 -> on recherche la répétition de deux caractères)
MaxRepet = 0
    For i = 1 To Len(Cel.Value) - n
        Motif = Mid(Cel.Value, i, n) 'détermine à la position i les 2 caractères constituant le motif TA, CT ou autre
        RestSeq = Mid(Cel.Value, i + n) 'détermine le reste de la séquence à tester
        NbrRepet = 1
    Do Until Len(RestSeq) < n 
        If InStr(Left(RestSeq, n), Motif) > 0 Then 'si les 2 caractères sont identiques au motif...
              NbrRepet = NbrRepet + 1                 ' on incrémente le compteur
              RestSeq = Mid(RestSeq, n + 1)          'on décale sur le reste de la séquence
        Else
            Exit Do
        End If
    Loop

If NbrRepet > 4 And NbrRepet > MaxRepet Then
        MaxRepet = NbrRepet
        Cells(Cel.Row, 3).Value = "(" & Motif & ")" & MaxRepet 'permet de conserver la plus grosse répétition trouvée en début de ligne
End If
'colle le motif et le nombre de répétition en ligne les uns à la suite des autres
If NbrRepet > 4 Then Cells(Cel.Row, Range("IV" & Cel.Row).End(xlToLeft).Column + 1).Value = "(" & Motif & ")" & NbrRepet
' on saute la répétition trouvée et on teste le reste de la séquence
i = i + ((NbrRepet - 1) * n)

Next i
next Cel

Au final pour chaque séquence je liste toutes les répétitions de 2 caractères sur une ligne avec au départ la plus grosse répétition.

On peut retester la séquence pour des répétitions de 3 caractères en changeant la valeur "n".

Un grand merci pour votre temps

Rechercher des sujets similaires à "trouver compter repetion chaine"