1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312
| Sub calculPenalites()
'On ouvre le classeur
Dim monClasseur As Workbook
Set monClasseur = Workbooks("Copie de abcd - Copie.xlsm")
'on ouvre la feuille
Dim maFeuille As Worksheet
Set maFeuille = monClasseur.Worksheets("etat")
'on active la feuille
monClasseur.Worksheets("etat").Activate
Call QuelMoisACalculer
End Sub
'cette fonction renvoit la difference entre deux dates.
Function NbJours(d1 As Date, d2 As Date) As Integer
NbJours = DateDiff("d", d1, d2)
End Function
Function QuelMoisACalculer()
Dim leMois As Byte
leMois = Application.InputBox("quel est le mois que vous souhaitez calculer les pénalités", Type:=1)
Dim compteur As Byte
compteur = 0
Dim PenaliteDeCeDossier As Long
PenaliteDeCeDossier = 0
Dim JoursSupplementaires As Long
JoursSupplementaires = 0
Dim SommePenaliteDuMois As Long
SommePenaliteDuMois = 0
For ligne = 2 To 10
' on recupere le mois de la date indiqué dans la cellule
x = Month(Cells(ligne, 16).Value)
If x = leMois Then
compteur = compteur + 1
'ICI CELA M'AFFICHE 12 heures or qu'il devrait y avoir
nombH = HeuresTravail(Cells(ligne, 16).Value, Cells(ligne, 18).Value)
MsgBox "le nombre d'heures est de " & nombH
'ICI CELA M'AFFICHE ZERO
' NBH = HeuresTravailBisBis(Cells(ligne, 16).Value, Cells(ligne, 18).Value)
' MsgBox "le nombre d'heures est de " & NBH
' calculer la difference entre deux dates pour avoir le nombre de jour entre l'ouverture de l'intervention et sa cloture
nbj = NombreJoursDiff(Cells(ligne, 16), Cells(ligne, 18))
' calcule du nombre d'heures entre deux dates donnés
'nomH = HeuresTravailles(Cells(ligne, 16), Cells(ligne, 18))
' MsgBox " le nombre d'heures de ces deux dates est de " & nomH
nbjj = nbjourouvrable(Cells(ligne, 16), Cells(ligne, 18))
MsgBox " le nombre de jours entre la date d'ouverture de l'intervention et de sa cloture est de " & nbjj
' Indisponibilité > = à 1jours ou 10heures = 10
If nbjj = 1 Then
PenaliteDeCeDossier = PenaliteDeCeDossier + 10
' Indisponibilité entre 1 et 2 jours => 10 +18 = 28
ElseIf nbjj = 2 Then
PenaliteDeCeDossier = PenaliteDeCeDossier + 10 + 18
' Indisponibilité entre 2 et 3jours => 10 +18 + 25 =53
ElseIf nbjj = 3 Then
PenaliteDeCeDossier = PenaliteDeCeDossier + 10 + 18 + 25
' Indisponibilité supérieur à 3jours => 53 + 25/jour supplémentaire
ElseIf nbjj > 3 Then
JoursSupplementaires = nbj - 4 ' pour avoir le nombre de jours supplementaires
PenaliteDeCeDossier = PenaliteDeCeDossier + 53 + 25 * JoursSupplementaires
End If
SommePenaliteDuMois = SommePenaliteDuMois + PenaliteDeCeDossier
End If
Next
MsgBox "la penalite du mois " & leMois & " duquel on a souhaite calculer la penalite est de " & SommePenaliteDuMois
MsgBox "le nombre d'intervention du mois " & leMois & " est de " & compteur
End Function
Function NombreJoursDiff(d1 As Date, d2 As Date) As Integer
NombreJoursDiff = DateDiff("d", d1, d2)
End Function
Function nbjourouvrable(datdeb, datfin)
If datdeb = "" Or datfin = "" Then Exit Function
nbjourtot = DateDiff("d", datdeb, datfin) + 1
For i = 1 To nbjourtot
If ferie(datdeb) Then
nbjourtot = nbjourtot - 1
End If
datdeb = DateAdd("d", 1, datdeb)
Next
nbjourouvrable = nbjourtot
End Function
Function ferie(Jour)
If Jour = "" Then Exit Function
Dim JJ, AA
Dim NbOr, Epacte
Dim PLune, Paques, Ascension, Pentecote
JJ = Day(Jour)
mm = Month(Jour)
AA = Year(Jour)
If JJ = 1 And mm = 1 Then ferie = True: Exit Function '1 Janvier
If JJ = 1 And mm = 5 Then ferie = True: Exit Function '1 Mai
If JJ = 8 And mm = 5 Then ferie = True: Exit Function '8 Mai
If JJ = 14 And mm = 7 Then ferie = True: Exit Function '14 Juillet
If JJ = 15 And mm = 8 Then ferie = True: Exit Function '15 Août
If JJ = 1 And mm = 11 Then ferie = True: Exit Function '1 Novembre
If JJ = 11 And mm = 11 Then ferie = True: Exit Function '11 Novembre
If JJ = 25 And mm = 12 Then ferie = True: Exit Function '25 Décembre
NbOr = (AA Mod 19) + 1
Epacte = (11 * NbOr - (3 + Int((2 + Int(AA / 100)) * 3 / 7))) Mod 30
PLune = CDate("19/04/" & AA) - ((Epacte + 6) Mod 30)
If Epacte = 24 Then PLune = PLune - 1
If Epacte = 25 And (AA >= 1900 And AA < 2000) Then PLune = PLune - 1
Paques = PLune - Weekday(PLune) + vbMonday + 7 'Paques
If JJ = Day(Paques) And mm = Month(Paques) Then ferie = True: Exit Function
Ascension = Paques + 38 'Ascension
If JJ = Day(Ascension) And mm = Month(Ascension) Then ferie = True: Exit Function
Pentecote = Ascension + 11 'Pentecote
If JJ = Day(Pentecote) And mm = Month(Pentecote) Then ferie = True: Exit Function
ferie = False
Dim numjour
numjour = Weekday(Jour, vbMonday) 'fixe à 6 et 7 la valeur du samedi & dimanche
If numjour = 6 Or numjour = 7 Then ferie = True: Exit Function
End Function
Function Work_Days(BegDate As Date, EndDate As Date, _
Optional bAvecJFerie As Boolean = True) As Variant
Dim dt As Date
On Error GoTo Work_Days_Error
If IsNull(BegDate) Or IsNull(EndDate) Then Err.Raise vbObjectError + 1
If Not IsDate(BegDate) Or Not IsDate(EndDate) Then Err.Raise vbObjectError + 2
If BegDate > EndDate Then Err.Raise vbObjectError + 3
dt = BegDate
Work_Days = 0
While dt <= EndDate
If DatePart("w", dt, vbMonday) < 6 And IIf(bAvecJFerie, Not EstFerie(dt), True) Then
Work_Days = Work_Days + 1
End If
dt = DateAdd("d", 1, dt)
Wend
Exit Function
Work_Days_Error:
Select Case Err.Number
Case vbObjectError + 1: Work_Days = "Les 2 dates sont obligatoires."
Case vbObjectError + 2: Work_Days = "Format de date incorrect."
Case vbObjectError + 3: Work_Days = "La date de fin doit être postérieure à la date de début."
Case Else: Work_Days = Err.Description
End Select
End Function
Function EstFerie(ByVal QuelleDate As Date) As Boolean
Dim anneeDate As Integer
Dim joursFeries(1 To 11) As Date
Dim i As Integer
anneeDate = Year(QuelleDate)
joursFeries(1) = DateSerial(anneeDate, 1, 1)
joursFeries(2) = DateSerial(anneeDate, 5, 1)
joursFeries(3) = DateSerial(anneeDate, 5, 8)
joursFeries(4) = DateSerial(anneeDate, 7, 14)
joursFeries(5) = DateSerial(anneeDate, 8, 15)
joursFeries(6) = DateSerial(anneeDate, 11, 1)
joursFeries(7) = DateSerial(anneeDate, 11, 11)
joursFeries(8) = DateSerial(anneeDate, 12, 25)
joursFeries(9) = fLundiPaques(anneeDate)
joursFeries(10) = joursFeries(9) + 38 ' Ascension = lundi de Paques + 38
joursFeries(11) = joursFeries(9) + 49 ' Lundi Pentecôte = lundi de Paques + 49
For i = 1 To 11
If QuelleDate = joursFeries(i) Then
EstFerie = True
Exit For
End If
Next
End Function
Private Function fLundiPaques(ByVal Iyear As Integer) As Date
'Adapté de +ieurs scripts...
Dim L(6) As Long, Lj As Long, Lm As Long
L(1) = Iyear Mod 19: L(2) = Iyear Mod 4: L(3) = Iyear Mod 7
L(4) = (19 * L(1) + 24) Mod 30
L(5) = ((2 * L(2)) + (4 * L(3)) + (6 * L(4)) + 5) Mod 7
L(6) = 22 + L(4) + L(5)
If L(6) > 31 Then
Lj = L(6) - 31
Lm = 4
Else
Lj = L(6)
Lm = 3
End If
' Lundi de Pâques = Paques + 1 jour
fLundiPaques = DateAdd("d", 1, (Lj & "/" & Lm & "/" & Iyear))
End Function
Function calc(Cells)
Dim lib_date1 As Range, lib_date2 As Range
Dim date_1 As Date, date_2 As Date
Dim heure_1 As Long, Heure_2 As Long
'Set lib_date1 =
Set lib_date2 = .Range("A2")
'Calcul des Serial de chaque date
date_1 = DateSerial(Year(lib_date1), Month(lib_date1), Day(lib_date1))
date_2 = DateSerial(Year(lib_date2), Month(lib_date2), Day(lib_date2))
'Calcul des heures de chaque date
heure_1 = Hour(lib_date1)
Heure_2 = Hour(lib_date2)
'Calcul de la durée effective
MsgBox "Temps " & HeuresTravail(date_1, heure_1, date_2, Heure_2)
'Réinitialisation des variables
Set ib_date1 = Nothing
Set ib_date2 = Nothing
End Function
Public Function HeuresTravail(date1 As Date, date2 As Date)
'36000 = 10 heures * 60 minutes * 60 secondes
Dim heure_1 As Variant
Dim Heure_2 As Variant
'Calcul des heures de chaque date
heure1 = Hour(date1)
heure2 = Hour(date2)
'Calcul de la durée effective
'MsgBox "Temps " & HeuresTravail(date_1, heure_1, date_2, Heure_2)
diff = ((Work_Days(date1, date2) - 1) * 10 - (heure1 - heure2))
HeuresTravail = diff
End Function
Function HeuresTravailBisBis(date1 As Date, date2 As Date) As Double
Dim nbJoursComplets As Long
Dim nbHeuresAvant As Double
Dim nbHeuresApres As Double
'Le nombre de jours ouvrés total entre date1 à minuit "du soir" et date2 à minuit "du matin" !
nbJoursComplets = Work_Days(DateValue(date1), DateValue(date2), True) - 2
'Le nombre d'heures travaillées entre date1 et date1 à 18h
If Hour(date1) < 18 Then
If Hour(date1) < 8 Then
nbHeuresAvant = 10
Else
nbHeuresAvant = 18 - (Hour(date1) + Minute(date1) / 60)
End If
End If
'Le nombre d'heures travaillées entre date2 à 8h et date2
If Hour(date2) >= 8 Then
If Hour(date2) >= 18 Then
nbHeuresApres = 10
Else
nbHeuresApres = Hour(date2) + Minute(date2) / 60 - 8
End If
End If
HeuresT = 10 * nbJoursComplets + nbHeuresAvant + nbHeuresApres
End Function |
Partager