Calcul nombre ticket

  • Initiateur de la discussion Initiateur de la discussion Roll
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Roll

XLDnaute Occasionnel
Bonsoir à toutes et tous,

je dois calculer le nombre de ticket pour chaque caissier, tout en sachant q'un même numéro de ticket peut se retrouver pour deux caissiers différrents.
Je joins un fichier pour plus de détail.
Merci
 

Pièces jointes

Re : Calcul nombre ticket

Bonjour @ tous,
Salut Chère Mame,
@ Roll,
en N2,
Code:
=NB(1/FREQUENCE(SI((A$2:A$135=L2)*(B$2:B$135=M2);EQUIV(D$2:D$135;D$2:D$135;0));LIGNE(INDIRECT("1:"&LIGNES(D$2:D$135)))))
@ valider par Ctrl+Maj+Entree
@ tirer vers le bas
@ micalement


Edit 1 :
Pour la colonne E,
tu peux la faire comme suite et faire la calcul par la formule de Brigitte,

en E2,
Code:
=SI(SOMMEPROD((A$2:A2=A2)*(B$2:B2=B2)*(D$2:D2=D2))=1;1;"")

ou bien
Code:
=N(SOMMEPROD((A$2:A2=A2)*(B$2:B2=B2)*(D$2:D2=D2))=1)
Qui donne 0 @ la place de Vide ""

Formules @ tirer vers le bas

Edit 2 :
sur le fichier fournis on peut faire les calcules soit @ base d'Empl ou de Nom, car ça change rien sur le fichier mais peut être sur ton fichier réel peut faire une différence remarquable
 
Dernière édition:
Re : Calcul nombre ticket

Bonjour,

la formule qui m'a été proposée focntionne très bien mais, transposée dans le fichier original (qui contient actuellement 12.000 lignes et peut aller jusque 40.000), cela rame un peu beaucoup.
J'ai tiré la formule vers le bas et le résultat s'est affiché 5 minutes plus tard; j'ai donc fait un copier-coller des valeurs pour éviter un plantage.

Existe-t-il une méthode plus rapide pour effectuer les calculs décrits dans le fichier ci-joint.

Merci et bon dimanche.
 

Pièces jointes

Re : Calcul nombre ticket

Bonjour Roll, Brigitte 🙂 R@chid 🙂

Pour éviter les formules, une solution VBA (Alt+F11) :

Code:
Sub Resultat()
Dim tablo, n&, d1 As Object, d2 As Object, i&, j&, lig&, R(65000, 2)
tablo = Range("A2:D" & [B65536].End(xlUp).Row)
n = UBound(tablo)
Set d1 = CreateObject("Scripting.Dictionary")
Set d2 = CreateObject("Scripting.Dictionary")
For i = 1 To n
  If tablo(i, 2) <> "" Then
    If Not d1.Exists(tablo(i, 1)) Then
      d1(tablo(i, 1)) = tablo(i, 1)
      d2.RemoveAll 'RAZ
      For j = i To n
        If tablo(j, 1) = tablo(i, 1) Then _
          d2(tablo(j, 4)) = tablo(j, 4)
      Next
      R(lig, 0) = tablo(i, 1)
      R(lig, 1) = tablo(i, 2)
      R(lig, 2) = d2.Count
      lig = lig + 1
    End If
  End If
Next
'---restitution---
[K2:M65000].ClearContents 'RAZ
If d1.Count Then [K2:M2].Resize(d1.Count) = R
End Sub
Elle est très rapide car elle utilise des objets Dictionary et des tableaux.

Fichier joint.

A+
 

Pièces jointes

Re : Calcul nombre ticket

Re,

La macro adaptée à votre fichier (2) :

Code:
Sub Resultat()
Dim tablo, a1, a2, n&, d1 As Object, d2 As Object, i&, j&, lig&, R(999, 4)
tablo = Sheets("Base").Range("D2:G" & Sheets("Base").[D65536].End(xlUp).Row)
a1 = [C2]
a2 = [C3]
n = UBound(tablo)
Set d1 = CreateObject("Scripting.Dictionary")
Set d2 = CreateObject("Scripting.Dictionary")
For i = 1 To n
  If Not d1.Exists(tablo(i, 1)) Then
    d1(tablo(i, 1)) = tablo(i, 1)
    d2.RemoveAll 'RAZ
    For j = i To n
      If tablo(j, 1) = tablo(i, 1) Then
        d2(tablo(j, 3)) = tablo(j, 3)
        If tablo(j, 4) = a1 Or tablo(j, 4) = a2 _
          Then R(lig, 3) = R(lig, 3) + 1
       End If
    Next
    R(lig, 0) = tablo(i, 1)
    R(lig, 1) = tablo(i, 2)
    R(lig, 2) = d2.Count
    If R(lig, 2) Then R(lig, 4) = R(lig, 3) / R(lig, 2)
    lig = lig + 1
  End If
