Wypracuj czas rozpoczęcia + godziny z dniami i godzinami pracy

3

Mam następujący problem:

W G4 mam19/01/2016 10:00

W F4 mam wartość200 (units)

W E4 mam wartość38 (minutes)

Chcę obliczyć G4 + (E4*F4)IE 19/1/16 10:00 + 7,600 minutes, ale opiera się na tydzień roboczy:

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

dlatego pokazuje wartość 09/02/2016 13:40

spitfireblue
źródło
1
Czy to pytanie do pracy domowej?
Xavierjazz,
Nie, próbuję pomóc przyjacielowi, który chce obliczyć, ile czasu zajmie wyprodukowanie x ilości określonego produktu, który produkuje jego firma.
spitfireblue
Nie sądzę, że byłoby to łatwe, ponieważ różna liczba godzin pracy naprawdę komplikuje twój problem. Możesz to zrobić za pomocą kilku komórek pomocniczych (oblicz liczbę minut pozostałych do końca dnia / tygodnia) lub musisz napisać niestandardową funkcję (makro).
Máté Juhász

Odpowiedzi:

1

Rozumiem problem:

  • Istnieje ustalony harmonogram produkcji, który występuje tylko w określonych przedziałach czasowych w określone dni
  • Zignorujemy przestoje, lunch, przerwy itp. I założymy, że linia produkcyjna działa cały czas w tym okresie pracy
  • Mamy określony czas rozpoczęcia, liczbę jednostek do wyprodukowania i czas do wyprodukowania każdej jednostki
  • Musimy dowiedzieć się, kiedy zakończy się produkcja

KROK 1

Ustaw tabelę dla swojego harmonogramu

Stwórz tabelę z dwutygodniowym harmonogramem. Musimy to potrwać dwa tygodnie, ponieważ w ten sposób możemy wybrać pierwszą pasującą datę rozpoczęcia (jak wtorek), a następnie uwzględnić kolejne 7 wierszy i wiedzieć, że mamy pełny tydzień pracy (jak wtorek - poniedziałek). Jeśli nie miałeś harmonogramu dwa razy i zacząłeś w piątek, dostałeś jeden dzień, a potem kilka pustych wierszy. Pamiętaj, aby uwzględnić sobotę i niedzielę. Oto migawka tabeli, do której zadzwoniłem tblSchedule:

tblSchedule

... i wersja CSV (czas jest wyświetlany jako ułamek dnia):

Dzień tygodnia, dzień, godzina rozpoczęcia, godziny pracy
1, niedziela, 0,0
2, poniedziałek, 0.333333333333333,9
3, wtorek, 0.333333333333333,9
4, środa, 0.333333333333333,9
5, czwartek, 0,3333333333333333,9
6, piątek, 0.333333333333333,5
7, sobota, 0,0
1, niedziela, 0,0
2, poniedziałek, 0.333333333333333,9
3, wtorek, 0.333333333333333,9
4, środa, 0.333333333333333,9
5, czwartek, 0,3333333333333333,9
6, piątek, 0.333333333333333,5
7, sobota, 0,0

KROK 2

Skonfiguruj tabelę dla przebiegów produkcyjnych

Masz już początek tego. Dodamy kilka pól i zakładam, że używasz rzeczywistej tabeli (Wstaw wstążkę> Tabela). Jeśli tego nie zrobisz, wszystko będzie nadal działać, ale zrozumienie formuł będzie trudniejsze, ponieważ będzie to wiązka odwołań do komórek zamiast nazw pól. Stoły są niesamowite. Oto migawka tego, co nazwałem tblProduction: (Zwróć uwagę, że mój system używa formatu innego niż ISO dla dat, m/d/yyyyponieważ Ameryka.)

tblProdukcja

... i wiersz nagłówka CSV:

Min / Jednostka, Ilość jednostek, Początek, Czas produkcji (godz.), Tygodnie, Dni, Godziny, Koniec

KROK 3

Dodaj swoje formuły

Czas produkcji (godz.)

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

Ten jest dość oczywisty. Jedyną sztuczką jest to, że konwertujemy z minut na godziny, ponieważ reszta matematyki wykorzysta godziny.

Tygodnie

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

To po prostu przekształca się z godzin w tygodnie pracy. Pamiętaj, że musimy podzielić sumę wszystkich godzin pracy w tygodniu przez 2, ponieważ nasz harmonogram to dwa tygodnie, a nie tylko jeden.

