Nombre cellules consécutives

Résolu/Fermé
nanie - 31 janv. 2013 à 17:24
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 - 11 févr. 2013 à 18:26
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

via55 Messages postés 14398 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 10 avril 2024 2 701
31 janv. 2013 à 18:23
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
En une seule formule (en N1 pour reprendre l'exemple de la plage en B1:M1), ce n'est pas possible ?
0
via55 Messages postés 14398 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 10 avril 2024 2 701
31 janv. 2013 à 19:36
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
Je tente tout ça, un grand MERCI!
0
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
1 févr. 2013 à 10:05
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
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
Bon tout fonctionne, il ne s'agissait que d'un problème de C au lieu de c :-)
Trop cool, merci à tous!!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
1 févr. 2013 à 11:05
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
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
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
8 févr. 2013 à 11:34
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
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
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
ccm81 Messages postés 10851 Date d'inscription lundi 18 octobre 2010 Statut Membre Dernière intervention 16 avril 2024 2 404
11 févr. 2013 à 18:26
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