Private Sub Worksheet_Change(ByVal Target As Range)
Dim P As Range, c As Range, t, mois As Byte, i As Byte, dat&, coul&, s#
Set P = [D4:F10]
Set c = [D14]
If Intersect(Target, Union(P, c.Resize(32, 3))) Is Nothing Then Exit Sub
t = c.Resize(32, 3) 'matrice, plus rapide
If Not IsDate(t(1, 1)) Then t(1, 1) = Date 'sécurité
mois = Month(t(1, 1))
t(1, 1) = DateSerial(Year(t(1, 1)), mois, 1) '1er du mois
For i = 2 To 32
dat = t(1, 1) + i - 2
If Month(dat) = mois Then
t(i, 1) = i - 1
t(i, 2) = UCase(Format(dat, "dddd"))
coul = c(i, 2).Interior.Color
s = Application.SumIf(P.Columns(1), t(i, 2), P.Columns(2))
s = s + Application.SumIf(P.Columns(1), t(i, 2), P.Columns(3))
t(i, 3) = IIf(coul = 16777215 And s > 0, s, "")
Else
t(i, 1) = "": t(i, 2) = "": t(i, 3) = "" 'jours 29 30 31
End If
Next
'---restitution---
Application.EnableEvents = False 'désactive les événements
c.Resize(32, 3) = t
Application.EnableEvents = True 'réactive les événements
End Sub