Excel : Nombre de jours entre deux dates

Résolu
maloplekxus -  
Marco9233 Messages postés 1 Statut Membre -
Bonjour,

Mon problème est un peu plus complexe que ce laisse entendre le titre. Malheureusement je n'ai pas réussi à le résoudre avec un simple datedif(). Ainsi je m'en remet à vous.

Sous excel j'ai une base des accidents du travail, dans laquelle j'ai des accidents avec arrêt. Afin de réaliser des statistiques, je cherche à savoir par exemple combien de jour la personne à été arrêté au mois de février et combien de jours pour le mois de mars, sachant que sa période d'arrêt à débuté le 22/02 et se termine le 15/03.

Cordialement,

8 réponses

  1. f894009 Messages postés 17417 Date d'inscription   Statut Membre Dernière intervention   1 717
     
    Bonjour,

    Pour du VBA:

    'd pour jour
    x = DateDiff("d", "22/02/2012", "15/03/2012")

    Bonne suite
    0
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    Bonjour
    en A1 début ITT
    en B1 fin ITT

    pour février ( à mettre au format-nombre standard)
    =SI(NB(A1:B1)<2;"";SI(MOIS(B1)>MOIS(A1);FIN.MOIS(A1;0)-A1;B1-A1))
    tu peux trouver pour Mars sur le m^me principe

    si version XL <2007:
    outils-macros complémentaires-activer utilitaire d'analyse pou la foncction FIN.MOIS
    Michel
    0
  3. maloplekxus
     
    Merci à tous pour vos réponse,

    Michel_m, votre formule fonctionne mis à part qu'il manque un jour. Néanmoins mon besoin est je crois encore un peu différent. En effet je peux avoir un accident avec arrêt, dont l'arrêt va du 14/01/2012 au 5/06/2012. Les données dont j'ai besoin dans le cas présent sont le nombre de jour d'arrêt en janvier(18), le nombre pour février (29), le nombre pour mars (31), etc...

    A force de me torturer l'esprit j'ai trouvé quelque du même style que michel_m :

    =SI(ET(A1<A2;B1>B2);(B1-A1)-(A2-A1)-(B1-B2);
    (SI(ET(A1>=A2;B1<=B2);(B1-A1);
    (SI(ET(A1>=A2;A1<B2;B1>B2);(B1-A1)-(B1-B2);
    (SI(ET(A1<A2;B1>A2;B1<=B2);(B1-A1)-(A2-A1);"")))))))

    A1 correspond à la date de début d'arrêt et B1 la date de fin d'arrêt.
    A2 correspond à la date du 01/02/2012 et B2 à la date du 01/03/2012.
    Cet exemple est donc valable pour le mois de février. si je veux pour mars je modifie A2 et B2.

    Cette formule n'étant valable que pour un at et pour un mois, serait il possible de la créer en vba avec des plages ? si oui pouvez vous m'aider ?
    Si vous le souhaiter je peux vous mettre le classeur en exemple, dite moi seulement où je peux l'héberger.

    Cordialement.
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Bonjour,
      pour joindre une pièce
      mettre le classeur sans données confidentielles, au format Excel 97-2003, en pièce jointe sur
      https://www.cjoint.com/
      et faire un clic droit sur le lien proposé puis "copier l'adresse du lien" et coller dans le message de réponse

      j'ai trouvé quelque du même style que michel_m :
      j'crois pas que ca soit mon style!!! :o) mais c'est pas grave

      Il manque un jour effectivement si on fait la différence de date, on ne compte pas le dernie rjour, excuses moi.
      0
    2. maloplekxus
       
      voici le lien pour télécharger mon fichier http://cjoint.com/data3/3CuoKaJEzb5.htm. J'ai supprimé les données confidentielles et je l'ai épuré pour ne laisser que ce qui peut vous interesser.
      0
    3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      pièce jointe illisible car format Xl2007

      POURTANT JE L'AVAIS PRÉCISÉ EN GRAs

      abandon du suivi
      0
    4. maloplekxus
       
      Fichier en excel 1997-2003 : http://cjoint.com/?3CutG3gA6yx

      Dsl pour mon inattention par rapport au format attendu

      Cordialement,
      0
  4. maloplekxus
     
    Voila ce que j'ai tenté jusqu'à présent sans grand succés

    Function nombre_jours_arret_janvier(date1, date2)

    Dim annee
    annee = Sheets("TABBORD MCP").Range("o2").Value 'variable annee correspond à valeur entrée manuellement sur la feuille TABBORD MCP, cellule O2

    nombre_jours_arret_janvier = IF(AND(date1<01/01/2012;date2>01/02/2012);(date2-date1)-(01/01/2012-date1)-(date2-01/02/2012);(IF(AND(date1>=01/01/2012;date2<=01/02/2012);(date2-date1);(IF(AND(date1>=01/01/2012;date1<01/02/2012;date1>01/02/2012);(date2-date1)-(date2-01/02/2012);(IF(AND(date1<01/01/2012;date2>01/01/2012;date2<=01/02/2012);(date2-date1)-(01/01/2012-date1);"")))))))

    End Function


    date1 --> début de l'arrêt de travail
    date2 --> fin de l'arrêt de travail

    Avec la variable annee, je souhaiterais en plus pouvoir mettre la date 01/01 ou 01/02 + annee (2012 ou 2013, etc)

    Le but final serait d'avoir un classeur modèle, que l'on copi-colli et renomme en début d'année, mais qui doit donc être intemporel. Cela permet de garder un classeur vierge qui reste valable année après année et je ne veux pas que l'utilisateur est besoin de modifier quoi que ce soit dans vba.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. maloplekxus
     
    J'ai tenté de retravailler mon code, mais au finale j'obtiens 0.
    Pouvez vous m'aidez s'il vous plaît, je n'arrive pas à identifier mes erreurs.

    Function nombre_jours_arret_janvier(date1, date2)

    Dim annee
    Dim debut_mois_janvier as date
    Dim fin_mois_janvier as date
    annee = Sheets("TABBORD MCP").Range("o2").Value 'variable annee correspond à valeur entrée manuellement sur la feuille TABBORD MCP, cellule O2
    debut_mois_janvier = "01/01/" & annee
    fin_mois_janvier = "01/02/" & annee

    If (date1 < debut_mois_janvier) And (date2 > fin_mois_janvier) Then
    nombre_jours_arret_janvier(date1, date2) = (date2 - date1) - (debut_mois_janvier - date1) - (date2 - fin_mois_janvier)

    ElseIf (date1 >= debut_mois_janvier) And (date2 <= fin_mois_janvier) Then
    nombre_jours_arret_janvier(date1, date2) = (date2 - date1)

    ElseIf (date1 >= debut_mois_janvier) And (date1 < fin_mois_janvier) And (date1 > fin_mois_janvier) Then
    nombre_jours_arret_janvier(date1, date2) = (date2 - date1) - (date2 - fin_mois_janvier)

    ElseIf (date1 < debut_mois_janvier) And (date2 > debut_mois_janvier) And (date2 <= fin_mois_janvier) Then
    nombre_jours_arret_janvier(date1, date2) = (date2 - date1) - (debut_mois_janvier - date1)

    Else
    nombre_jours_arret_janvier(date1, date2) = ""
    End If

    End Function
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      t'es pas obligé de tenir compte de mes indications pour joindre un fichier...

      Ciao
      0
  7. maloplekxus
     
    finalement je ne suis pas passé par la création une fonction sur vba, mais juste par des formules.

    Pour janvier, j'ai indiqué dans deux cellules :
    - A2 =dateval("01/01/"&'feuil1'!a1)
    - B2 =dateval("01/02/"&'feuil1'!a1)

    'feuil1'a1 correspond a l'année concerné. Cette cellule est mise à jour manuellement.

    ensuite je travaille avec la formule suivante que je peux ensuite étirer comme je le souhaite :
    - =SI(ET($A1<$A$2;$B1>$B$2);($B1-$A1)-($A$2-$A1)-($B1-$B$2);
    (SI(ET($A1>=$A$2;$B1<=$B$2);($B1-$A1);
    (SI(ET($A1>=$A$2;$A1<$B$2;$B1>$B$2);($B1-$A1)-($B1-$B$2);
    (SI(ET($A1<$A$2;$B1>$A$2;$B1<=$B$2);($B1-$A1)-($A$2-$A1);"")))))))

    Je joint le classeur en exemple pour ceux qui pourraient en avoir besoin.

    http://cjoint.com/?BCvlETfd4Ll : classeur excel 2007
    http://cjoint.com/?BCvlFNJCG7F : classeur excel 97-2003

    Cordialement,
    0
  8. Marco9233 Messages postés 1 Statut Membre
     
    J'ai eu le même problème, donc j'apporte ma contribution, vu que je me suis servi de ce qui a été partagé ci-dessus.

    Calcul du nombre de jour d'arrêt, par mois.

    En B6 Date de début (ex : 01/01/2012)
    En C6 Date de fin (ex : 10/02/2012)
    En D6 résultat Nb jours en janvier
    En E6 résultat Nb jours en février
    En F6 résultat Nb jours en mars
    En G6 résultat Nb jours en avril
    etc.

    Formule pour le calcul du nombre de jour en février :
    =SI(FIN.MOIS($B$6;1)>$C$6;$C$6-$B$6-SOMME($D$6:D6)+1;FIN.MOIS($B$6;1)-$B$6-SOMME($D$6:D6)+1)
    La première réponse au test sert pour le dernier mois
    La deuxième réponse au test, sert pour les mois précédent le dernier mois.
    Ainsi la même formule s'adapte en fonction des dates entrées. Ici elle revoie 29.

    Pour mars, changer FIN.MOIS($B$6;1) par FIN.MOIS($B$6;2) (ici, renvoie 10)
    Pour avril, changer FIN.MOIS($B$6;1) par FIN.MOIS($B$6;3) (ici, renvoie 0)
    0
  9. gbinforme Messages postés 14930 Date d'inscription   Statut Contributeur Dernière intervention   4 744
     
    bonjour,

    Il te faut combiner datdif avec fin.mois pour avoir les résultats.
    -1