Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Compter le nombre de "X" qui se suivent...

Guyse du 22

XLDnaute Nouveau
Bonjour à tous,

Cela fait plusieurs semaines que je planche sur le sujet sans trouver la solution. Je pense que le problème réside dans les termes que j'utilise. En effet, je parlait dans un précédent post d'écarts et de séries. N'ayant eu aucune réponse (hormis excel-lent). Je repose mon problème avec d'autre termes. En effet je souhaite trouver :
- le nombre de "A" maximum qui se suivent dans la colonne 1
- le nombre minimal de "A" qui se suivent dans la colonne 1
- le nombre de fois maximum qui se suivent sans la présence de "A"
- le nombre de fois minimum qui se suivent sans la présence de "A"

Je vous joint un fichier .xls d'exemple pour mieux comprendre.

Je souhaite créer les formules qui me permettent d'obtenir ces résultats en fin de tableau.

L'objectif est de remplacer les valeurs "en gris et italique" que j'ai taper à la main. Je dupliquerai ensuite ces formules dans les autres colonnes.

Je souhaiterais obtenir les résultats par l'intermédiaire de formules mais pas de macros sauf si il n'y a pas le choix (car je ne connais pas du tout les macros).

Comptant sur votre participation.

Cordialement
 

Pièces jointes

  • Test ecarts et series.xls
    21.5 KB · Affichages: 136
  • Test ecarts et series.xls
    21.5 KB · Affichages: 139
  • Test ecarts et series.xls
    21.5 KB · Affichages: 144

CISCO

XLDnaute Barbatruc
Re : Compter le nombre de "X" qui se suivent...

Bonsoir

Encore une autre possibilité, avec seulement deux colonnes en plus

@ plus
 

Pièces jointes

  • Test ecarts et series(1).xls
    24 KB · Affichages: 96
  • Test ecarts et series(1).xls
    24 KB · Affichages: 102
  • Test ecarts et series(1).xls
    24 KB · Affichages: 97

tbft

XLDnaute Accro
Re : Compter le nombre de "X" qui se suivent...

voici une petite explication

Code:
Option Explicit 'pour forcer la déclaration de variable
Option Base 1 ' pour dire que les tableaux commence à 1 et pas à zero

Function nb_maxi(valeur As String, tableau_recherche) As Integer
'déclaration des variables
Dim i As Integer, j As Integer, nb As Integer, maxi As Integer
'i : un pointeur pour parcourir le tableau "tableau_recherche"
'j : variable intermédiaire elle représente le nombre maximum trouvé jusqu'à i
'nb : représente le nombre de ligne du tableau "tableau_recherche"
'maxi : nombre de rencontre maximale

  ' repérage du nombre de ligne
  nb = UBound(tableau_recherche.Value, 1)
  'mise à zéro des maximetres
  j = 0
  maxi=0  ' un oubli dans le fichier mais pas grave car la variable est automatiquement mis à 0 quand elle est déclarer en integer

  'boucle de parcour du tableau
  For i = 1 To nb
    ' test : c'est sur cette ligne que l'on fait ce que l'on veut
    ' dans cette fonction je recherche le nombre maxi de fois où "valeur" est à la suite
    If tableau_recherche(i, 1).Value = valeur Then
      ' quand le test si dessus est bon on incrémente la valeur intermédiaire "j"
      j = j + 1
      If j > maxi Then maxi = j ' on test si la valeur intermédiaire "j" est supérieur à la "maxi" si c'est le cas alors on met la valeur de "j" dans "maxi"
    Else
      ' si le test n'est pas bon alors on remet la valeur "j" à 0
      j = 0
    End If
  Next i
  ' on renvoi la variable "maxi"
  nb_maxi = maxi
End Function


Peux tu me dire ce que tu en pense?
 

job75

XLDnaute Barbatruc
Re : Compter le nombre de "X" qui se suivent...

Re, bonjour CISCO, tbft,

Voici une solution VBA.

Je pensais au début qu'il fallait faire pour les autres lettres séparément comme pour la lettre A... J'ai compris après...

Le principe des macros : le Filtre Automatique, puis on étudie les références des zones filtrées. Finalement, ce n'est pas trop compliqué...

