Distinguer le nombre de valeurs consécutives (série) dans un tableau de données

Solid_Pliskin

XLDnaute Nouveau
Bonjour,

J'ai un tableau de valeurs assez simple (les valeurs sont soient "3", "1" ou "0") et j'aimerai connaître le nombre de la plus grande série de valeurs identiques et consécutives par ligne.

Par exemple:

0 | 1 | 1 | 1| 1| 1 | 3| 0| 1 | 0 | 3 | 1 | 1 | 0

Pour la plus grande série consécutive de "1", le nombre est 5.

1| 3 | 3 | 1 | 1 | 0 | 3 | 3 | 3 | 3 | 1 | 0

Pour la plus grande série consécutive de "3", le nombre est 4.

Etc.

Dans le fichier joint, vous trouverez de plus simples explications.

Merci :)
 

Pièces jointes

  • TestSolid.xlsx
    16.4 KB · Affichages: 214

phlaurent55

Nous a quittés en 2020
Repose en paix
Re : Distinguer le nombre de valeurs consécutives (série) dans un tableau de données

Bonjour Solid........, et bienvenue sur le forum

ton fichier en retour

à+
Philippe
 

Pièces jointes

  • 111.xls
    62 KB · Affichages: 579
  • 111.xls
    62 KB · Affichages: 567
  • 111.xls
    62 KB · Affichages: 609

Robert

XLDnaute Barbatruc
Repose en paix
Re : Distinguer le nombre de valeurs consécutives (série) dans un tableau de données

Bonjour le fil, bonjour le forum,

J'ai planché dur ton problème (par macro aussi) mais quand je vois la simplicité et l'efficacité de la solution de Philippe je ne t'envoie même pas mon usine à gaz...
 

phlaurent55

Nous a quittés en 2020
Repose en paix
Re : Distinguer le nombre de valeurs consécutives (série) dans un tableau de données

Re,
Est-on forcément obligé de passer par une macro?

Sinon, merci ca fonctionne ;)
je crains que Oui !
j'ai tenté d'essayer de commencer à réfléchir à une solution par formule mais j'ai vite abandonné

sinon attentre qu'un "formuliste" passe par ici

à+
Philippe
 

david84

XLDnaute Barbatruc
Re : Distinguer le nombre de valeurs consécutives (série) dans un tableau de données

Bonsoir,
ci-joint une autre proposition VBA en utilisant des tableaux VBA :
Code:
Sub test()
Dim Plage, LigneMax, LigneMax2, i&, j&, k&, temp1, temp2, Nb&
Set Plage = [B3:AM22]
Set LigneMax = [AN2:AP2]
For i = 1 To LigneMax.Columns.Count
    For j = 1 To Plage.Rows.Count
        For k = 1 To Plage.Columns.Count
            If Plage(j, k) = LigneMax(1, i) Then
                Nb = Nb + 1: temp1 = Nb
                If temp2 < temp1 Then temp2 = temp1
            Else
                Nb = 0
            End If
        Next k
        Dim tabl()
        ReDim Preserve tabl(1 To Plage.Rows.Count, 1 To LigneMax.Columns.Count)
        tabl(j, i) = temp2: temp2 = 0: Nb = 0
    Next j
Next i
Set LigneMax2 = [AQ2:AS2]
For i = 1 To LigneMax2.Columns.Count
    For j = 1 To Plage.Rows.Count
        For k = 1 To Plage.Columns.Count
            If Plage(j, k) <> LigneMax2(1, i) Then
                Nb = Nb + 1: temp1 = Nb
                If temp2 < temp1 Then temp2 = temp1
            Else
                Nb = 0
            End If
        Next k
        Dim tabl2()
        ReDim Preserve tabl2(1 To Plage.Rows.Count, 1 To LigneMax2.Columns.Count)
        tabl2(j, i) = temp2: temp2 = 0: Nb = 0
    Next j
Next i
[AN3].Resize(Plage.Rows.Count, LigneMax.Columns.Count) = tabl
[AQ3].Resize(Plage.Rows.Count, LigneMax2.Columns.Count) = tabl2
End Sub
A+
 