Dni

=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

Ten jest wielkim potworem. Może to zostać podzielone na kilka części, jeśli to pomoże, ale starałem się zachować go jako fajny gotowy produkt i pomyślałem, że twój przyjaciel nie chciałby tam wszystkich dodatkowych kolumn. Jeśli masz zamiar to zrobić, może wyglądać mniej więcej tak:

Formuła dni rozszerzonych

... i wiersz nagłówka CSV:

Dni, czas rozpoczęcia, czas rozpoczęcia pracy, godziny w ostatnim tygodniu, godziny od początku ostatniego tygodnia

Czas rozpoczęcia

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

Czas rozpoczęcia pracy

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

Godziny w zeszłym tygodniu

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

Godziny od początku ostatniego tygodnia

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

Ta ostatnia formuła jest tą, której naprawdę potrzebujemy. Jeśli rozwiniesz się do tych kolumn, formuła Daysbędzie następująca:

=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

Podstawową ideą jest znalezienie pierwszego dnia w harmonogramie, kiedy łączna liczba godzin pracy od dnia początkowego jest większa niż liczba godzin potrzebnych do zakończenia produkcji. Właśnie to MATCH(TRUE,INDEX((SUBTOTAL()-[Hours Left])>=0,0),0)-1robi. SUBTOTALFunkcja robi trochę magii OFFSETi zwraca tablicę wartości. Te wartości to łączna liczba godzin pracy do końca pierwszego dnia, drugiego dnia, trzeciego dnia itd. Odejmij liczbę godzin pozostałych do pracy, a otrzymasz liczbę dodatnią lub ujemną (lub zero, stąd >=0zamiast po prostu >0). INDEXzwraca tablicę FALSEi TRUEtak MATCHznajduje pierwszą TRUEwartość. Ponieważ zastanawiamy się, ile więcejdni, których potrzebujemy, niż tylko pierwszy dzień, odejmij jeden na końcu. Dotarcie do pojedynczej liczby od 0 do 6 to skomplikowany proces.

godziny

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

Początek tego jest podobny do Hours in Last Weekpowyższej formuły. IFOświadczenie na koniec odejmuje się liczbę godzin pracy między pierwszym dniu i ostatnim dniu, wykluczają. Jeśli zaczniemy od wtorku do piątku, odejmijmy środę i czwartek. To daje nam godziny, które musimy przepracować ostatniego dnia (który może być taki sam jak pierwszego dnia).

Koniec

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

Data rozpoczęcia + 7 * (liczba tygodni jako liczba całkowita, pomniejszona o ułamek) + dni + (godziny przeliczone na wartość dziesiętną dni) = data i godzina oraz koniec produkcji.


PODSUMOWANIE

Tak, to są wielkie formuły. Uczyniłem jednak dość łatwym utrzymanie i przetestowanie kilku różnych przypadków brzegowych, więc myślę, że wszystko działa poprawnie. Jeśli twój przyjaciel chce porządnego arkusza, użyj dużej formuły dla Days. Jeśli chce, może łatwiej wyjaśnić, użyj wersji z kilkoma formułami pomocniczymi.


DODANIE

Za to, co jest warte, twój przyjaciel może również dodać w świecie rzeczywistym czynniki, takie jak oczekiwana szybkość złomowania i czas przestoju (w tym planowane przerwy). Oto przykład, który uwzględnia te, zanim zostaną wprowadzone do skomplikowanych formuł powyżej.

Reject Rate

Reject Rate

Wpisane ręcznie jako wartości procentowe.

Czas produkcji (godz.)

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

Przestoje

Standardowe godziny pracy

Wpisano ręcznie. Te same wartości, które zastosowano w oryginalnych przykładach powyżej.

Przestoje

Wprowadzany ręcznie jako liczba godzin, a nie jako procent. Możesz go zmienić na procent, ale godziny były łatwiejsze do wyświetlenia.

Godziny pracy

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

Pamiętaj, że może to zepsuć faktyczny czas zakończenia ostatniego dnia produkcji. Formuły zakładają, że zaczynasz o 8 rano i pracujesz przez X godzin, kiedy naprawdę jest gdzieś przerwa w środku. Jednak nadal będzie działać w przybliżeniu.

Inżynier Toast
źródło