Nombre cellules consécutives

Résolu
Bonjour,

Mon problème:

< ou = à 3 cellules consécutives ayant la même valeur, je compte.
> 3 cellules consécutives ayant la même valeur, je ne compte pas.

Exemple:
C C C P P C C P C P Résultat attendu = 6 (période de 3 C comptée, période de 2 C comptée, période d'1 C comptée)
C C C C P C C C C C Résultat attendu = 0 (période de 4 C non comptée, période de 5 C non comptée)
C P P C C C C P C C Résultat attendu = 3 (période de 1 C comptée, période de 4 C non comptée, période de 2 C comptée)

Merci pour vos très généreuses astuces !

10 réponses

  1. Une solution à tester

    Public Function CompteDerSauf(c As String, plage As Range, sauf As String) As Long
    Dim ch As String, nbc As Long, cel As Range, s As String, k As Long
    ch = ""
    For Each cel In plage
      ch = ch & cel.Value
    Next cel
    ' supprimer tous les caractères de s dans ch
    If sauf <> "" Then
      For k = 1 To Len(sauf)
        ch = Replace(ch, Mid(sauf, k, 1), "")
      Next k
    End If
    If Right(ch, 1) <> c Then
      CompteDerSauf = 0
    Else
      nbc = 0
      While Right(ch, 1) = c
        nbc = nbc + 1
        ch = Left(ch, Len(ch) - 1)
      Wend
      CompteDerSauf = nbc
    End If
    End Function

    Appel =comptedersauf("H";A35:O35;"FX")

    bonne suite
    1. C'est remoi :)

      Est-ce que à la fonction 'compteder' ci-dessous il est possible d'ajouter la condition 'si cellule = F ou X continuer le compteur' ?

      Pour l'exemple :

      P P P H H H F H H H H P P P P Résultat attendu = 0 (dernière cellule diff de H)
      P P P C C P H H H P F F H H H Résultat attendu = 3 (dernière cellule = H + 2 H qui précèdent, 2 F avant mais un P)
      H F H F X F H H H H X H H H H Résultat attendu = 10 (dernière cellule = H + 3 H qui précèdent, 1 X à ne pas comtper, 4 H, F et X à ne pas comtper, 1 H à compter, 1 F à ne pas comtper, 1 H)

      (pour résumer, faire abstraction des F et des X)

      Public Function CompteDer(c As String, plage As Range) As Long
      Dim ch As String, nbc As Long, cel As Range
      ch = ""
      For Each cel In plage
      ch = ch & cel.Value
      Next cel
      If Right(ch, 1) <> c Then
      CompteDer = 0
      Else
      nbc = 0
      While Right(ch, 1) = c
      nbc = nbc + 1
      ch = Left(ch, Len(ch) - 1)
      Wend
      CompteDer = nbc
      End If
      End Function
      1. Tu es beaucoup trop fort ! C'est un vrai plaisir que d'avoir aussi vite des solutions quand on est bloqués...

        Encore MERCI ccm81
        1. Bonjour

          Une solution

          Public Function CompteDer(c As String, plage As Range) As Long
          Dim ch As String, nbc As Long, cel As Range
          ch = ""
          For Each cel In plage
            ch = ch & cel.Value
          Next cel
          If Right(ch, 1) <> c Then
            CompteDer = 0
          Else
            nbc = 0
            While Right(ch, 1) = c
              nbc = nbc + 1
              ch = Left(ch, Len(ch) - 1)
            Wend
            CompteDer = nbc
          End If
          End Function

          RQ. on doit pouvoir se passer de macro...

          Bonne suite
          1. Autre "problème" sur un compteur de cellules...
            si la dernière cellule est un H, je souhaite compter ce H + le nombre de H qui précèdent:

            P P P H H H H H H H H P P P P Résultat attendu = 0 (dernière cellule ? H)
            P P P C C P H H H P P C H H H Résultat attendu = 3 (dernière cellule = H + 2 H qui précèdent)
            H P H P H C H H H H H H H H H Résultat attendu = 9 (dernière cellule = H + 8 H qui précèdent)

            Merci :-)
            1. Explicit n'est pas une macro mais une directive de compilation qui oblige à déclarer les variables, donc s'il y a deux Option Explicit, tu en supprimes une

              pour les problèmes de majuscule/minuscule tu as la fonction Ucase

              bonne suite
              1. Bon tout fonctionne, il ne s'agissait que d'un problème de C au lieu de c :-)
                Trop cool, merci à tous!!
                1. Je suis favorable à la macro (éviter que les utilisateurs ne touchent aux formules et éviter de créer encore plus de lignes ou colonnes qu'il n'y a déjà dans mon tableur), mais elle ne fonctionne pas... Pour info:

                  - Ma 1ère cellule qui peut contenir un P est en Q15
                  - J'ai enregistré la macro dans une feuille 'Module 2' car j'ai déjà une fonction 'explicit' dans la feuille 'Module 1' (si j'enregistre la macro dans le 'module 1' à la suite de l'autre macro 'explicit', la macro 'bugue')

                  Encore MERCI!
                  1. Bonjour à tous

                    Si les macros ne te font pas peur, on peut passer avec une seule formule
                    https://www.cjoint.com/?3BbkcSgPrmc

                    Alt-F11 pour voir la macro

                    Dans ton classeur
                    Alt-F11 pour passer dans l'editeur VBA
                    Insertion/Module
                    Copier le tout

                    Bonne suite
                    1. Bonjour

                      une piste :

                      Si par ex plage de CCCPP etc en B1:M1
                      En B2 mettre la formule =SI(B1=A1;A2&B1;B1) et l'étirer jusqu'à la fin de la plage
                      (ça regroupe les C)
                      En B3 mettre : =SI(OU(C2="P";C2="");B2;"") et étirer
                      (ne retient que les groupes avant P ou vide )
                      En B4 mettre =NB.SI(B3:P3;"C")+NB.SI(B3:P3;"CC")*2+NB.SI(B3:P3;"CCC")*3
                      (comptabilise les groupes de 1 à 3 C)

                      Cordialement
                      1. En une seule formule (en N1 pour reprendre l'exemple de la plage en B1:M1), ce n'est pas possible ?
                      2. En une seule formule non
                        mais en une ligne oui
                        1° LAISSER N1 vide (sert à determiner que la cellule précédente contient la dernière donnée)
                        2° en O1 mettre =SI(B1="C";NBCAR(SI(OU(C1="P";C1="");SI(B1=A1;A2&B1;B1);""));0)
                        3°Etirer jusqu'en Z1
                        4°En AA mettre =SOMME.SI(O1:Z1;"<4";O1:Z1) qui comptabilise les bons C
                      3. Je tente tout ça, un grand MERCI!