Pièces jointes

  • TestSolid.xlsm
    30.3 KB · Affichages: 162

ROGER2327

XLDnaute Barbatruc
Re : Distinguer le nombre de valeurs consécutives (série) dans un tableau de données

Bonsoir à tous
Une fonction personnalisée ?
VB:
Function compte(r As Range, s$, Optional tf As Boolean = True)
Application.Volatile 'selon le besoin…
Dim tmp&, oCel As Range
  For Each oCel In r
    tmp = (Not IsEmpty(oCel)) * (tmp + 1) * ((CStr(oCel.Value) = s) = tf)
    compte = compte - (tmp > compte)
  Next
End Function
Syntaxe :
Compter les valeurs égales à "3" consécutives :
Code:
=compte($C5:$AN5;3)
ou
Code:
=compte($C5:$AN5;3;1)
ou
Code:
=compte($C5:$AN5;3;VRAI)
Compter les valeurs différentes de "3" consécutives :
Code:
=compte($C5:$AN5;3;0)
ou
Code:
=compte($C5:$AN5;3;FAUX)
La fonction ne confond pas les cellules vides avec les cellules non vides contenant zéro.

Application dans le classeur joint. (Merci à phlaurent55 pour la version .xls du classeur, fort utile aux demeurés dans mon genre qui croient qu'on peut encore faire des choses avec Excel2003.)​
ROGER2327
#5343


Vendredi 27 Merdre 138 (Saints Courts et Longs, gendarmes - fête Suprême Quarte)
25 Prairial An CCXIX, 9,5157h - tanche
2011-W24-1T22:50:16Z
 

Pièces jointes

  • nombre de valeurs consécutives identiques.xls
    28 KB · Affichages: 242
Dernière édition:

ROGER2327

XLDnaute Barbatruc
Re : Distinguer le nombre de valeurs consécutives (série) dans un tableau de données

Suite…
Si on préfère une procédure à une formule, faisons court :
VB:
Sub test2()
Dim i&, r As Range, sDat(0 To 21, 0 To 5), x()
  x = Array(Array(3, 1, 0, 0, 3, 1), Array(1, 1, 1, 0, 0, 0))
  With [C5:AN24] '[B3:AM22] dans le fichier 111.xls de phlaurent55
     For Each r In .Rows
      For i = 0 To 5: sDat(r.Row - .Row, i) = compte(r, CStr(x(0)(i)), CBool(x(1)(i))): Next
    Next
    .Offset(0, .Columns.Count).Resize(, 1 + UBound(sDat, 2)).Value = sDat
  End With
End Sub

Private Function compte(r As Range, s$, Optional tf As Boolean = True)
Dim tmp&, oCel As Range
  For Each oCel In r.Cells
    tmp = (Not IsEmpty(oCel)) * (tmp + 1) * ((CStr(oCel.Value) = s) = tf)
    compte = compte - (tmp > compte)
  Next
End Function
ROGER2327
#5344


Samedi 28 Merdre 138 (Saint Raca, cagot - fête Suprême Quarte)
26 Prairial An CCXIX, 0,3301h - jasmin
2011-W24-2T00:47:32Z
 

Pièces jointes

  • nombre de valeurs consécutives identiques (2).xls
    26 KB · Affichages: 133

Solid_Pliskin

XLDnaute Nouveau
Re : Distinguer le nombre de valeurs consécutives (série) dans un tableau de données

Merci Roger ;)

J'ai opté pour ta solution avec la fonction personnalisée, car je me débrouille mieux pour l'intégrer dans mon fichier.

Ca fonctionne trés bien.

Merci a vous tous!
 

KenDev

XLDnaute Impliqué
Re : Distinguer le nombre de valeurs consécutives (série) dans un tableau de données

Bonjour le forum,

Ci joint le classeur sans vba. Une solution très simple avec par contre une feuille annexe contenant 6 tableaux... Juste au cas ou le non-vba deviendrait un impératif, les solutions précédentes sont bien meilleures.

