Sub LireAbsencesH()
EtatEvénements = Application.EnableEvents
EtatScreen = Application.ScreenUpdating
EtatCalcul = Application.Calculation
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
Mois = Plgn_Hebdo.[Mois_H].Value
Année = Plgn_Hebdo.[Année_H].Value
NbCLB = Tables.[tb_Collaborateurs].Rows.Count
Arrêts = Tables.[tb_Type_Arrêt].Value: NbMA = UBound(Arrêts, 1)
ReDim CoulArrêt(1 To NbMA, 1 To 2)
Dim CoulRepos(1 To 2)
Dim CoulFérié(1 To 2)
i = 0
For Each Arrêtc In Tables.[tb_Type_Arrêt]
i = i + 1
CoulArrêt(i, 1) = Arrêtc.Interior.Color
CoulArrêt(i, 2) = Arrêtc.Font.Color
Next
With Tables.[Couleurs_ReposH]
CoulRepos(1) = .Interior.Color
CoulRepos(2) = .Font.Color
End With
With Tables.[Couleurs_Férié]
CoulFérié(1) = .Interior.Color
CoulFérié(2) = .Font.Color
End With
ZoneSaisie = Planning.[ZoneSaisie].Value
d = DateValue("1 " & Mois & " " & Année): N°J = Weekday(d, vbMonday)
DateDéb = d + Evaluate("CHOOSE(" & N°J & ",-7,-1,-2,-3,-4,-5,-6)")
DateFin = DateDéb + NbSemH * 7 - 1
NbLgn = NbMA * NbGpL * NbGpC
ReDim TbSaisies(1 To NbCLB, 1 To NbLgn, 1 To 3)
LgnParCLBLec = NbGpL * (NbMA + 1)
For CLB = 1 To NbCLB
For GpLgn = 1 To NbGpL
GpLgn0 = (GpLgn - 1) * NbMA * NbGpC
For Lgn = 1 To NbMA
LigneLecture = NbMA * (GpLgn - 1) + GpLgn + Lgn + (CLB - 1) * LgnParCLBLec
For GpCol = 1 To NbGpC
ligneEcriture = GpLgn0 + (Lgn - 1) * NbGpC + GpCol
TbSaisies(CLB, ligneEcriture, 1) = ZoneSaisie(LigneLecture, (GpCol - 1) * 5 + 1)
TbSaisies(CLB, ligneEcriture, 2) = ZoneSaisie(LigneLecture, (GpCol - 1) * 5 + 4)
TbSaisies(CLB, ligneEcriture, 3) = Lgn
Next GpCol
Next Lgn
Next GpLgn
Next CLB
ReDim TbHoraires(1 To NbCLB, 1 To 7)
TbHrr = Tables.[tb_Collaborateurs[[Lundi M]:[Dimanche A]]]
For CLB = 1 To NbCLB: For J = 1 To 14 Step 2
HM = TbHrr(CLB, J): HF = TbHrr(CLB, J + 1)
If IsNumeric(HM) And IsNumeric(HF) Then
TbHoraires(CLB, (J + 1) / 2) = Format(HM, "hh:mm") & " à " & Format(HF, "hh:mm")
Else
TbHoraires(CLB, (J + 1) / 2) = HM
End If
Next J: Next CLB
ReDim tbABS(1 To NbCLB, DateDéb To DateFin)
ReDim TbIdxMA(1 To NbCLB, DateDéb To DateFin, 1 To 2)
For CLB = 1 To NbCLB
For J = DateDéb To DateFin
tbABS(CLB, J) = TbHoraires(CLB, Weekday(J, vbMonday))
If Evaluate("OR(" & CLng(J) & "=Tb_Fériés[Date])") Then
tbABS(CLB, J) = "Férié"
TbIdxMA(CLB, J, 1) = CoulFérié(1)
TbIdxMA(CLB, J, 2) = CoulFérié(2)
ElseIf tbABS(CLB, J) = "Repos H" Then
TbIdxMA(CLB, J, 1) = CoulRepos(1)
TbIdxMA(CLB, J, 2) = CoulRepos(2)
End If
Next J
For i = 1 To NbLgn
Jd = TbSaisies(CLB, i, 1): Jf = TbSaisies(CLB, i, 2): IdxMotif = TbSaisies(CLB, i, 3)
If IsDate(Jd) And IsDate(Jf) Then
If Jf >= DateDéb And Jd <= DateFin Then
For J = Jd To Jf
If J >= DateDéb And J <= DateFin Then
If Not IsEmpty(IdxMotif) And tbABS(CLB, J) <> "Repos H" And tbABS(CLB, J) <> "Férié" Then
tbABS(CLB, J) = Arrêts(IdxMotif, 1)
TbIdxMA(CLB, J, 1) = CoulArrêt(IdxMotif, 1)
TbIdxMA(CLB, J, 2) = CoulArrêt(IdxMotif, 2)
End If
End If
Next J
End If
End If
Next i
Next CLB
ReDim TbHoraires(1 To NbCLB, 1 To 14)
For Sem = 1 To NbSemH
For CLB = 1 To NbCLB
For J = 1 To 7
DateJ = (Sem - 1) * 7 + DateDéb + J - 1
If InStr(1, tbABS(CLB, DateJ), " à ", vbTextCompare) > 0 Then
ArrDép = Split(tbABS(CLB, DateJ), " à ")
TbHoraires(CLB, 1 + (J - 1) * 2) = CDbl(CDate(ArrDép(0)))
TbHoraires(CLB, 2 + (J - 1) * 2) = CDbl(CDate(ArrDép(1)))
Else
TbHoraires(CLB, 1 + (J - 1) * 2) = tbABS(CLB, DateJ)
TbHoraires(CLB, 2 + (J - 1) * 2) = Empty
End If
If Not IsEmpty(TbIdxMA(CLB, DateJ, 1)) Then
With Plgn_Hebdo.[Date_J].Offset(3 + (Sem - 1) * (NbCLB + 4) + CLB - 1, (J - 1) * 2).Resize(1, 2)
.Merge
.Interior.Color = TbIdxMA(CLB, DateJ, 1)
.Font.Color = TbIdxMA(CLB, DateJ, 2)
End With
End If
Next J
Next CLB
Plgn_Hebdo.[Date_J].Offset(3 + (Sem - 1) * (NbCLB + 4)).Resize(NbCLB).Value = TbHoraires
Next Sem
With Application
.CutCopyMode = False
.EnableEvents = EtatEvénements
.ScreenUpdating = EtatScreen
.Calculation = EtatCalcul
End With
End Sub