Compter le nombre de jours "concernés" parmis plusieurs périodes
Bonjour,
A chaque jour son blocage, décidément...
Je voudrais compter le nombre de jours concerné par les périodes de "dérogations" présentes dans chaque mois.
Dans la feuille "Calendrier" de mon classeur, après avoir trier mes "dérogations" par mois je voudrais récupérer le nombre de jours sous "dérogation".
Mon problème est que ces "dérogations" peuvent être dans la même période mais ne doivent pas être comptées 2 fois.
Pour chaque mois il y a une colonne pour la date de début et une pour la date de fin ainsi qu'une colonne "Nbre_jours" faite via DateDiff.
J'ai mis pour chaque mois le résultat souhaité.
J'ai essayé une fonction de type booléenne sans succès...
Je remercie d'avance toutes les personnes qui prendront le temps de répondre.
Bonjour,
J'ai repris le code que j'avais déjà développé la dernière fois et qui était en commentaire.
Le résultat se trouve en pièce jointe.
Bonjour Ausecour,
Encore merci de venir à ma rescousse alors que j'avais choisis d'utiliser l'autre code que l'on m'avait donné.
tabMois(lig, 1) = tabSource(i, 2)
tabMois(lig, 2) = tabSource(i, 3)
tabMois(lig, 3) = tabSource(i, 4)
tabMois(lig, 4) = IIf(tabSource(i, 3) > DateSerial(Year(tabSource(i, 3)), j + 1, 1) - 1, _
DateSerial(tabSource(i, 3) > Year(tabSource(i, 3)), j + 1, 1) - 1, tabSource(i, 3)) - _
IIf(tabSource(i, 2) < DateSerial(Year(tabSource(i, 2)), j, 1), DateSerial(Year(tabSource(i, 2)), j, 1), tabSource(i, 2))Comme tu peux le voir ci-dessus, j'ai repris ton ancien code et j'ai ajouté une nouvelle colonne afin de pouvoir comparer le nombre de jours présent dans la base de donnée à ceux qui en ressortent après avoir lancer la Maccro.
Tu m'a bien avancé, mais j'ai toujours quelques erreurs dans le comptage de "Jours" comme illustré sur la photo ci-dessous :
On remarque après lancement que les résultats ne sont pas justes.
Je me penche dessus actuellement, mais si tu as de nouveau une idée je suis preneur.
Encore Merci
Bonjour,
C'est étrange, j'ai ceci sur mon fichier:
Ce n'est pas ce que tu as dans "Calendrier (2)"?
Dans le doute je remets le fichier que j'ai des fois qu'on aie pas la même version:
PS: c'est possible que j'ai changé le fichier après que tu l'aies téléchargé une première fois, désolé
ça doit sûrement être ça, il y a une erreur ici:
tabMois(lig, 4) = IIf(tabSource(i, 3) > DateSerial(Year(tabSource(i, 3)), j + 1, 1) - 1, _
DateSerial(tabSource(i, 3) > Year(tabSource(i, 3)), j + 1, 1) - 1, tabSource(i, 3)) - _
IIf(tabSource(i, 2) < DateSerial(Year(tabSource(i, 2)), j, 1), DateSerial(Year(tabSource(i, 2)), j, 1), tabSource(i, 2))que j'ai corrigé par la suite en :
tabMois(lig, 4) = IIf(tabSource(i, 3) > DateSerial(Year(tabSource(i, 3)), j + 1, 1) - 1, _
DateSerial(Year(tabSource(i, 3)), j + 1, 1) - 1, tabSource(i, 3)) - _
IIf(tabSource(i, 2) < DateSerial(Year(tabSource(i, 2)), j, 1), DateSerial(Year(tabSource(i, 2)), j, 1), tabSource(i, 2)) + 1Je peux produire un équivalent plus lisible qui ressemblerait à ça:
Dim jourFin, jourDeb
jourFin = tabSource(i, 3)
jourDeb = tabSource(i, 2)
If jourFin > DateSerial(Year(jourFin), j + 1, 1) - 1 Then
jourFin = DateSerial(Year(jourFin), j + 1, 1) - 1
End If
If jourDeb < DateSerial(Year(jourDeb), j, 1) Then
jourDeb = DateSerial(Year(jourDeb), j, 1)
End If
tabMois(lig, 4) = jourFin - jourDeb + 1Re,
Je viens de voir que tu avais complété ton message mon problème était bien là.
Je te remercie pour ton équivalent qui m'a permis d'être sûr d'avoir bien compris le fonctionnement de ton code.
Je t'embête une dernière fois avec une autre question :
Est-ce possible de ne pas compter les jours déjà compris dans d'autres ensembles ?
Par exemple, en Août le 17/08/2022 est compris dans l'autre période
Es-tu bien sûr de ne pas vouloir compter le 17/08 2 fois? il vient de la dérogation 52 alors que l'autre période vient de la dérogation 53, il ne faudrait pas compter pour les 2 dérogations?
Mon objectif final est de calculer pour chaque mois le nombre de jours avec dérogation et du coup le nombre de jour sans.
Il peut y avoir 2 dérogations le même jours comme dans cet exemple.
Mais au final si je le compte, le moi d'août ferai 32 jours
Oui tu as compris, l'erreur est présente dans chaque mois finalement...
Ce serait vraiment génial !
Encore une fois merci pour cette aide !
Dans ce cas j'ai deux solutions en tête pour le moment:
la première qui demande de lister les jours du mois, compter le nombre de lignes où le jour est compris entre la date de départ et la date de fin, renvoyer 1 si le résultat est supérieur à 0, et faire la somme de ces 1 (voir en dessous le listing pour le mois de janvier dans le fichier en pièce jointe).
la deuxième solution est une fonction que j'ai créé pour l'occasion (parce que pourquoi pas).
Elle fait plusieurs choses, tu lui donnes la plage de cellules (1 colonne) qui contient les dates de début, pareil pour les dates de fin, éventuellement la date de début de ta période, la date de fin de ta période (ici 1 janvier au 31 janvier).
Elle va stocker les dates dans des tableaux, changer les dates de début si elles sont inférieures au début de la période, changer également les dates de fin si elles dépassent la fin de la période.
Elle stocke les jours contenus entre les dates de début et de fin dans une collection, qui a la particularité de ne pas prendre les doublons (donc ne compte qu'une fois chaque jour), et je renvoie le nombre de jours dans la collection. Si tu ne précises pas de date de début de période, ça ne changera pas les dates de début de ta plage, idem pour la date de fin de période, ces valeurs sont optionnelles, donc en fonction de l'utilisation tu peux ne pas les préciser.
Voici le code de la fonction utilisée:
Function NBJOURSUNIQUE(ByVal PlageDateDebut As Range, ByVal PlageDateFin As Range, Optional ByVal dateMin, Optional ByVal dateMax)
Dim lig As Integer
Dim Jours As New Collection
Dim tabDebut, tabFin
If PlageDateDebut.Columns.Count > 1 Or PlageDateFin.Columns.Count > 1 Or _
Not PlageDateDebut.Rows.Count = PlageDateFin.Rows.Count Then Exit Function
tabDebut = PlageDateDebut
tabFin = PlageDateFin
If Not IsMissing(dateMin) Then
dateMin = CDate(dateMin)
For i = 1 To UBound(tabDebut, 1)
If CLng(tabDebut(i, 1)) < dateMin Then
tabDebut(i, 1) = dateMin
End If
Next i
End If
If Not IsMissing(dateMax) Then
dateMax = CDate(dateMax)
For i = 1 To UBound(tabFin, 1)
If CLng(tabFin(i, 1)) > dateMax Then
tabFin(i, 1) = dateMax
End If
Next i
End If
On Error Resume Next
For i = 1 To UBound(tabDebut, 1)
For x = CLng(tabDebut(i, 1)) To CLng(tabFin(i, 1))
Jours.Add x, CStr(x)
Next x
Next i
On Error GoTo 0
NBJOURSUNIQUE = Jours.Count
End Function
C'est PARFAIT j'imagine que tu y as passé du temps en plus tu me l'a bien expliqué : Chapeau bas
Je vais réussir à finir mon projet grâce à toi (j'utilise ta fonction) !
Je valide 2 de tes messages car je pense qu'ils sont complémentaires par rapport à ce que je souhaitais obtenir !
Merci bien l'ami !
Bonjour,
Content que ce que je propose puisse aider!
J'espère en effet que ça aidera bien pour ton projet