J'avais une solution un peu pus élégante avec un seul tableau annexe pour obtenir les colonnes AN, AO, AP mais comme je n'ai pas l'équivalent pour les colonnes AQ, AR et AS est ce que ça vaut bien le coup ?

Sont utilisés SI et MAX. (Le premier choix avec un tableau pour 3 colonnes de résultats utilisait SI, MAX, NB.SI et GRANDE.VALEUR). Cordialement

KD
 

Pièces jointes

  • TestSolidTest2.xls.zip
    53.2 KB · Affichages: 171

ROGER2327

XLDnaute Barbatruc
Re : Distinguer le nombre de valeurs consécutives (série) dans un tableau de données

Bonjour à tous
Sur l'idée de KenDev, une autre réalisation.

(Compte tenu du poids de ces solutions, c'est juste pour le plaisir, car l'intérêt pratique reste à prouver.)​
ROGER2327
#5345


Samedi 28 Merdre 138 (Saint Raca, cagot - fête Suprême Quarte)
26 Prairial An CCXIX, 4,2799h - jasmin
2011-W24-2T10:16:18Z
 

Pièces jointes

  • nombre de valeurs consécutives identiques (3).zip
    74.2 KB · Affichages: 183

Ludoboss

XLDnaute Nouveau
Re : Distinguer le nombre de valeurs consécutives (série) dans un tableau de données

Bonjour Solid........, et bienvenue sur le forum

ton fichier en retour

à+
Philippe

Bonjour à tout le forum,

je déterre un peu la discussion car j'ai beau essayer de modifier la macro de phlaurent55 qui est parfaite, je n'y arrive pas. Je m'explique:
La macro du fichier 111 compte les récurrences identiques consécutives sur la même ligne, et je souhaiterais la modifier pour compter les récurrences identiques consécutives du tableau entier !! (de B3 à AM22 dans cet exemple, comme un scan de gauche à droite et de haut en bas)

Merci pour votre aide!
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re : Distinguer le nombre de valeurs consécutives (série) dans un tableau de données

Bonjour Ludoboss,

Un essai par formules matricielles (à valider par Ctrl+Maj+Entrée).

Formule matricielle dans la cellule AW8 (à copier/tirer jusqu'en AW10):
Code:
=MAX(FREQUENCE(SI(Tablo=$AU8;COLONNE(Tablo)+(LIGNE(Tablo)-LIGNE($B$4))*COLONNES(Tablo));SI(Tablo<>$AU8;COLONNE(Tablo)+(LIGNE(Tablo)-LIGNE($B$4))*COLONNES(Tablo))))
Formule matricielle dans la cellule AW12 (à copier/tirer jusqu'en AW14):
Code:
=MAX(FREQUENCE(SI(Tablo<>$AU12;COLONNE(Tablo)+(LIGNE(Tablo)-LIGNE($B$4))*COLONNES(Tablo)); SI(Tablo=$AU12;COLONNE(Tablo) +(LIGNE(Tablo)-LIGNE($B$4))*COLONNES(Tablo))))
nota: les deux formules ne diffèrent que par l'interversion des deux comparaisons = et <>
nota: la formule doit aussi fonctionner avec des valeurs texte au lieu de valeurs numériques

Pour choisir les valeurs à afficher, utiliser les listes de choix des cellules Q1 à S1.

Le tableau des valeurs a été nommé: Tablo

Formule matricielle: Elle doit être validée par la combinaison des touches Ctrl+Maj+Entrée au lieu de la seule touche Entrée comme une formule classique.
Si la validation matricielle est correcte, alors Excel entoure la formule d'accolades {=.......}.
Chaque fois que cette formule sera modifiée, la validation devra se faire par Ctrl+Maj+Entrée. Les accolades apparaissent à la validation et ne doivent pas être saisies au clavier.
 

Pièces jointes

  • TestSolid sur tableau entier v1.xlsx
    14.8 KB · Affichages: 111
Dernière édition:

Discussions similaires

Réponses
4
Affichages
178

Statistiques des forums

Discussions
312 358
Messages
2 087 584
Membres
103 600
dernier inscrit
Tora61