Les macros et le fichier joint:

Code:
Sub CompteZonesA()Sub CompteZonesA()
Call Calcul("A", "avec A")
End Sub

Sub CompteZonesSansA()
Call Calcul("<>A", "sans A")
End Sub

Sub Calcul(crit$, txt$)
Dim reference$, n As Long, mini As Long, maxi As Long

ActiveSheet.AutoFilterMode = False
Range("B1").AutoFilter Field:=2, Criteria1:=crit
reference = Range("B2:B" & Range("B65536").End(xlUp).Row).SpecialCells(xlVisible).Address
Range("B1").AutoFilter

n = UBound(Split(reference, ","))
mini = 9 ^ 9
maxi = 0

For i = 0 To n
mini = Application.Min(mini, Range(Split(reference, ",")(i)).Cells.Count)
maxi = Application.Max(maxi, Range(Split(reference, ",")(i)).Cells.Count)
Next

MsgBox Chr(10) & "Nombre de zones  " & txt & " : " & n + 1 & Chr(10) & _
Chr(10) & "Nombre minimum par zone : " & mini & Chr(10) & _
Chr(10) & "Nombre maximum par zone : " & maxi & "   " & Chr(10)


End Sub

Edit : une petite erreur corrigée...

A+
 

Pièces jointes

  • Guyse.zip
    13.3 KB · Affichages: 46
  • Guyse.zip
    13.3 KB · Affichages: 44
  • Guyse.zip
    13.3 KB · Affichages: 47
Dernière édition:

Guyse du 22

XLDnaute Nouveau
Re : Compter le nombre de "X" qui se suivent...

Re, bonjour CISCO, tbft,

Voici une solution VBA.

Je pensais au début qu'il fallait faire pour les autres lettres séparément comme pour la lettre A... J'ai compris après...

A+

Non non, tu avais bien compris. Ce qui est fait avec A sera à faire pour toutes les autres lettres. A était un exemple.

Quoi qu'il en soit, je garde le code source que tu as créer avec les explications que tu as donné. Cela va me servir plus tard dans mon tableur.
 

tbft

XLDnaute Accro
Re : Compter le nombre de "X" qui se suivent...

oui
avec vba tu peux créer tes propres fonctions...
tu peux même faire des fonctions qui te renvoyer des tableaux (vive les matrice)
cela permet d'obtenir plusieurs résultats avec la même fonction... gain de temps de calcul
 

CISCO

XLDnaute Barbatruc
Re : Compter le nombre de "X" qui se suivent...

Rebonsoir

Et hop, pour le fun, une version avec une seule colonne intermédiaire

@ plus

P.S : La prochaine fois, j'essaye sans formule ni VBA
 

Pièces jointes

  • Test ecarts et series(1)ter.xls
    24.5 KB · Affichages: 98
  • Test ecarts et series(1)ter.xls
    24.5 KB · Affichages: 98
  • Test ecarts et series(1)ter.xls
    24.5 KB · Affichages: 102
Dernière édition:

wilfried_42

XLDnaute Barbatruc
Re : Compter le nombre de "X" qui se suivent...

Bonjour à tous

le sujet m'intéressant, j'ai bossé dessus ce matin, voici ton fichier en retour avec une fonction personnalisée qui retourne une matrice de valeurs. Cette matrice donne de nombre de fois que cette valeur se suit.
c'est plus facile avec le fichier

voici un 2ème fichier sur le même principe mais travaillant sur une plage de plusieurs colonnes et en stipulant que les colonnes suivantes sont les suites des colonnes précédentes
 

Pièces jointes

  • ecarts et series.xls
    40.5 KB · Affichages: 90
  • ecarts et series2.xls
    54.5 KB · Affichages: 85
Dernière édition:

Guyse du 22

XLDnaute Nouveau
Re : Compter le nombre de "X" qui se suivent...

oui
avec vba tu peux créer tes propres fonctions...
tu peux même faire des fonctions qui te renvoyer des tableaux (vive les matrice)
cela permet d'obtenir plusieurs résultats avec la même fonction... gain de temps de calcul

Bonjour tbft,

