Private Sub Worksheet_Change(ByVal Target As Range)
Dim colmois, colsecteur, colclient, colproduction, mois&, secteur As Range, s, n, d As Object, i&, a, b
With Sheets("SUIVI EXPLOIT").ListObjects(1).Range 'tableau structuré
colmois = .Columns(16) 'matrice, plus rapide
colsecteur = .Columns(5)
colclient = .Columns(13)
colproduction = .Columns(54)
End With
mois = CLng(Format([A1], "yyyymm"))
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
For Each secteur In [A10,A38,A62]
s = secteur
Set d = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(colmois)
If colmois(i, 1) = mois And colsecteur(i, 1) = s Then
d(colclient(i, 1)) = d(colclient(i, 1)) + colproduction(i, 1)
If d(colclient(i, 1)) = 0 Then d.Remove colclient(i, 1) 'élimine les valeurs zéro
End If
Next i
secteur(12).Resize(10, 3) = "" 'RAZ
If d.Count Then
a = d.items
b = d.keys
tri a, b, 0, UBound(a) 'tri décroissant
secteur(12, 3).Resize(IIf(UBound(a) < 10, UBound(a) + 1, 10)) = Application.Transpose(a)
secteur(12, 2).Resize(IIf(UBound(b) < 10, UBound(b) + 1, 10)) = Application.Transpose(b)
secteur(12, 2).Resize(IIf(UBound(b) < 10, UBound(b) + 1, 10)).Replace "", "Clients internes"
End If
Next secteur
Application.EnableEvents = True 'réactive les évènements
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