Microsoft 365 Comment extraire différentes occurrences d’un caractère dans un texte ? (Maximum consécutif, dernier consécutif, nombre de blocs)

yeti_yeti

XLDnaute Junior
Bonjour,

Je cherche une façon d’extraire trois type de données dans une chaîne de texte similaire à celle ci-dessous (par exemple ce sont les 1 qui m’intéressent):

1XXXXX11111XX221111121XX1XX111211XX1111X12111XX21XX12X111XX2XX1X211111211

Je cherche:

  1. Le nombre maximum de 1 consécutifs. Dans l’exemple ci-dessus cela devrait retourner 5.
  2. Le nombre de blocs de 1 (1 est un bloc, 11 un autre bloc, 111 un autre bloc, etc). Dans l’exemple ci-dessus cela retournerait 16
  3. Le nombre de 1 consécutif du dernier bloc si le dernier caractère est 1. Si ça ne l’est pas, il retourne 0. Dans l’exemple ci-dessus cela retournerait 2.
J’imagine que les points 1 et 3 sont faisables avec des formules standards (le 3 doit pouvoir se faire avec un LEN, RIGHT, FIND, mais ça incomberait de chercher le premier caractère depuis la droite qui N’EST PAS 1… est-ce seulement possible?). Pour le 2 j’imagine qu’il faut faire une formule personnalisée (avec boucle?) dans VBA, si ma demande est même possible à effectuer.

Merci d’avance pour votre aide car là je sèche complètement
 

patricktoulon

XLDnaute Barbatruc
bonjour
et une petite fonction perso une !!
vite fait comme ça ;)
utilisable en VBA ou Formule
devrait fonctionner non seulement pour un!! caractère mais aussi pour une expression de plusieurs caractères

VB:
Sub test()
    Dim Big$, NbBlocK&, char
    t = [A1].Value
    char = "1"
    MsgBox GetLongRepitExpression(t, char, 0)    ' la plus grande répétition
    MsgBox GetLongRepitExpression(t, char, 1)    ' le nombre de block  toute longueur confondue
End Sub
Function GetLongRepitExpression(t, char As String, x As Long)
    Dim I&, A&, tablo, Big$
    For I = 1 To Len(t)
        If Mid(t, I, Len(char)) <> char Then Mid(t, I, Len(char)) = Application.Rept(" ", Len(char))
    Next
    t = Application.Trim(t)
    tablo = Split(t, " ")
    For I = 0 To UBound(tablo)
        If Len(tablo(I)) > A Then A = Len(tablo(I)): Big = tablo(I)
    Next
    Debug.Print t
    Debug.Print UBound(tablo) + 1
    Debug.Print Big
    Select Case x
    Case 0: GetLongRepitExpression = Big
    Case 1: GetLongRepitExpression = UBound(tablo) + 1
    Case 2: GetLongRepitExpression = Len(Big)
    Case Else: GetLongRepitExpression = "IvalidArgumnts!"
    End Select
End Function
démo
demo7.gif
 

chris

XLDnaute Barbatruc
Bonjour à tous
Power Query n'est pas terrible pour le travail entre les lignes.... car elles n'ont pas d'ordre.
Avec les Index on peut gérer l'ordre
L'étape de détection de Type (ligne unique, début ou fin de bloc) peut sans doute être optimisée

Mais on y arrive en une seule requête.
Pas très rapide je trouve mais cela montre cette possibilité
 

Pièces jointes

  • Analyse chaines2_PQ.xlsx
    20.4 KB · Affichages: 4

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Pas trop tard pour jouer ?

Voici une autre proposition Power Query qui utilise List.Generate pour numéroter les groupes.
Ne travaille que sur une chaîne mais facilement transformable en fonction.

Cordialement

[Edition 24-08-2021 7:48]
Transformation de la requête en fonction pour traiter une colonne de table de chaînes
Remplacement du fichier d'origine
 

Pièces jointes

  • GroupeText.xlsm
    28.3 KB · Affichages: 7
Dernière édition:

Discussions similaires