Peux tu me décrire et commenter la méthode pour créer une des 2 formules que tum'a faites ?
 

Guyse du 22

XLDnaute Nouveau
Re : Compter le nombre de "X" qui se suivent...

Bonjour à tous
voici ton fichier en retour avec une fonction personnalisée qui retourne une matrice de valeurs. Cette matrice donne de nombre de fois que cette valeur se suit.

Ok ton principe de fonction personnalisée m'intéresse, c'est une solution que tbft m'a proposé mais avec une fonction différente. Peux-tu me détaillé le code pour créer la fonction gw_freq dans VBA ?
 

Guyse du 22

XLDnaute Nouveau
Re : Compter le nombre de "X" qui se suivent...

Bonjour à tous
voici un 2ème fichier sur le même principe mais travaillant sur une plage de plusieurs colonnes et en stipulant que les colonnes suivantes sont les suites des colonnes précédentes

Super, tu anticipes mes demande. En fait, une fois que j'ai le descriptif de la formule personnalisée tel que ton 1er fichier. Je souhaitais faire évoluer ma demande vers :

Recherche les "A" dans 6 colonnes en même temps (la plage ne serait plus Col1 mais de Col1 à Col6. Pour info "A" ne peut peut être présent qu'une seul fois par ligne (pour ces 6 colonnes). Ma question est donc : peut on utiliser les formules de ton 1er fichier en élargissant la plage à 6 colonnes ?

Cordialement.
 

tbft

XLDnaute Accro
Re : Compter le nombre de "X" qui se suivent...

Bonjour tbft,

Peux tu me décrire et commenter la méthode pour créer une des 2 formules que tum'a faites ?

bonjour
hier soir en voulant ajouter un message j'ai merdé et j'ai modifier un vieu message...

peux tu me dire si les explications du message #18 te conviennes ou me dire la où je suis pas claire
 

wilfried_42

XLDnaute Barbatruc
Re : Compter le nombre de "X" qui se suivent...

re:

la fonction personnalisée est prévue de fonctionner comme tu as pu le voir dans le deuxième fichier, sur tout type de plage en tenant compte que la colonne suivante est la suite de la colonne précédente. sinon il faudra scinder tes plages
Normalement, mais je n'ai pas testé, elle fonctionne avec tout type de valeur(numérique, Alphabétique ou binaire)
Elle est faite pour fonctionner avec =, <>, >, <, >=, <=.
elle renvoie une matrice donc peut être utilisée dans n'importe quelle formule matricielle.
exemple si c'est du numérique : classement des valeurs avec petite.valeur
ou encore le total des valeurs : =somme(..............)
Voici le code expliqué
Code:
Public Function Gw_Freq(MaPlage As Range, ByVal Mavaleur As Variant, Optional signe As String = "=") As Variant
    Dim tablo1() As Boolean ' définir un tableau qui pred Vrai ou Faux selon le resultat du test
    Dim tablo2() As Long ' Récupère pour chacune des fréquences le nombre de valeurs qui se suivent
    Dim i As Long, j As Long, k As Long, total As Long ' diférents pointeur pour boucles
    Dim lig As Long, col As Long ' le suivi des lignes et colonnes
    Application.Volatile
    Dim cel As Range
    i = -1
    For col = 1 To MaPlage.Columns.Count ' Boucle sur les colonnes
        For lig = 1 To MaPlage.Rows.Count ' Boucle sur les lignes
            Set cel = MaPlage(1, 1).Offset(lig - 1, col - 1) ' recupération de la cellule
            i = i + 1 ' evolution de la table
            ReDim Preserve tablo1(i) ' Agrandissement de la table
            tablo1(i) = False ' initialiser à faux
            Select Case signe ' Gestion du signe, la valeur de la table passe à Vrai si condition ok
                Case "="
                    If cel.Value = Mavaleur Then tablo1(i) = True
                Case ">"
                    If cel.Value > Mavaleur Then tablo1(i) = True
                Case "<"
                    If cel.Value < Mavaleur Then tablo1(i) = True
                Case "<>", "><"
                    If cel.Value <> Mavaleur Then tablo1(i) = True
                Case ">=", "=>"
                    If cel.Value >= Mavaleur Then tablo1(i) = True
                Case "<=", "=<"
                    If cel.Value <= Mavaleur Then tablo1(i) = True
            End Select
        Next lig ' Prochaine ligne
    Next col ' Prochaine colonne
    total = 0: k = -1 ' Initialisation des pointeurs
    For j = 0 To i ' On relis la table en mémoire (les vrais et les faux)
        If tablo1(j) = False Then ' Si c'est faux, on va charger la table de resultat
            If total > 0 Then ' Mais seulement s'il y a une valeur dans le total
                k = k + 1 ' pointeur table
                ReDim Preserve tablo2(k) ' redimensionnement de la table
                tablo2(k) = total ' mise en place de la valeur
                total = 0 ' remise à zero
            End If
        Else ' la valeur est vrai, j'incrémente le total de 1
            total = total + 1
        End If
    Next
    If total > 0 Then ' je teste si le total est > 1 dans le cas ou la colonne se termine par une valeur cherchée
        k = k + 1 ' incremente la table
        ReDim Preserve tablo2(k) ' agrandissement de la table
        tablo2(k) = total ' mise en place de la valeur
        total = 0 ' remise à zéro, pas vraiment utile ici, mais c'est un tic de ma part
    End If
    Gw_Freq = tablo2 ' transfert de la table dans la fonction pour utilisation
End Function
utilisation :
elle ne peut s'utiliser comme cela, renvoyant une matrice, elle doit sutiliser avec d'autres fonctions
Code:
=gw_freq(Maplage;MaValeur;[Signe])
Maplage : la plage sur laquelle j'effectue les recherches
Mavaleur : Une valeur qui peut être éventuellement une référence de cellule
Signe : Optionnel si c'est l'utilisation du signe =
Regarde les formules de B25 à E25, tu verras une évolution des plages, 1 puis 2 puis 3 puis 4 colonnes
 
Dernière édition:

Guyse du 22

XLDnaute Nouveau
Re : Compter le nombre de "X" qui se suivent...

bonjour
peux tu me dire si les explications du message #18 te conviennes ou me dire la où je suis pas claire

Bonjour,

Je pense que tu veux parler du message #17. J'ai passer pas mal de temps ce matin sur ce sujet. C'est compliqué pour moi mais oui, les explication me conviennent.

J'aurais, sans vouloir abuser de ta compétences, 2 demandes additionnelles à te formuler.
1ère demande - Comment modifier tes formules VBA pour que des cases vides (dans la colonne) soit ignorées. Je m'explique :
ligne 1 : A
ligne 2 : "vide"
ligne 3 : A
ligne 4 : B

Alors je voudrais que ta formule nb_maxi ignore l'existance de la cellule vide pour que le résultat de l'exemple ci dessus soit pour A : 2 (et non pas 1 comme la formule le donne actuellement). De même pour nb_maxi_sans

2ème demande - Comment modifier tes formules VBA pour la plage s'étende à 5 colonnes et que la recherche de A se fasse par lignes (Pour info chaque lettre ne peut être présente qu'une fois par ligne, jamais 2 A sur la ligne 1). Je m'explique :
ligne 1 :| A | B | C | D | E |
ligne 2 :| C | C | D | A | F |
ligne 3 :| vide | vide | vide | vide | vide |
ligne 4 :| J | K | A | F | E |
ligne 5 :| G | B | C | D | E |

Alors je voudrais que ta formule nb_maxi recherche A par ligne et sur les 5 colonne pour que le résultat de l'exemple ci dessus soit pour A : 3 (ligne 1, ligne 2 et ligne 4 car ligne 3 vide ignorée). Toujours dans l'exemple ci dessus, ta formule nb_maxi_sans pour A donnerait le résultat suivant : 1 (ligne 5).

Comme tu le vois, cela se corse un peu. Je serais super content si tu trouvais une solution. En effet, avec une solution pour ce problème, j'en aurais fini avec ma gestion d'Ecarts et de Séries. Cependant, j'ai d'autres sujet à aborder très prochainement.

J'attends de tes nouvelles pour mes 2 demandes additionnelles.

Merci encore.
 

Discussions similaires

Réponses
9
Affichages
146
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…