3 votes

Calculer l'heure de début + les heures avec les jours et heures de travail.

J'ai le problème suivant :

En G4 J'ai 19/01/2016 10:00

En F4 J'ai la valeur 200 (units)

En E4 J'ai la valeur 38 (minutes)

Je veux calculer G4 + (E4*F4) c'est-à-dire 19/1/16 10:00 + 7,600 minutes mais sur la base d'une semaine de travail de :

Monday to Thursday 8am-5pm & Friday 8am-1pm

montrant ainsi la valeur de 09/02/2016 13:40

1voto

Engineer Toast Points 4317

Je comprends le problème comme suit :

  • Il existe un programme de production fixe qui ne se déroule qu'à certaines périodes de temps et certains jours.
  • Nous ne tiendrons pas compte des temps morts, des déjeuners, des pauses, etc. et supposerons que la ligne de production fonctionne en permanence pendant cette période de travail.
  • Nous avons une heure de départ donnée, un nombre d'unités à produire et un temps de production pour chaque unité.
  • Nous devons savoir quand la production sera terminée.

ÉTAPE 1

Installez une table pour votre programme

Faites un tableau qui a un calendrier de deux semaines. Nous avons besoin d'un calendrier de deux semaines, car nous pouvons ainsi choisir la première date de début correspondante (comme un mardi), puis inclure les sept lignes suivantes et savoir que nous avons une semaine de travail complète (comme un mardi - lundi). Si vous n'aviez pas le calendrier deux fois et que vous commenciez un vendredi, vous obtiendriez un jour et ensuite un tas de lignes vides. Veillez à inclure le samedi et le dimanche. Voici un aperçu de la table que j'ai appelée tblSchedule :

tblSchedule

... et la version CSV (le temps est indiqué comme une fraction de jour) :

Weekday,Day,Start Time,Work Hours
1,Sunday,0,0
2,Monday,0.333333333333333,9
3,Tuesday,0.333333333333333,9
4,Wednesday,0.333333333333333,9
5,Thursday,0.333333333333333,9
6,Friday,0.333333333333333,5
7,Saturday,0,0
1,Sunday,0,0
2,Monday,0.333333333333333,9
3,Tuesday,0.333333333333333,9
4,Wednesday,0.333333333333333,9
5,Thursday,0.333333333333333,9
6,Friday,0.333333333333333,5
7,Saturday,0,0

ÉTAPE 2

Installez une table pour vos productions

Vous avez déjà le début de celui-ci. Nous allons ajouter quelques champs et je suppose que vous utilisez un tableau réel (ruban Insertion > Tableau). Si ce n'est pas le cas, tout fonctionnera mais la compréhension des formules sera plus difficile car il s'agira d'un ensemble de références de cellules au lieu de noms de champs. Les tableaux sont géniaux. Voici un instantané de ce que j'ai appelé tblProduction (Notez que mon système utilise le format non-ISO pour les dates de l'année. m/d/yyyy parce que l'Amérique).

tblProduction

... et la ligne d'en-tête du CSV :

Min / Unit,Qty Units,Start,Production Time (hrs),Weeks,Days,Hours,End

ÉTAPE 3

Ajoutez vos formules

Temps de production (heures)

=[@[Min / Unit]]*[@[Qty Units]]/60

Celui-ci est assez explicite. Le seul problème est que nous convertissons les minutes en heures, car le reste des calculs se fera en heures.

Semaines

=[@[Production Time (hrs)]]/(SUM(tblSchedule[Work Hours])/2)

Il s'agit simplement de convertir les heures en semaines de travail. Notez que nous devons diviser la somme de toutes les heures de travail d'une semaine par 2 parce que notre programme est de deux semaines et non d'une seule.

Jours

=MATCH(TRUE,INDEX((SUBTOTAL(9,OFFSET(tblSchedule[Work Hours],WEEKDAY([@Start])-1,0,ROW($A$1:$A$7)))-ROUND((((((TIME(HOUR([@Start]),MINUTE([@Start]),SECOND([@Start])))-INDEX(tblSchedule[Start Time],WEEKDAY([@Start])-1))*24))+(MOD([@Weeks],1)*(SUM(tblSchedule[Work Hours])/2))),2))>=0,0),0)-1

Celui-ci est le gros monstre. Il peut être divisé en plusieurs parties si cela peut aider, mais j'essayais de le garder comme un beau produit fini et je me suis dit que votre ami ne voudrait pas de toutes ces colonnes supplémentaires. Si tu devais le décomposer, ça pourrait ressembler à quelque chose comme ça :

Expanded Days Formula

... et la ligne d'en-tête du CSV :