Next
'---restitution---
Application.ScreenUpdating = False
[A6:E1005].ClearContents 'RAZ
If d1.Count Then
  [A6:E6].Resize(d1.Count) = R
  [A6:E6].Resize(d1.Count).Sort [A6], Header:=xlNo
End If
End Sub
Edit 1 : la macro gère les articles en C2 et C3 mais pas les dates en A2 B2 A3 B3.

Edit 2 : j'ai "relooké" le fichier : en feuille Base la Dernière cellule était L65536 !!!

A+
 

Pièces jointes

Dernière édition:
Re : Calcul nombre ticket

Re,

Pour les pourcentages, la macro du fichier (2) ne donnait pas les mêmes résultats que les formules car :

Code:
If tablo(j, 4) = a1 Or tablo(j, 4) = a2 _
  Then R(lig, 3) = R(lig, 3) + 1
comptait les BONS où les articles en C2 ou C3 apparaissent.

En comptant les quantités vendues (Q) on obtient bien les mêmes résultats :

Code:
If tablo(j, 4) = a1 Or tablo(j, 4) = a2 _
  Then R(lig, 3) = R(lig, 3) + tablo(j, 6)
Mais alors, à mon avis, cette notion de pourcentage ne va plus très bien.

En effet ce qu'on obtient c'est le nombre moyen des 2 articles vendus par client.

Fichier (3).

A+
 

Pièces jointes

Re : Calcul nombre ticket

Bonjour le fil, le forum,

Je reviens sur ma solution (2) du post #8.

Elle n'est pas correcte car sur un même BON il peut y avoir plusieurs fois l'article C2 ou C3.

Cette solution (2 bis) est correcte, elle compte bien le nombre de clients qui ont acheté C2 ou C3 :

Code:
Sub Resultat()
Dim tablo, a1, a2, n&, d1 As Object, d2 As Object, d3 As Object
Dim i&, j&, lig&, R(999, 4)
tablo = Sheets("Base").Range("D2:G" & Sheets("Base").[D65536].End(xlUp).Row)
a1 = [C2]
a2 = [C3]
n = UBound(tablo)
Set d1 = CreateObject("Scripting.Dictionary")
Set d2 = CreateObject("Scripting.Dictionary")
Set d3 = CreateObject("Scripting.Dictionary")
For i = 1 To n
  If Not d1.Exists(tablo(i, 1)) Then
    d1(tablo(i, 1)) = tablo(i, 1)
    d2.RemoveAll 'RAZ
    d3.RemoveAll
    For j = i To n
      If tablo(j, 1) = tablo(i, 1) Then
        d2(tablo(j, 3)) = tablo(j, 3)
        If tablo(j, 4) = a1 Or tablo(j, 4) = a2 _
          Then d3(tablo(j, 3)) = tablo(j, 3)
       End If
    Next
    R(lig, 0) = tablo(i, 1)
    R(lig, 1) = tablo(i, 2)
    R(lig, 2) = d2.Count
    R(lig, 3) = d3.Count
    If R(lig, 2) Then R(lig, 4) = R(lig, 3) / R(lig, 2)
    lig = lig + 1
  End If
Next
'---restitution---
Application.ScreenUpdating = False
[A6:E1005].ClearContents 'RAZ
If d1.Count Then
  [A6:E6].Resize(d1.Count) = R
  [A6:E6].Resize(d1.Count).Sort [A6], Header:=xlNo
End If
End Sub
Les pourcentages ont maintenant tout leur sens...

A+
 

Pièces jointes

Re : Calcul nombre ticket

Re,

On peut sans inconvénient combiner les solutions (2 bis) et (3).

Fichier (4).

Edit 1 : pour éviter toute erreur j'ai placé la macro dans le code de la 1ère feuille.

Edit 2 : pour tester j'ai recopié 4 fois le tableau de la feuille Base (jusqu'à la ligne 47565).

Sur Win XP/Excel 2003 la durée d'exécution est alors de 0,75 seconde.

En gros elle est proportionnelle au produit Nombre de caissiers * Hauteur du tableau.

A+
 

Pièces jointes

Dernière édition:
Re : Calcul nombre ticket

Bonjour job75,

je vais tester sur le fichier original et si j'ai d'autres problèmes je reviens vers toi (ce qui sera plus que problable car je ne connais rien à VBA)
Il faudrait que je me trouve un tutoriel pour l'apprendre.
As-tu une piste?
Bonne journée.

Marc.
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
34
Affichages
853
  • Question Question
XL 2021 Macro
Réponses
6
Affichages
312
Réponses
4
Affichages
265
Réponses
5
Affichages
245
Retour