Calculer le nombre d’heures ouvrées entre deux dates

Tout à fait, qu'elle soit nommée ou pas d'ailleurs. Si tu la nommes, tu peux éventuellement la nommer en dynamique, c'est une liste susceptible d'évoluer.

Bonjour M.F,

j'ai donc nommé "NonOuv" la liste des jours fériés de façon dynamique, et intégré cette liste en 4ème argument de la fonction DTTROT, dont j'ai corrigé le code sur tes indications,

et bonne nouvelle , CA FONCTIONNE !!!!!

Je te remercie pour ton aide dans la résolution de ce problème.

Si tu passes un jour dans le 06 du côté de Grasse, n'hesites pas à m'envoyer un mp, nous irons partager une mousse

Je télécharge le fichier corrigé qui pourra ainsi servir à d'autres au cas où.

PS :

Si toutefois tu avais encore quelques minutes-heures ... à consacrer à ce sujet, et afin que je puisse utiliser cette fonction personnalisée pour d'autres ateliers, il ne manque que la rotation "Journée" correspondant à des horaires d'ouverture de 8h00 à 15h35 du lundi au vendredi.

Merci encore.

Acropoter

Bonjour,

Il est certainement possible d'ajouter un cas à la fonction qu'elle pourra traiter dans les mêmes conditions... un petit délai car j'ai un problème de fuite de machine à laver à régler d'urgence .

Si tu passes un jour dans le 06 du côté de Grasse,

C'est dans l'ordre des possibilité ! étant niçois, j'y reviens normalement tous les ans pour environ deux mois...

Cordialement.

Bonjour cher MF.

je reviens à la charge , car je voulais savoir si tu avais eu le temps de modifier le code pour qu'il fonctionne avec une 4ème rotation possible biennommée "journée" correspondant à des horaires ouverture d'atelier comprises entre 8H00 et 15H40 du lundi au vendredi ?

Par ailleurs j'ai appliqué le code à un atelier fonctionnant en "3_8we", et je me suis rendu compte d'un bug quand les heures bornes saisies sont entre 21h00 et 24h00 le dimanche. J'ai cherché pourquoi et je pense que cela vient d'un mauvais énoncé de ma part concernant les horaires d'ouverture du dimanche pour une rotation en "3_8we", qui sont en fait de 8h30 à 24h00 et non pas de 8h30 à 21h00.

Par contre je ne sais pas corriger le code ...

Pourrais tu stp me dire quelles lignes modifiées et par quoi ?

Merci d'avance

Acropoter

Bonjour,

Désolé pour le délai, mais j'ai dû m'absenter du Forum depuis la mi-février, et je reprends tout doucement en commençant par absorber les messages accumulés avant de faire le point sur les questions à traiter...

Je regarder les modifications à faire dès que possible.

Cordialement.

Ok pas de souci.

Welcome back et merci

Yvan

Bonjour,

J'ai repris ci-joint ton tableau "source" des horaires. J'ai rectifié l'heure fermeture du dimanche en 3_8we de 21:00 en 24:00.

A noter qu'elle est également de 21:00 pour le vendredi et samedi. Est-ce maintenu ?

De même l'heure d'ouverture pour samedi et dimanche est 08:25. Est-ce bien maintenu ou faut-il passer à 08:30 ?

J'ai également ajouté les horaires "journée" dans le tableau, selon tes indications.

Globalement, vérifie et confirme les horaire du tableau. Je rectifierai la fonction à partir du tableau validé.

Cordialement.

Bonjour,

le tableau des horaires me semble juste.

Pour formuler différemment, en rotation type 3*8we, il y a 3 équipes qui travaillent en semaine H24 du dimanche soir 21h00 au vendredi soir 21h00, et 1 équipe qui ne travaille que le samedi et dimanche de 8h30 à 21h00. L’atelier n’est donc fermé que du vendredi 21h00 à samedi 8h30 et du samedi 21h00 au dimanche 8h30.

J’ai arrondi à 8h30 pour faire simple.

J’avais commencé de mon côté à créer une table avec tous les jours de l’année et le mode de rotation pour chacun, pour ne pas avoir à changer la formule de case trop souvent lorsque le mois de mars fut perturbé par les épisodes neigeux exceptionnels .... mais je me suis embrouillé dans mes modifications de formules lorsque le premier et le dernier jour sont de rotation différents et j’ai abandonné, me convaincant qu’il s.agissait la d’exception.

