Sub MAJ_Plannings()
Dim ligdeb&, d As Object, tablo, w As Worksheet, nf$, col%, i&, dat As Variant, lig As Variant
ligdeb = 3
Set d = CreateObject("Scripting.Dictionary")
tablo = Sheets("données").[A1].CurrentRegion.Resize(, 6) 'matrice, plus rapide
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
For Each w In Worksheets
nf = UCase(Trim(w.Name))
If IsDate("1/" & nf) Then
d.RemoveAll 'RAZ
If w.FilterMode Then w.ShowAllData 'si la feuille est filtrée
'---effacement des DI sans toucher aux POS---
For col = 10 To 70 Step 2
With w.Cells(ligdeb, col).Resize(w.Rows.Count - ligdeb + 1)
.ClearContents
.Interior.ColorIndex = xlNone
End With
Next col
For i = 2 To UBound(tablo)
dat = tablo(i, 5)
If IsDate(dat) Then
dat = CDate(dat)
If Year(dat) = [année] And UCase(Format(dat, "mmmm")) = nf Then
ThisWorkbook.Names.Add "Critere", tablo(i, 1) & tablo(i, 4) 'nom défini
With w.Range("A1", w.UsedRange)
.Columns(1).Name = "Matricule" 'plages nommées
.Columns(4).Name = "Activite" 'plages nommées
End With
lig = [MATCH(Critere,Matricule&Activite,0)]
If IsError(lig) Then lig = Application.Max(ligdeb, w.Cells(w.Rows.Count, 1).End(xlUp).Row + 1)
d(lig) = "" 'mémorise les lignes traitées
w.Cells(lig, 1).Resize(, 4) = Application.Index(tablo, i, 0)
col = Application.Match(CLng(dat), w.Rows(1), 0)
Application.EnableEvents = True 'réactive les évènements pour appliquer la couleur
w.Cells(lig, col) = tablo(i, 6)
Application.EnableEvents = False 'désactive les évènements
End If
End If
Next i
'---suppression des lignes non traitées---
For i = w.Cells(w.Rows.Count, 1).End(xlUp).Row To ligdeb Step -1
If Not d.exists(i) Then w.Rows(i).Delete
Next i
End If
Next w
Application.EnableEvents = True 'réactive les évènements
MsgBox "Les plannings ont été mis à jour", vbInformation
End Sub