Nombre cellules consécutives

Résolu
nanie -  
ccm81 Messages postés 11033 Statut Membre -
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. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
     
    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
    0
    1. nanie
       
      En une seule formule (en N1 pour reprendre l'exemple de la plage en B1:M1), ce n'est pas possible ?
      0
    2. via55 Messages postés 14393 Date d'inscription   Statut Membre Dernière intervention   2 759
       
      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
      0
    3. nanie
       
      Je tente tout ça, un grand MERCI!
      0
  2. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
    0
  3. nanie
     
    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!
    0
  4. nanie
     
    Bon tout fonctionne, il ne s'agissait que d'un problème de C au lieu de c :-)
    Trop cool, merci à tous!!
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
    0
  7. nanie
     
    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 :-)
    0
  8. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
    0
  9. nanie
     
    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
    0
  10. nanie
     
    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
    0
  11. ccm81 Messages postés 11033 Statut Membre 2 434
     
    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
    0