XL 2016 Occurrences maximum

Joblender974

XLDnaute Nouveau
Bonjour à tous!!!

Je suis bloqué depuis un bon moment, je ne parviens pas à trouver une solution à mon "problème" qui n'en sera sûrement pas un pour vous.

J'aimerai qu'Excel me donne la plus grande série d'une plage de donnée, mais que pour une valeur donnée, par exemple:

X
X
2
X
X
X
X
2
2
2
2
2
1
X
J'aimerai qu'Excel me donne la plus grande série de X unequement dans cette plage (même si la série de 2 est plus grande), donc que la cellule affiche 4.
Est-ce possible?

Merci beaucoup.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Avec une fonction perso dans un module standard :
VB:
Option Explicit

Function MaxContigus(ByVal R, ByVal V) As Double
   Dim T(), L As Long, Score As Long
   If TypeOf R Is Range Then T = R.Value Else T = R
   If TypeOf V Is Range Then V = V.Value
   For L = 1 To UBound(T, 1)
      If T(L, 1) = V Then
         Score = Score + 1
      Else
         If Score > MaxContigus Then MaxContigus = Score
         Score = 0
         End If
       Next L
   If Score > MaxContigus Then MaxContigus = Score
   End Function
En une cellule :
Code:
=MaxContigus($A$1:$A$40;"X")
 

patricktoulon

XLDnaute Barbatruc
Bonjour à tous
une autre méthode et version VBA/Formule
VB:
Function MaxOccurcontigue(p, b)
    Dim t, t2, I&, Q&
    t = p.Value
    t2 = Application.Transpose(t)
    For I = 1 To UBound(t)
        t2(I) = 0: If t(I, 1) = b Then Q = Q + 1: t2(I) = Q Else Q = 0: t2(I) = Q
    Next
    MaxOccurcontigue = WorksheetFunction.Large(t2, 1)
End Function

formule
=MaxOccurcontigue(A1:A26;"x")

par vba
VB:
Sub test()
    Set plage = Feuil1.Range("A1", Feuil1.Cells(Rows.Count, "A").End(xlUp))
    MsgBox MaxOccurcontigue(plage, "x")
End Sub
 
Dernière édition:

Joblender974

XLDnaute Nouveau
Bonjour.
Avec une fonction perso dans un module standard :
VB:
Option Explicit

Function MaxContigus(ByVal R, ByVal V) As Double
   Dim T(), L As Long, Score As Long
   If TypeOf R Is Range Then T = R.Value Else T = R
   If TypeOf V Is Range Then V = V.Value
   For L = 1 To UBound(T, 1)
      If T(L, 1) = V Then
         Score = Score + 1
      Else
         If Score > MaxContigus Then MaxContigus = Score
         Score = 0
         End If
       Next L
   If Score > MaxContigus Then MaxContigus = Score
   End Function
En une cellule :
Code:
=MaxContigus($A$1:$A$40;"X")
Merci beaucoup!! Le seul problème est que je n'ai jamais utilisé VBA. Je ne sais pas comment entrer tout ça. Je vais me renseigner.
Merci beaucoup en tout cas.
 

Joblender974

XLDnaute Nouveau
Bonjour à tous
une autre méthode et version VBA/Formule
VB:
Function MaxOccurcontigue(p, b)
    Dim t, t2, I&, Q&
    t = p.Value
    t2 = Application.Transpose(t)
    For I = 1 To UBound(t)
        t2(I) = 0: If t(I, 1) = b Then Q = Q + 1: t2(I) = Q Else Q = 0: t2(I) = Q
    Next
    MaxOccurcontigue = WorksheetFunction.Large(t2, 1)
End Function

formule
=MaxOccurcontigue(A1:A26;"x")

par vba
VB:
Sub test()
    Set plage = Feuil1.Range("A1", Feuil1.Cells(Rows.Count, "A").End(xlUp))
    MsgBox MaxOccurcontigue(plage, "x")
End Sub
Bonjour, merci beaucoup. Comme plus haut, je ne comprends pas du tout VBA, je ne sais pas comment utiliser, je vais me renseigner.
Merci beaucoup.
 

Joblender974

XLDnaute Nouveau
Bonjour.
Avec une fonction perso dans un module standard :
VB:
Option Explicit