Days,Start Time,Work Start Time,Hours in Last Week,Hours from Start of Last Week

Heure de début

=TIME(HOUR([@Start]),MINUTE([@Start]),SECOND([@Start]))

Heure de début des travaux

=INDEX(tblSchedule[Start Time],WEEKDAY([@Start])-1)

Heures de la semaine dernière

=MOD([@Weeks],1)*(SUM(tblSchedule[Work Hours])/2)

Heures depuis le début de la semaine dernière

=ROUND(((([@[Start Time]]-[@[Work Start Time]])*24)+[@[Hours in Last Week]]),2)

Cette dernière formule est celle dont nous avons vraiment besoin. Si vous développez dans ces colonnes, la formule pour Days serait la suivante :

=MATCH(TRUE,INDEX((SUBTOTAL(9,OFFSET(tblSchedule[Work Hours],WEEKDAY([@Start])-1,0,ROW($A$1:$A$7)))-[@[Hours from Start of Last Week]])>=0,0),0)-1

L'idée de base est de trouver le premier jour du calendrier où le total des heures de travail du jour de départ est supérieur au nombre d'heures dont nous avons besoin pour terminer la production. C'est ce que MATCH(TRUE,INDEX((SUBTOTAL()-[Hours Left])>=0,0),0)-1 fait. Le site SUBTOTAL fait un peu de magie avec OFFSET et renvoie un tableau de valeurs. Ces valeurs sont le total des heures de travail à la fin du premier jour, du deuxième jour, du troisième jour, etc. Soustrayez les heures qu'il nous reste à travailler et vous obtenez des nombres positifs ou négatifs (ou zéro, d'où l'expression "heures de travail"). >=0 au lieu de seulement >0 ). INDEX renvoie un tableau de FALSE y TRUE donc MATCH trouve le premier TRUE valeur. Puisque nous cherchons à savoir combien plus jours dont nous avons besoin que le premier jour, soustrayez-en un à la fin. C'est un processus compliqué pour arriver à un seul nombre entre 0 et 6.

Heures

=(MOD([@Weeks],1)*(SUM(tblSchedule[Work Hours])/2))-IF([@Days]=0,0,SUM(OFFSET(tblSchedule[Work Hours],WEEKDAY([@Start])-1,0,[@Days])))

Le début de celui-ci est juste comme le Hours in Last Week formule que nous avons utilisée ci-dessus. Le site IF à la fin soustrait les heures de travail entre le premier jour et le dernier jour, exclusivement. Si nous commençons le mardi et finissons le vendredi, soustrayez le mercredi et le jeudi. Cela nous donne les heures que nous devons travailler le dernier jour (qui peut être le même que le premier jour).

Fin

=[@Start]+7*TRUNC([@Weeks])+[@Days]+[@Hours]/24

Date de début + 7 * (nombre de semaines sous forme d'un nombre entier, en laissant tomber la fraction) + Jours + (heures converties en une valeur décimale de jours) = Date et heure et fin de la production.


RÉSUMÉ

Oui, ce sont de grandes formules. Cependant, j'ai fait en sorte qu'elles soient faciles à maintenir et j'ai testé quelques cas limites différents pour que je pense que tout fonctionne correctement. Si votre ami veut une feuille soignée, utilisez la grande formule de Days . S'il en veut une qu'il peut expliquer plus facilement, utilisez la version avec plusieurs formules d'aide.


ADDITION

Pour ce que cela vaut, votre ami peut également ajouter des facteurs du monde réel comme le taux de rebut prévu et les temps d'arrêt (y compris les pauses prévues). Voici un exemple qui tient compte de ces facteurs avant ils sont introduits dans les formules compliquées ci-dessus.

Reject Rate

Taux de rejet

Saisi manuellement en tant que pourcentages.

Temps de production (heures)

=[@[Min / Unit]]*([@[Qty Units]]/(1-[@[Reject Rate]]))/60

Downtime

Heures normales

Saisi manuellement. Mêmes valeurs que celles utilisées dans les exemples originaux ci-dessus.

Temps d'arrêt

Saisi manuellement comme un nombre d'heures, et non comme un pourcentage. Vous pouviez le modifier pour qu'il soit un pourcentage, mais les heures étaient plus faciles à afficher.

Heures de travail

=[@[Standard Hours]]-[@Downtime]

Notez que cela peut fausser l'heure de fin réelle du dernier jour de production. Les formules supposeront que vous commencez à 8 heures du matin et travaillez pendant X heures alors qu'en réalité il y a une pause quelque part au milieu. Cela fonctionnera quand même pour une approximation.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X