Sub Total_heures()
Dim F As Worksheet, dest As Range, tablo, d1 As Object, i&, d2 As Object, x$, a, b
Set F = Sheets("BDD") 'à adapter
Set dest = F.[H1] 'à adapter
tablo = F.[A1].CurrentRegion
Application.ScreenUpdating = False
If F.FilterMode Then F.ShowAllData 'si la feuille est filtrée
dest(2).Resize(F.Rows.Count - dest.Row, 2).Delete xlUp 'RAZ
'---Somme des heures par N° interv---
Set d1 = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(tablo)
d1(CStr(tablo(i, 3))) = d1(CStr(tablo(i, 3))) + Val(Replace(tablo(i, 1), ",", "."))
Next
If d1.Count = 0 Then Exit Sub
'---Somme des heures par N° salarié & N° intervenant---
Set d2 = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(tablo)
x = tablo(i, 2) & Chr(1) & tablo(i, 3)
If Not d2.exists(x) Then d2(x) = d1(CStr(tablo(i, 3)))
Next
'---Somme des heures par N° salarié---
a = d2.keys: b = d2.items
d1.RemoveAll
For i = 0 To UBound(a)
x = Left(a(i), InStr(a(i), Chr(1)) - 1)
d1(x) = d1(x) + b(i)
Next
'---restitution---
dest(2).Resize(d1.Count) = Application.Transpose(d1.keys) 'Transpose limitée à 65536 lignes
dest(2, 2).Resize(d1.Count) = Application.Transpose(d1.items)
dest(2).Resize(d1.Count, 2).Interior.ColorIndex = 6 'jaune
dest(2).Resize(d1.Count, 2).Borders.Weight = xlThin 'bordures
dest(2).Resize(d1.Count, 2).Sort dest, xlAscending, Header:=xlNo 'tri
End Sub