Compter les paires de top références.

Pizzi

XLDnaute Nouveau
Bonjour,

dans l'onglet "prepa", en colonne1 mes numéros de colis, en colonne2 les articles.
dans l'onglet "Top refs" les 10 articles les plus vendus.

je voudrais calculer le nombre de colis qui regroupant au moins 2 "top refs" tout en sachant lesquels d'ou ma disposition dans l'onglet2.

Merci d'avance pour votre aide.

ci-joint le fichier.
 

Pièces jointes

  • prepa details.xlsx
    80.2 KB · Affichages: 48

Pizzi

XLDnaute Nouveau
Re : Compter les paires de top références.

Tout d'abord merci pour ta réponse,

mais non, ce n'est pas ce qu il me faut

en il me faudrait

le nombre de colis dans lequel ce trouve la top ref A et la top ref B
le nombre de colis dans lequel ce trouve la top ref A et la top ref C
le nombre de colis dans lequel ce trouve la top ref A et la top ref D
le nombre de colis dans lequel ce trouve la top ref A et la top ref E

etc.

En remplissant le tableau de l'onglet "Top refs"

Je ne sais pas si je suis clair assez ?
 

Pizzi

XLDnaute Nouveau
Re : Compter les paires de top références.

non, justement, je dois avoir pour toutes les combinaisons,
mm choses pour le nombre de colis dans lequel ce trouve la top ref B et la top ref C
pour le nombre de colis dans lequel ce trouve la top ref B et la top ref D
pour le nombre de colis dans lequel ce trouve la top ref C et la top ref D

etc.

le nombre de tous les colis comportant 2 top refs et lesquels.
 

eastwick

XLDnaute Impliqué
Re : Compter les paires de top références.

Votre tableau en 2ème onglet est bien mais impossible à remplir car il y a des colis avec 3 ou 4 "top réf".
 

Pièces jointes

  • Copie de prepa details.xlsx
    230.5 KB · Affichages: 29
  • Copie de prepa details.xlsx
    230.5 KB · Affichages: 33

Pizzi

XLDnaute Nouveau
Re : Compter les paires de top références.

Oui et non,

ce n est pas grave si un les top ref A,B et C sont dans un mm colis;

j aurais A - B 1 , A - C 1 et B - C 1

ça ne me pose pas de problème mm si on pourait avoir l impression qu'il s'agit de 2 ou 3 colis différents, peut importe
 

job75

XLDnaute Barbatruc
Re : Compter les paires de top références.

Bonjour Pizzi, eastwick,

Voyez le fichier joint.

Dans la feuille "Prepa" j'ai créé les 2 colonnes auxiliaires NbArticle et NbTop10.

Notez que les formules sont des formules lourdes avec des temps de calcul importants.

C'est pour cela que je n'ai pas cherché à rendre dynamique le tableau T (avec DECALER qui est une fonction volatile).

A+
 

Pièces jointes

  • prepa details(1).xlsx
    212.4 KB · Affichages: 47

job75

XLDnaute Barbatruc
Re : Compter les paires de top références.

Re,

En utilisant VBA et l'objet Dictionary c'est relativement simple et beaucoup plus rapide.