À bientôt.

Si l'on prend 08:30, on n'aura pas les mêmes résultats qu'avec 08:25 !

Il faut savoir quel est l'horaire !

Hello, alors restons sur 8h25.

Bonjour,

J'ai pris un peu de temps pour profiter de l'inclusion d'une 4e rotation pour essayer de réduire assez sensiblement le code de la fonction, et dans le même temps faciliter sa maintenance en cas de changements dans les horaires.

Pour cela, en début de fonction on établit 2 tableaux à 7 éléments pour y consigner les heures d'ouverture et de fermeture de chacun des jours de la semaine pour la rotation indiquée. Si le jour n'est pas ouvrable, la mention "non" remplace l'horaire.

Pour ne travailler qu'avec des entiers dans la phase intermédiaire, et dans la mesure où il demeure à peu près certain que l'on ne fixera pas d'horaire sur des intervalles inférieurs à 5 minutes, on convertit les horaires en unités correspondant chacune à 5 minutes : donc un nombre variant de 0 à 288 (l'horaire 00:00 de fin de journée est naturellement traduit par 288...)

L'ordre des jours dans les tableaux va du samedi (indice 0) au vendredi (indice 6).

En cas de changements d'horaires, on n'aura donc qu'à modifier les valeurs de constitution des tableaux horaires des différentes rotations pour que la fonction continue de fonctionner... (la conversion en unités de 5 min relevant d'un calcul mental assez simple, pas de difficulté particulière pour ce faire).

Ayant constitué ces tableaux en début de fonction pour la rotation retenue, on n'a plus à se préoccuper des différents cas de rotation, et on ne se préoccupe plus non plus des cas à distinguer selon les jours, le codage du jour correspondant aux indices des tableaux horaires.

J'en ai en principe terminé mais il est préférable que je teste les différents cas qui sont nombreux... Je laisse un peu décanter, mais tu pourras donc en disposer sous peu.

Bon dimanche.

Bonjour,

Très curieux de voir cette nouvelle mouture.

Bonne semaine

Premiers tests (sur les 4 rot.), durée sur 3 jours, le jour intermédiaire étant férié : résultats exacts !

Après débogage toutefois !

Il est rare de ne pas avoir d'erreur au premier lancement, dès lors que le code est un peu étoffé... Quand il m'arrive de ne pas en avoir, je me demande toujours quelle erreur cachée pourrait surgir ultérieurement...

Je poursuivrais demain...

Vu l'erreur (une condition sur les fériés mal positionnée) et vu que les résultats sont exacts après correction, alors qu'on passe sur presque tous les blocs de calcul (sauf le cas ou début et fin sont sur le même jour), il est possible qu'il n'y en ait pas d'autre, mais mieux vaut étendre un peu les tests pour s'en assurer...

Mais tu l'auras demain, donc ! Ou même aujourd'hui vu l'heure.

Bonjour,

Un petit souci à régler et je refléchis à la façon de le régler le plus économiquement possible pour tous les cas...

Cela tient au fait que dans le cadre de chaque rotation, pour vérifier la cohérence de la saisie, on vérifie que l'heure de début n'est pas supérieure ou égale à l'heure de fermeture et que l'heure de fin n'est pas inférieure ou égale à l'heure d'ouverture. Si une telle situation est détectée, la fonction renvoie #N/A.

NB- Ces situations n'empêcheraient pas le calcul, cependant incluant une journée en début ou fin où le nb d'heures travaillées serait égal à 0, cela révèle une incohérence de la saisie sur laquelle il convient d'appeler l'attention de l'utilisateur afin qu'il élimine cette incohérence.

Le problème est lié au fait que pour une journée dont la fermeture est à minuit, quelle que soit la façon de saisir, la valeur résultante sera 00:00 le lendemain.

Cela n'a pas d'incidence pour le test sur l'horaire de début qui, dans le cas d'une fermeture à minuit, laquelle est notée 288 (=24:00) dans nos tableaux d'horaires fermeture, ne pourra jamais être égal ni supérieur à cette valeur.

