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.

19test-date.xlsm (25.47 Ko)
9test-date-1.xlsm (34.74 Ko)

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 :

capture

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:

image

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:

11test-date-1.xlsm (34.74 Ko)

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)) + 1

Je 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 + 1

Re,

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 ce qui fait un peut trop...

Ah oui je vois,

dans ce cas on a le même souci pour janvier par exemple:

image

On a le 06/01 qui revient deux fois, les jours du 18/01 au 26/01

Si j'ai bien compris je peux commencer à réfléchir à des solutions et les proposer en une fois pour voir laquelle est préférée.

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
14test-date-1.xlsm (39.15 Ko)

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

Rechercher des sujets similaires à "compter nombre jours concernes parmis periodes"