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. 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!
  2. 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. 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. Bon tout fonctionne, il ne s'agissait que d'un problème de C au lieu de c :-)
        Trop cool, merci à tous!!
        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. 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. 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. 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. 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. 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