Function MaxContigus(ByVal R, ByVal V) As Double
   Dim T(), L As Long, Score As Long
   If TypeOf R Is Range Then T = R.Value Else T = R
   If TypeOf V Is Range Then V = V.Value
   For L = 1 To UBound(T, 1)
      If T(L, 1) = V Then
         Score = Score + 1
      Else
         If Score > MaxContigus Then MaxContigus = Score
         Score = 0
         End If
       Next L
   If Score > MaxContigus Then MaxContigus = Score
   End Function
En une cellule :
Code:
=MaxContigus($A$1:$A$40;"X")
En fait, ça m'affiche #NOM? . C'est sûrement moi qui ne comprend rien. Désolé .😩
 

Joblender974

XLDnaute Nouveau
Waou, c'est magique. Merci beaucoup, ça fonctionne.

Je peux pousser le bouchon un peu plus loin svp?

J'aimerais trois informations affichées en fait.

Par exemple: J'aimerai qu'Excel me donne aussi le nombre de fois où cette occurrence max est présente, dans cet exemple, l'occurrence max de "X" est 3, et elle apparait 2 fois.

Et si possible une cellule qui me donne la dernière date de la première occurrence max.

Voici un exemple:

Occurrence maxNbr occurrence maxDernière date de la première occurence
3201/08/2008 20:30
08/04/2007 20:00X
08/12/2007 21:00X
01/08/2008 20:30X
01/08/2008 21:002
01/08/2009 22:00X
01/08/2010 23:30X
09/02/2011 18:00X
01/09/2012 16:002
01/09/2013 18:002
10/06/2014 19:002

Tout cela pour simplement dire à la fin si on prend l'exemple de ce tableau, "Le record d'apparition de X d'affilée est de 3, il a été atteint le 01/08/2008 à 20H30, ce record a été atteint 2 fois depuis cette date."

Je serais le plus heureux du monde si c'était possible de faire cela.
Je vous remercie d'avance.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Essayez comme ça :
VB:
Function MaxContigus(ByVal R, ByVal V, ByVal K) As Double
   Dim T(), L As Long, Score As Long, TMax(1 To 3) As Long
   If TypeOf R Is Range Then T = R.Value Else T = R
   If TypeOf V Is Range Then V = V.Value
   If TypeOf K Is Range Then K = K.Value
   L = 1
   Do:
      Do While T(L, 1) <> V
         L = L + 1: If L > UBound(T, 1) Then Exit Function
         Loop
      Score = 0
      Do: Score = Score + 1
         L = L + 1: If L > UBound(T, 1) Then Exit Do
         Loop Until T(L, 1) <> V
      Select Case TMax(1)
         Case Is < Score: TMax(1) = Score: TMax(2) = 1: TMax(3) = L - 1
         Case Is = Score: TMax(2) = TMax(2) + 1
         End Select
      MaxContigus = TMax(K)
      Loop Until L > UBound(T, 1)
   End Function
Pour le K=3 vous devez utiliser un DECALER($A$1;MaxContigus($D$2:$D$40;"X";3);0)
 

Joblender974

XLDnaute Nouveau
VB:
Code:
Function MaxContigus(ByVal R, ByVal V, ByVal K) As Double
   Dim T(), L As Long, Score As Long, TMax(1 To 3) As Long
   If TypeOf R Is Range Then T = R.Value Else T = R
   If TypeOf V Is Range Then V = V.Value
   If TypeOf K Is Range Then K = K.Value
   L = 1
   Do:
      Do While T(L, 1) <> V
         L = L + 1: If L > UBound(T, 1) Then Exit Function
         Loop
      Score = 0
      Do: Score = Score + 1
         L = L + 1: If L > UBound(T, 1) Then Exit Do
         Loop Until T(L, 1) <> V
      Select Case TMax(1)
         Case Is < Score: TMax(1) = Score: TMax(2) = 1: TMax(3) = L - 1
         Case Is = Score: TMax(2) = TMax(2) + 1
         End Select
      MaxContigus = TMax(K)
      Loop Until L > UBound(T, 1)
   End Function
Je dois remplacer l'ancien par celui la? Désolé, je suis perdu.
 

Discussions similaires

Réponses
2
Affichages
140

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 086
Messages
2 085 197
Membres
102 814
dernier inscrit
JLGalley