XL 2016 (RESOLUT) Tonnelets blancs (un vrai casse tête)

Lolote83

XLDnaute Accro
Bonjour à tous,

Selon la base jointe, je souhaite connaitre par mois :
- Le nombre de client(s) différent(s) dans le mois
- Le nombre de client(s) ayant déposé (un ou des tonnelets blanc) dans le mois

J'ai tout essayé mais sans succès.
- Des sommeprod
- Des somme.si.ens
- Des décaler
- Des nb.si
- Des frequences (sommeprod(1/NB.SI(plage;plage))*1)
- Des macros etc etc etc ....

Le fichier joint est je pense beaucoup plus explicatif.
Merci à tous ceux et celles qui voudront bien me donner un coup de main (Formulistes et VBistes)
N'hésitez pas à revenir vers moi pour de plus amples renseignements
Cordialement
Lolote83
 

Fichiers joints

Lolote83

XLDnaute Accro
Salut Modeste,
Merci pour cette réponse, mais j'ai oublié de préciser que j'avais essayé aussi les TCD, mais sans succès non plus. Ce n'est pas mon fort.
@+ Lolote83
 

Robert

XLDnaute Barbatruc
Bonjour le fil, bonjour le forum,

Toujours aussi nul en formules et TCD je te propose la solution VBA ci-dessous :

VB:
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim L As Byte 'déclare la variable L (incrément)
Dim TT1 As Variant 'déclare la variable TT1 (Tableau Temporaire 1)
Dim TT2 As Variant 'déclare la variable TT2 (Tableau Temporaire 2)
Dim NB As Integer 'décalre la variable NB (NomBre)
Dim TEST As Boolean 'déclare la variable TEST

Set O = Worksheets("BDD") 'définit l'onglet O
TV = O.Range("B2").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
    D(TV(I, 1)) = "" 'alimente le dictionnaire D avec les données en colonne 1 du tableau des valeurs TV
Next I 'prochaine ligne de la boucle
TT1 = D.keys 'récupère dans le tableau temporaire TT1 la liste des élémets du dictionnaire D sans doublon
L = 1 'initialise la variable L
For J = 0 To UBound(TT1) 'boucle 1 : sur tous les éléments J du tableau temporaire TT1
    NB = 0 'initialise le nombre NB
    Set D = CreateObject("Scripting.Dictionary") 'redéfinit le dictionnaire D
    For I = 2 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
        If TV(I, 1) = TT1(J) Then 'condition : si la donnée ligne I colonne 1 de TV est égale à l'élément J de TT1
            D(TV(I, 3)) = "" 'alimente le dictionnaire D avec les données de la colonne 3 de TV
        End If 'fin de la condition
    Next I 'prochaine ligne de la boucle 2
    O.Cells(28 + L, "H").Value = D.Count 'renvoie dans la cellule ligne 28 + L colonne H le nombre d'éléments du dictionnaire D
    TT2 = D.keys 'alimente le tableau temporaire TT2 avec la liste des éléments du dictionanire D sans doublons
    For K = 0 To UBound(TT2) 'boucle 3 : sur tous les éléments K du dictionnaire TT2
        For I = 2 To UBound(TV, 1) 'boucle 4 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
            TEST = False 'initialise la variable TEST
            'condition : si la données en colonne 3 de TV correspond à l'élément K de TT2 et si la donnée en colonne 1 de TV correspond à lélément J de TT1
            If TV(I, 3) = TT2(K) And TV(I, 1) = TT1(J) Then
                For M = 6 To 8 'boucle 5 : sur les colonnes 6 à 8 (=G à H)
                    If TV(I, M) <> "" Then TEST = True: Exit For 'si la donnée ligne I colonne M n'est pas vide, définit la variable TEST, sort de la boucle 5
                Next 'prochaine colonne de la boucle 5
            End If 'fin de la condition
            If TEST = True Then NB = NB + 1: Exit For 'si TEST est [Vrai], incrémente NB, sort de la boucle 4
        Next I 'prochaine ligne de la boucle 4
    Next K 'prochain élément de la boucle 3
    O.Cells(28 + L, "I").Value = IIf(NB = 0, "", NB) 'renvoie NB dans la cellule ligne 28 + L colonne I
    L = L + 1 'incrémente L
Next J 'prochain élément de la boucle 1
End Sub
 

Lolote83

XLDnaute Accro
Salut Robert, Modeste,
Merci Robert pour cette macro que je vais de ce pas décortiquer bien que tu ais largement commenté.
Le résultat à l'air satisfaisant (voire même impeccable).
Malgré tous mes efforts, je crois que je n'aurais pas réussi à faire mieux.
1000 mercis et je reviens vers vous une fois le tout étudié
Cordialement
Lolote83
 

Jocelyn

XLDnaute Barbatruc
Bonjour le Forum,
Bonjour Lolote83, Modeste geedee, Robert,

Rien de mieux qu'une macro mais pour le fun une solution par formule matricielle voir la plage H29:I33 si j'ai bien compris la demande

Cordialement
 

Fichiers joints

Lolote83

XLDnaute Accro
Salut Jocelyn, les autres
Merci pour cette solution par formule.
Je pensais bien qu'il y avait une solution via formule matricielle mais pour trouver celle-là, il faut se lever tôt.
Bravo à vous tous.
@+ Lolote83
 

Discussions similaires


Haut Bas