Le code de la feuille "Top refs" (clic droit sur l'onglet et Visualiser le code) :

Code:
Private Sub Worksheet_Activate()
Dim t, d As Object, i&, a, b, ub&, t1, n As Byte, j&
t = Feuil1.[A1].CurrentRegion.Resize(, 2) 'Feuil1 => CodeName
Application.ScreenUpdating = False
Range("A2:B" & Rows.Count).ClearContents 'RAZ
Range("D2:E" & Rows.Count).ClearContents 'RAZ
If UBound(t) = 1 Then Exit Sub
'---1ère liste (Nb Article)---
Set d = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(t)
  d(t(i, 2)) = d(t(i, 2)) + 1
Next
a = d.items: b = d.keys: ub = UBound(a)
tri a, b, 0, ub
If ub > 9 Then ub = 9
For i = 0 To UBound(a) 'en cas d'ex aequo en 10ème position
  If a(i) < a(ub) Then Exit For
Next
[A2].Resize(i) = Application.Transpose(a)
[B2].Resize(i) = Application.Transpose(b)
[A2].Resize(i, 2).Sort [A2], xlDescending, [B2], , xlAscending, Header:=xlNo 'tri
'---2ème liste (Nb Top10)---
t1 = [A2].Resize(i, 2): ub = UBound(t1)
d.RemoveAll
For i = 2 To UBound(t)
  n = 0
  For j = 1 To ub
    If t(i, 2) = t1(j, 2) Then n = 1: Exit For
  Next
  d(t(i, 1)) = d(t(i, 1)) + n
Next
a = d.items: b = d.keys
tri a, b, 0, UBound(a)
For i = 0 To UBound(a)
  If a(i) < 2 Then Exit For '< 2 modifiable
Next
If i = 0 Then Exit Sub
[D2].Resize(i) = Application.Transpose(a)
[E2].Resize(i) = Application.Transpose(b)
[D2].Resize(i, 2).Sort [D2], xlDescending, [E2], , xlAscending, Header:=xlNo 'tri
End Sub

Sub tri(a, b, gauc, droi)      ' Quick sort
Dim ref, g, d, temp
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
    Do While a(g) > ref: g = g + 1: Loop
    Do While ref > a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      temp = b(g): b(g) = b(d): b(d) = temp
      g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tri(a, b, g, droi)
If gauc < d Then Call tri(a, b, gauc, d)
End Sub
Le code s'exécute quand on active la feuille.

Fichier joint, on vérifiera que les résultats sont les mêmes que ceux obtenus par formules.

Nota : on peut ajouter des lignes sans problème dans la feuille "Prepa", la macro rend le tableau dynamique.

Edit : ajouté une boucle pour la 1ère liste (Nb Article) en cas d'ex aequo en 10ème position.

Bonne soirée.
 

Pièces jointes

  • prepa details VBA(1).xlsm
    101.8 KB · Affichages: 53
Dernière édition:

Pizzi

XLDnaute Nouveau
Re : Compter les paires de top références.

Merci

par contre ce n'est toujours pas ce que je cherche.

ci joint

le fichier, avec le tableau "Top ref" comme je le voudrais
(j ai fait des tris et compter "à la main")
 

Pièces jointes

  • prepa detail(2)s.xlsx
    80.2 KB · Affichages: 50
Dernière modification par un modérateur:

job75

XLDnaute Barbatruc
Re : Compter les paires de top références.

Bonsoir Pizzi, le forum,

J'avais montré le chemin, il fallait continuer sur le même principe :

Code:
Private Sub Worksheet_Activate()
Dim t, d As Object, i&, a, b, ub&, t1, dbis As Object, j, c, cel As Range, x$, y$, k&
t = Feuil1.[A1].CurrentRegion.Resize(, 2) 'Feuil1 => CodeName
Application.ScreenUpdating = False
Range("A2:G" & Rows.Count).ClearContents 'RAZ
Range(Columns("H"), Columns(Columns.Count)).Delete 'RAZ
If UBound(t) = 1 Then Exit Sub
'---1ère liste (Nb Article)---
Set d = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(t)
  d(t(i, 2)) = d(t(i, 2)) + 1
Next
a = d.items: b = d.keys: ub = UBound(a)
tri a, b, 0, ub
If ub > 9 Then ub = 9
For i = 0 To UBound(a) 'en cas d'ex aequo en 10ème position
  If a(i) < a(ub) Then Exit For
Next
[A2].Resize(i) = Application.Transpose(a)
[B2].Resize(i) = Application.Transpose(b)
[A2].Resize(i, 2).Sort [A2], xlDescending, [B2], , xlAscending, Header:=xlNo 'tri
'---2ème liste (Nb Top10)---
t1 = [A2].Resize(i, 2): ub = UBound(t1)
d.RemoveAll
Set dbis = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(t)
  For j = 1 To ub
    If t(i, 2) = t1(j, 2) Then
      d(t(i, 1)) = d(t(i, 1)) + 1
      dbis(t(i, 1)) = dbis(t(i, 1)) & "<" & t(i, 2) & ">"
      Exit For
    End If
Next j, i
a = d.items: b = d.keys: c = dbis.items
tribis a, b, c, 0, UBound(a)
For i = 0 To UBound(a)
  If a(i) < 2 Then Exit For
Next
If i = 0 Then Exit Sub
[D2].Resize(i) = Application.Transpose(a)
[E2].Resize(i) = Application.Transpose(b)
[F2].Resize(i) = Application.Transpose(c)
[D2].Resize(i, 3).Sort [D2], xlDescending, [E2], , xlAscending, Header:=xlNo 'tri
'---3ème liste (Articles)---
With [B1].Resize(ub + 1)
  .Copy [H1]
  [H1].Resize(, ub + 1) = Application.Transpose(.Value)
End With
Set cel = [H1]
t = [D2].Resize(i, 3)
For i = 3 To ub + 1
  x = "<" & cel(i, 1) & ">"
  For j = 2 To i - 1
    y = "<" & cel(1, j) & ">"
    For k = 1 To UBound(t)
      cel(i, j) = cel(i, j) + Sgn(InStr(t(k, 3), x) * InStr(t(k, 3), y))
Next k, j, i
'---mise en forme---
With [H1].CurrentRegion
  .SpecialCells(xlCellTypeBlanks).Interior.Color = .Cells(1).Interior.Color
  .HorizontalAlignment = xlCenter
End With
Columns.AutoFit
Application.Goto [H1], True 'cadrage
End Sub

Sub tri(a, b, gauc, droi)      ' Quick sort
Dim ref, g, d, temp
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
    Do While a(g) > ref: g = g + 1: Loop
    Do While ref > a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      temp = b(g): b(g) = b(d): b(d) = temp
      g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tri(a, b, g, droi)
If gauc < d Then Call tri(a, b, gauc, d)
End Sub

Sub tribis(a, b, c, gauc, droi)     ' Quick sort bis
Dim ref, g, d, temp
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
    Do While a(g) > ref: g = g + 1: Loop
    Do While ref > a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      temp = b(g): b(g) = b(d): b(d) = temp
      temp = c(g): c(g) = c(d): c(d) = temp
      g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tribis(a, b, c, g, droi)
If gauc < d Then Call tribis(a, b, c, gauc, d)
End Sub
Notez les 2 macros Quick sort, pour 2 et pour 3 colonnes.

Je rappelle qu'en cas d'ex aequo en 10ème position il y a plus de 10 articles dans les Top10.

Fichier (2).

A+
 

Pièces jointes

  • prepa details VBA(2).xlsm
    107.1 KB · Affichages: 33
Dernière édition:

job75

XLDnaute Barbatruc
Re : Compter les paires de top références.

Bonjour Pizzi, le forum,

Une autre présentation pour la 3ème liste.

Edit : j'ai changé la couleur de la cellule B1 dans la feuille "Top refs".

A+
 

Pièces jointes

  • prepa details VBA(3).xlsm
    107.7 KB · Affichages: 46
  • prepa details VBA(3 bis).xlsm
    107.8 KB · Affichages: 32
Dernière édition:

job75

XLDnaute Barbatruc
Re : Compter les paires de top références.

Bonjour Pizzi, le forum,

Les colonnes intermédiaires sont utiles pour comprendre ce qui se passe et lister les colis.

Mais on peut tout à fait s'en passer :

Code:
Private Sub Worksheet_Activate()
Dim t, d As Object, i&, a, b, ub&, t1, dbis As Object, j, h&, x$, y$, k&
t = Feuil1.[A1].CurrentRegion.Resize(, 2) 'Feuil1 => CodeName
Application.ScreenUpdating = False
Range("A3:B" & Rows.Count).ClearContents 'RAZ
Range(Columns("C"), Columns(Columns.Count)).Delete 'RAZ
If UBound(t) = 1 Then Exit Sub
'---1ère liste---
Set d = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(t)
  d(t(i, 2)) = d(t(i, 2)) + 1
Next
a = d.items: b = d.keys: ub = UBound(a)
tri a, b, 0, ub
If ub > 9 Then ub = 9
For i = 0 To UBound(a) 'en cas d'ex aequo en 10ème position
  If a(i) < a(ub) Then Exit For
Next
[A3].Resize(i) = Application.Transpose(a)
[B3].Resize(i) = Application.Transpose(b)
[A3].Resize(i, 2).Sort [A2], xlDescending, [B2], , xlAscending, Header:=xlNo 'tri
'---2ème liste---
t1 = [A3].Resize(i, 2): ub = UBound(t1)
d.RemoveAll
Set dbis = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(t)
  For j = 1 To ub
    If t(i, 2) = t1(j, 2) Then
      d(t(i, 1)) = d(t(i, 1)) + 1
      dbis(t(i, 1)) = dbis(t(i, 1)) & "<" & t(i, 2) & ">"
      Exit For
    End If
Next j, i
a = d.items: b = dbis.items
tri a, b, 0, UBound(a)
For h = 0 To UBound(a)
  If a(h) < 2 Then Exit For
Next
'---3ème liste---
With [B2].Resize(ub + 1, ub + 1)
  .Rows(1) = Application.Transpose(.Columns(1))
  t = .Value 'matrice, plus rapide
  For i = 3 To ub + 1
    x = "<" & t(i, 1) & ">"
    For j = 2 To i - 1
      y = "<" & t(1, j) & ">"
      For k = 0 To h
        t(i, j) = t(i, j) + Sgn(InStr(b(k), x) * InStr(b(k), y))
  Next k, j, i
  .Value = t
  '---mise en forme---
  .Name = "Liste"
  .SpecialCells(xlCellTypeBlanks).Interior.Color = .Cells(1).Interior.Color
  .Offset(, 1).HorizontalAlignment = xlCenter
  .Columns.AutoFit
End With
'---cadrage---
Application.Goto [A1], True
ub = IIf(ub < 8, 8, IIf(ub > 12, 12, ub)) 'limitation du Zoom
[A1].Resize(, ub + 2).Select: ActiveWindow.Zoom = True
[A1].Select
End Sub

Sub tri(a, b, gauc, droi)      ' Quick sort
Dim ref, g, d, temp
ref = a((gauc + droi) \ 2)
g = gauc: d = droi
Do
    Do While a(g) > ref: g = g + 1: Loop
    Do While ref > a(d): d = d - 1: Loop
    If g <= d Then
      temp = a(g): a(g) = a(d): a(d) = temp
      temp = b(g): b(g) = b(d): b(d) = temp
      g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tri(a, b, g, droi)
If gauc < d Then Call tri(a, b, gauc, d)
End Sub
Fichiers joints.

Bonne journée.
 

Pièces jointes

  • prepa details VBA(4).xlsm
    104.3 KB · Affichages: 34
  • prepa details VBA(4 bis).xlsm
    104.4 KB · Affichages: 35
Dernière édition:

Discussions similaires

Réponses
306
Affichages
26 K

Membres actuellement en ligne

Statistiques des forums

Discussions
312 489
Messages
2 088 855
Membres
103 976
dernier inscrit
kaizertv2001@gmailcom