1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| Option Explicit
'/!\ Active la référence Microsoft Scripting Runtime
Sub Ponderation()
Dim Dico As New Scripting.Dictionary
Dim N As Long, i As Long
Dim Tb, Res
Application.ScreenUpdating = False
With Feuil1
N = .Cells(.Rows.Count, 1).End(xlUp).Row
Tb = .Range("A2").Resize(N - 1, 3)
End With
Set Dico = CreateObject("Scripting.Dictionary")
For i = 1 To N - 1
If Not Dico.Exists(Tb(i, 1)) Then
Dico.Add CStr(Tb(i, 1)), Tb(i, 2) & "|" & Tb(i, 3)
Else
Dico(Tb(i, 1)) = Tb(i, 2) & ";" & Dico(Tb(i, 1)) & ";" & Tb(i, 3)
End If
Next i
N = Dico.Count
If N > 0 Then
ReDim Res(1 To N + 1, 1 To 3)
Res(1, 1) = "Réf": Res(1, 2) = "Q": Res(1, 3) = "Prix"
For i = 0 To N - 1
Res(i + 2, 1) = Dico.keys(i)
Res(i + 2, 2) = SumAverage(Dico.items(i))
Res(i + 2, 3) = SumAverage(Dico.items(i), True) ' Round(SumAverage(Dico.items(i), True),2)
Next i
Set Dico = Nothing
Feuil2.Range("A1").Resize(N + 1, 3) = Res
End If
End Sub
Private Function SumAverage(ByVal Tmp As String, Optional Avrg As Boolean) As Double
Dim TmpQ As String, TmpP As String
Dim N As Integer, i As Integer
Dim S As Double, Q As Double
Dim TblQ, TblP
TmpQ = Split(Tmp, "|")(0)
TmpP = Split(Tmp, "|")(1)
TblQ = Split(TmpQ, ";")
TblP = Split(TmpP, ";")
N = UBound(TblQ)
For i = 0 To N
If Avrg Then
S = S + TblP(i) * TblQ(i)
Q = Q + TblQ(i)
Else
S = S + TblQ(i)
End If
Next i
SumAverage = S / IIf(Avrg, Q, 1)
End Function |
Partager