Résolu XL 2010 Compter le nombre de valeurs consecutives

e1701086

XLDnaute Nouveau
Bonjour à tous,

Je fais appel à vous car je bloque depuis quelques jours sur une requête. Je voudrais calculés le nombre de jours qu'un achat a été réalisé consécutivement. Pour cela, j'ai recodé la variable Achat en 0/1. ce que je souhaiterais c'est faire la somme de tous les 1 tant qu'il n'y a pas de 0 apparaissant. Je voudrais grouper cela par acteur. Je ne sais pas si cela a été clair ou pas. Ainsi, je vous propose un fichier Excel avec mon fichier de base et les résultats souhaités pour que vous puissiez mieux comprendre.


Merci d'avance pour votre retour.
Cordialement.
 
Ce fil a été résolu! Aller à la solution…

Fichiers joints

laurent3372

XLDnaute Impliqué
Supporter XLD
Bonjour,

Pourquoi est-ce que le Yves du 11/12/2018 n'est pas intégré au premier résultat pour Yves qui deviendrait:
Yves du 28/11/2018 au 11/12/2018 ?
Il n'y a pas eu de Yves avec la valeur 0 entre-temps ?
 

e1701086

XLDnaute Nouveau
Bonjour,
Excusez-moi, ceci était une erreur. Je vous joins le nouveau fichier. Ceci dit, Avez-vous une idée du comment je pourrais résoudre mon problème ?
 

Fichiers joints

job75

XLDnaute Barbatruc
Bonjour e17010086, laurent3372, JHA,

Voyez le fichier joint et cette macro dans Module1 (Alt+F11) :
VB:
Sub Resultat()
Dim F As Worksheet, d As Object, tablo, resu(), i&, x$, n&, lig&
Set F = Tabelle1 'CodeName de la feuille
Set d = CreateObject("Scripting.Dictionary")
If F.FilterMode Then F.ShowAllData 'si la feuille est filtrée
With F.[A1].CurrentRegion
    .Sort .Columns(2), xlAscending, Header:=xlYes 'tri croissant sur les dates
    tablo = .Resize(, 3) 'matrice, plus rapide
End With
ReDim resu(1 To UBound(tablo), 1 To 4)
For i = 2 To UBound(tablo)
    x = LCase(Trim(tablo(i, 1))) 'la casse est ignorée, espaces superflus en A11 et sur Pierre et Jacques
    If x <> "" Then
        If tablo(i, 3) = 1 Then
            If Not d.exists(x) Then
                n = n + 1
                d(x) = n 'mémorise la ligne
                resu(n, 1) = tablo(i, 1)
                resu(n, 2) = tablo(i, 2)
            End If
            lig = d(x) 'restitue la ligne
            resu(lig, 3) = tablo(i, 2)
            resu(lig, 4) = resu(lig, 4) + 1 'comptage
        Else
            If d.exists(x) Then d.Remove x 'retire l'item du Dictionary
        End If
    End If
Next
'---restitution---
With F.[K8] '1ère cellule de destination, à adapter
    If n Then .Resize(n, 4) = resu
    .Offset(n).Resize(F.Rows.Count - n - .Row + 1, 4).ClearContents 'RAZ en dessous
End With
End Sub
Elle est très rapide car elle utilise des tableaux VBA et le Dictionary.

A+
 
Ce message a été identifié comme étant une solution!

Fichiers joints

e1701086

XLDnaute Nouveau
Bonjour JHA,

Merci pour votre retour.
Suite à votre nouveau fichier, j'ai quelques questions.
1. A quoi sert "*" dans les formules ? A multiplier ?
2. Pourquoi lorsque je change d'acteur, le filtre 0 sur le Nbre de validation ne se maintient pas ?
2. Mon rendu final doit être un histogramme avec en abscisse tous les acteurs, en ordonnées le Nbre de validation le tout en filtrant sur une certaines périodes. Comment puis-je faire cela ?

Merci encore pour votre rendu qui me sera très utile.
 

e1701086

XLDnaute Nouveau
Bonjour Job75,

C'est parfait, merci beaucoup. C'est exactement ce que je souhaitais.
J'ai quelques lacune en VBA, donc merci beaucoup, vous m'enlevez une épine du pied.

Cordialement.
 

JHA

XLDnaute Barbatruc
Bonjour à tous,

1. oui le signe "*" sert à multiplier les conditions dans la formule.

2. c'est un filtre et il ne se remet pas à jour après changement d'acteur, il faut donc filtrer de nouveau.

2bis. Comme signalé, c'est une autre approche et je ne savais pas qu'il y avait des graphiques à mettre en place.

Job75 ;) que je salue et félicite pour sa version VBA a répondu complètement à ta demande, c'est l'essentiel.

JHA
 
Ce message a été identifié comme étant une solution!

e1701086

XLDnaute Nouveau
Bonjour,

J'ai une autre question. A partir du code VBA fourni par @job75 , Comment cela serait possible pour que dans mon tableau de base, si je filtre sur 2020, avoir seulement le nombre de valeurs consécutive sur cette année dans mon tableau de résultat ? Par consequent le compteur commencerait à zero pour la premiere date de l'année 2020, par exemple ?
 

job75

XLDnaute Barbatruc
Bonjour,

A priori sur le fichier du post #5 on peut filtrer les années de 3 manières : sur la colonne L, sur la colonne M ou sur les 2 colonnes.

Pour filtrer sur une ou 2 colonnes utilisez le filtre automatique, manuellement ou par macro.

A+
 

Créez un compte ou connectez vous pour répondre

Vous devez être membre afin de pouvoir répondre ici

Créer un compte

Créez un compte Excel Downloads. C'est simple!

Connexion

Vous avez déjà un compte? Connectez vous ici.

Haut Bas