Par contre le test sur l'heure de fin, si celle-ci est à minuit, pourra faire apparaître celle-ci égale à l'heure d'ouverture lorsque cette dernière est à 00:00. Pour ne pas renvoyer d'erreur dans ce cas licite, j'associais la condition à celle que l'heure d'ouverture soit supérieure à 0, ainsi l'égalité de l'heure de fin à une heure d'ouverture à 00:00 n'était pas rejetée si elle correspondait à une heure plausible à minuit...

Ceci fonctionne en situation normale mais provoque deux cas d'anomalies qui ne sont pas pris en compte lorsqu'interviennent des jours non ouvrables. Ainsi, heure de fin à minuit entraînera d'une part un rejet erroné si le jour qui suit n'est pas ouvrable, mais d'autre part une acceptation lorsque le jour qui précède n'est pas ouvrable alors que cette situation devrait être rejetée.

Il faut donc ajouter un certain nombre de conditions pour ajuster ces cas ou bien voir si l'on peut confiner les calculs dans la journée précédente lorsqu'une fin est à minuit. Désolé de prendre un temps supplémentaire pour évaluer la solution la plus simple à mettre en place... Il s'agit de situations marginales mais dès lors qu'elles sont possibles il convient qu'elles soient prises en considération.

Cordialement.

Bonsoir,

L'option consistant à basculer le jour de fin sur la veille lorsque l'heure est à 0, est apparue la plus opérationnelle : cela permet d'unifier les conditions ultérieures sans avoir à tester des exceptions. Donc un code plus homogène...

J'ai eu un peu de débogage à faire après ajustement du code, une variable non ajustée, soit un point de détail, mais aussi et surtout il est apparu que ma rectification d'hier était incomplète. Ces points réglés les tests semblent concluants. Je n'ai pas testé absolument tous les cas mais l'éventail traité laisse penser que les probabilités de nouvelles erreurs sont très faibles. A surveiller toutefois lorsque l'on a des situations horaires marginales, car en la matière on ne sait jamais...

Tu trouveras la fonction dans le classeur joint. J'ai ajouté des commentaires, contrairement à mes habitudes, pour pouvoir assurer la maintenance si des critères horaires de calculs sont modifiés, de façon à identifier ce que fait chaque partie du code.

Si l'on doit modifier des bases de calculs, les modifications seront à opérer dans la partie citée ci-dessous qui se trouve en début de fonction :

    'Paramétrages horaires selon rotation
    Select Case LCase(rot)
        Case "2_8"
            ouv = Array("non", "non", 72, 72, 72, 72, 72)
            fer = Array("non", "non", 246, 246, 246, 246, 246)
        Case "3_8"
            ouv = Array("non", 252, 0, 0, 0, 0, 0)
            fer = Array("non", 288, 288, 288, 288, 288, 252)
        Case "3_8we"
            ouv = Array(101, 101, 0, 0, 0, 0, 0)
            fer = Array(252, 288, 288, 288, 288, 288, 252)
        Case "journée"
            ouv = Array("non", "non", 96, 96, 96, 96, 96)
            fer = Array("non", "non", 188, 188, 188, 188, 188)
        Case Else
            DTTROT = CVErr(xlErrRef): Exit Function
    End Select

Il s'agit de la constitution des tableaux horaires d'ouverture et fermeture pour chaque rotation : ces tableaux listent les horaires de chaque jour de la semaine du Samedi au Vendredi, horaires convertis en unités représentant 5 minutes (de 0 à 288 donc), ainsi que je l'avais déjà indiqué.

On note que lorsque la correspondance de la rotation cherchée n'est pas trouvée, la fonction renverra l'erreur #REF! L'utilisateur, dans ce cas devra vérifier la rotation qu'il a placée en argument dans la formule.

Dans le cas d'une erreur #N/A, c'est que l'un des horaires au moins n'est pas conforme à la rotation...

Si une erreur #VALEUR! apparaît, c'est que la fonction est mal utilisée, que les arguments fournis ne sont pas du type voulu, ou mal positionnés... Mais si tout paraît en ordre, ce peut être aussi une erreur d'exécution nécessitant de se repencher sur le code (me saisir, naturellement, si un tel cas survient).

Cordialement.

Rechercher des sujets similaires à "calculer nombre heures ouvrees entre deux dates"