Calcul du nbr de jour par mois de plusieurs entrées de date

Résolu
stitchbouck Messages postés 137 Statut Membre -  
ccm81 Messages postés 11033 Statut Membre -

Bonjour,

Je cherche un moyen de calculer le nombre de jours contenu entre plusieurs entrées de date par rapport à un mois donné.

Le tableau se compose d'une date de début et d'une date de fin par ligne, l'écart pouvant courir sur plusieurs mois. Ca ne déborde pas d'une année sur l'autre, mais il n'y a pas de régularité, ni d'ordre dans les dates (pas de tri possible) : Je peux avoir la 1ère ligne avec une date de début en mars 2023, une date de fin en avril 2023 et la 4ème ligne peut proposer une date en janvier 2023 et une date de sortie en février 2023.

Pour chaque mois, je cherche à avoir le nombre de jour qui le concerne, toutes lignes confondues. Dans le vrai tableau , les dates sont sur une feuille mais le résultat attendu est sur une autre du même classeur. 

Exemple ici .

https://cjoint.com/c/MDsocAUPGXD

Pouvez-vous m'aider ? Et en espérant avoir été clair...

En vous remerciant !!
Windows / Edge 112.0.1722.48

10 réponses

  1. ccm81 Messages postés 11033 Statut Membre 2 434
     

    Salut PapyLuc51

    Pas mal du tout ta méthode et (surtout) ta formule !

    Comme je ne pense pas trouver plus simple, je me suis lancé dans une solution macro qui évite le tableau intermédiaire (à tester bien sûr : pour les quelques exemples du fichier, on est d'accord sur le résultat, c'est déjà pas mal)

    https://www.cjoint.com/c/MDsszthbBTB

    Cdlmnt

    0
  2. PapyLuc51 Messages postés 4569 Date d'inscription   Statut Membre Dernière intervention   1 511
     

    Salut à tous

    ccm81 je ne sais pas de quelle formule tu parles.

    Si c'est celle du tableau elle n'est pas de moi ; je l'avais récupérée en 2017 dans une discussion.

    Je crois que notre ami stitchbouck cherche a faire une concaténation pour avoir le détail par mois. Dans mon premier envoi cette concaténation n'affichait pas le 0 alors j'ai modifié la formule du tableau pour le faire apparaitre s'il y a 0 jour dans le mois concerné.

    J'ai également modifié la formule de concaténation pour supprimer le s de jrs lorsqu'il n'y a que 0 ou 1 jour.

    stitchbouck si c'est bien ce que tu cherches à faire, la formule de concaténation est déjà longue pour 4 lignes ça ne pourra se jouer que sur un minimum de lignes.

    Mon essai 2 https://www.cjoint.com/c/MDteGKiVXkU

    Cordialement

    0
  3. tricolore56 Messages postés 4 Statut Membre 1
     

    Bonjour à tous,

    une autre suggestion

    AS

    https://cjoint.com/c/MDte433bX2U

    0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. stitchbouck Messages postés 137 Statut Membre 2
     

    Bonjour,

    Vous êtes trop fort(e)s !!! En effet, l'ajout d'un tableau pour décomposer les mois me convient moins et comme vous me permettez plusieurs solutions, je vais travailler sur la macro ! 

    Et si je bute dessus, grâce à vous j'ai d'autres méthode possible avec vos formules et en masquant la feuille qui recevra la décomposition des dates. je n'ai pas tout capter, ni dans les formules ni dans la macro, mais j'y travaille.

    Un trèèèèès grand merci à vous, je m'en vais déchiffrer cela !

    ++

    0
  6. ccm81 Messages postés 11033 Statut Membre 2 434
     

    Bonjour

    Si tu optes pour la macro

    1. La fonction personnalisée nbj se comporte comme une fonction excel, tu peux l'utiliser sur une autre feuille sans problème.

    par exemple =nbj(Feuil1!$B$3:$C$8;Feuil2!A3)

    2. Elle est à tester bien sûr

    3. Alt-F11 pour accéder au code (dans le Module 1)

    Bonne journée

    0
  7. PapyLuc51 Messages postés 4569 Date d'inscription   Statut Membre Dernière intervention   1 511
     

    Salut à tous,

    stitchbouck, j'ai vu que tu voulais privilégier une macro. 

    J'ai continué dans l'emploi de tableaux intermédiaires pour arriver à une concaténation qui ne mentionne que les N° où il y a au moins 1 jour ; s'il n'y a pas de jour sur le mois ça inscrit "Aucun jour".

    Je trouve que c'est plus aéré.

    A toi de voir si tu peux/veux concrétiser ça dans ton code

    https://www.cjoint.com/c/MDvfEjxUzBU

    Cordialement

    0
    1. stitchbouck Messages postés 137 Statut Membre 2
       

      Merci infiniment pour vos recherches !!! 

      je vais rester sur la macro, je comprends mieux ce qu'elle fait que les formules (que je garde parce que je ne suis pas  à l'abri d'en avoir besoin !)

      Encore merci !

      0
  8. stitchbouck Messages postés 137 Statut Membre 2
     

    @ccm81 StatutMembre En effet ça fonctionne mais il y a un résultat erroné, erreur dont je ne trouve pas la source.

    Tous les mois sont correctement pris en compte, sauf le 12ème qui indique un nombre de jour sans avoir de date correspondante... J'ai anonymisé le fichier final (j'ai supprimé quelques colonnes et feuilles annexes aussi) pour être aussi proche que possible de l'utilisation finale, mais je ne pense pas que le fichier y soit pour quelque chose.

    Je déchiffre une bonne partie du code (du moins je le pense) mais je ne comprends pas encore à quoi fait référence "dd"  (les autres déclarations sont comprises.)

    Ce qui fait que les deux lignes m=m1 et m=m2 ne me sont pas claires : je comprends pourquoi elles existent, à quoi elles font références (les sélections des dates de début et dates de fin) mais pas la résolution du calcul.

    Apparemment "n" à un rôle de mémoire ? avec "n", on calcule toutes les lignes pour un même mois donné et sans le "n" on obtient bêtement le nombre de jours dans un mois donné. je suppose donc que "n" permet de garder le nbre de jour de la première ligne et de l'additionner au nbr de jour des lignes suivantes, toujours pour un mois donné.

    Ci joint le fichier :

    https://cjoint.com/c/MDymRmLVABD

    Je veux bien un coup de main pour trouver pourquoi décembre compte 47 jours sans aucune date impliquant ce mois-là. Si vous supprimez toutes les dates en feuille "2023" , le calcule remonte 56 jours.

    Merci beaucoup !!

    0
    1. stitchbouck Messages postés 137 Statut Membre 2
       

      Je viens de comprendre !!! Ce sont les cases vides ! 

      si m1 = m2 alors

         si m = m1 alors n = d2-d1 +1

      Donc 0-0+1... donc 1 par ligne.. je peux peut-être débloquer le truc tout seul, je reviens vers vous.

      0
  9. ccm81 Messages postés 11033 Statut Membre 2 434
     

    Bonjour

    Effectivement le cas des cellules dates vides n'étatit pas prévu !

    Juste un petit test à ajouter

    Public Function nbj(plage As Range, d As Date) As Long
    Dim m1 As Long, m2 As Long, m As Long, n As Long
    Dim d1 As Date, d2 As Date, li As Long, nbli As Long
    Dim j1 As Long, a1 As Long, dd As String
    nbli = plage.Rows.Count
    m = Month(d)
    n = 0
    For li = 1 To nbli
      If plage.Cells(li, 1) <> "" And plage.Cells(li, 2) <> "" Then
        d1 = plage.Cells(li, 1).Value
        d2 = plage.Cells(li, 2).Value
        m1 = Month(d1)
        m2 = Month(d2)
        j1 = Day(d1)
        a1 = Year(d1)
        If m1 = m2 Then
          If m = m1 Then n = n + d2 - d1 + 1
        Else
          If m = m1 Then dd = a1 & "/" & m & "/" & finmois(a1, m): n = n + CDate(dd) - d1 + 1
          If m = m2 Then dd = a1 & "/" & m & "/01":   n = n + d2 - CDate(dd) + 1
        End If
        If m > m1 And m < m2 Then
          n = n + finmois(a1, m)
        End If
      End If
    Next li
    nbj = n
    End Function

    Cdlmnt

    0
    1. ccm81 Messages postés 11033 Statut Membre 2 434
       
          If m1 = m2 Then
            If m = m1 Then n = n + d2 - d1 + 1
          Else
            If m = m1 Then dd = a1 & "/" & m & "/" & finmois(a1, m): n = n + CDate(dd) - d1 + 1
            If m = m2 Then dd = a1 & "/" & m & "/01":   n = n + d2 - CDate(dd) + 1
          End If
          If m > m1 And m < m2 Then
            n = n + finmois(a1, m)
          End If

      1. n est un totalisateur comme tu l'as compris

      2. . si m1 = m2  = m > les deux dates ont le même mois et si le mois m concerné (m) est le même, on ajoute à n la différence de dates +1

      3.   If m = m1 Then dd = a1 & "/" & m & "/" & finmois(a1, m): n = n + CDate(dd) - d1 + 1

      si le mois concerné est celui de la date de début, dd est la date de fin de ce mois et le nombre de jours de d1 à dd se calcule de la même façon

      4. même chose si m = m2, mais dd est la date de début de mois

      Cdlmnt

      0
  10. stitchbouck Messages postés 137 Statut Membre 2
     

    C'est exactement ça et je ne cherchais pas dans la bonne direction pour la solution. 

    Désolé, j'espérais mettre en scène tous les cas de figures mais j'ai oublié le cas des cases vides...

    Merci !!

    0