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
:
... 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/yyyy
ponieważ Ameryka.)
... 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:
... 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 Days
bę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)-1
robi. SUBTOTAL
Funkcja robi trochę magii OFFSET
i 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 >=0
zamiast po prostu >0
). INDEX
zwraca tablicę FALSE
i TRUE
tak MATCH
znajduje pierwszą TRUE
wartość. 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 Week
powyższej formuły. IF
Oś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
Wpisane ręcznie jako wartości procentowe.
Czas produkcji (godz.)
=[@[Min / Unit]]*([@[Qty Units]]/(1-[@[Reject Rate]]))/60
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.