Как я могу разработать формулу рабочей смены, которая может иметь четыре возможности выхода - PullRequest
0 голосов
/ 07 июля 2019

Я пытался разработать формулу в Excel для расчета рабочей смены по дате и времени, однако у меня возникли некоторые проблемы при попытке добиться эффективной, некоторые из них следующие:

-Продолжительность формулы во времени коротка.

-Это должно быть полностью оправдано, чтобы работать нормально, требует много вычислений и все еще имеет короткий срок действия.

Теперь маркеры для определения формулы следующие:

-Выход должен быть любой из «1», «2», «3» и «4» с его условиями, условия следующие:

* 1 - это смена, где вы работаете с 6:10 до 6:10 вечера, с воскресенья по вторник и в среду, когда вы работаете одну неделю, а другую - нет. (В этом году номер недели в году должен быть парным, чтобы вы работали в смену 1 в среду, в непарную, которую вы не делаете)

* 2 - смена, в которой вы работаете с 6:10 до 6:10, с четверга на субботу и среду. Вы чередуете день со сменой 1, пример смены 1 работал одну неделю в среду, затем вы работаете в следующую. среда.

* 3 - это смена места работы с 6:10 до 6:10, с воскресенья по вторник и в среду, когда вы работаете одну неделю, а другую - нет.

* 4 - это смена, когда вы работаете с 6:10 вечера до 6:10 утра, с четверга по субботу и среду, когда вы чередуете день со сменой 3, пример смены 3 работал одну неделю в среду, затем вы работаете в следующую. среда.

Я пробовал обусловливать, и оно работает, но в нем есть два момента, которые я объясняю в этом вопросе. при условии, что вы получите его на работу, как 3 года. Я ищу синтезированный способ вычисления его с двумя переменными (дата и время), который действительно завершен, и, возможно, проанализирую, как это сделать.

Следующая формула (в ячейке F14 есть дата и время, их можно разделить, с этим нет проблем): = ЕСЛИ (И (ДЕНЬНЕД (F14) <= 3, VALUE (ПРАВЫЙ (ROUND (F14,5), 6))> 6,16666666 / 24, ЗНАЧЕНИЕ (ПРАВЫЙ (ROUND (F14,5), 6)) <+18,16666666 / 24 ), "Т1", ЕСЛИ (И (ДЕНЬНЕД (F14)> = 5, ЗНАЧЕНИЕ (ПРАВЫЙ (ROUND (F14,5), 6))> 6,16666666 / 24, ЗНАЧЕНИЕ (ПРАВЫЙ (ROUND (F14,5), 6) ) <18.16666666 / 24), "Т2", ЕСЛИ (И (ДЕНЬНЕД (F14) = 4, ЗНАЧЕНИЕ (ПРАВЫЙ (ROUND (F14,5), 6))> 6,16666666 / 24, ЗНАЧЕНИЕ (ПРАВЫЙ (ROUND (F14,5 ), 6)) <+18,16666666 / 24, ЗНАЧЕНИЕ (ПРАВЫЙ (ГОД (F14) / 2,2)) = 0,5, ЗНАЧЕНИЕ (ПРАВЫЙ (ROUND (НОМНЕДЕЛИ (F14) / 2,2), 2)) <> 0,5) , "Т1", ЕСЛИ (И (ДЕНЬНЕД (F14) = 4, ЗНАЧЕНИЕ (ПРАВЫЙ (ROUND (F14,5), 6))> 6,16666666 / 24, ЗНАЧЕНИЕ (ПРАВЫЙ (ROUND (F14,5), 6)) < 18.16666666 / 24, ЗНАЧЕНИЕ (ПРАВЫЙ (ROUND (НОМНЕДЕЛИ (F14) / 2,2), 2)) = 0,5), "Т2", ЕСЛИ (И (ДЕНЬНЕД (F14) = 1, ЗНАЧЕНИЕ (ПРАВЫЙ (ROUND (F14, 5), 6)) <6,16666666 / 24), "Т4", ЕСЛИ (И (ДЕНЬНЕД (F14) <= 4, ЗНАЧЕНИЕ (ПРАВЫЙ (ROUND (F14,5), 6)) <6,16666666 / 24), "Т3 », "N")))))) </p>

1 Ответ

0 голосов
/ 07 июля 2019

Итак, я должен быть немного честным. Я имел полное намерение пройтись по вашей формуле, выяснить, почему мы получили разные результаты, и объяснить, что произошло. Но я не мог оставаться сосредоточенным, и мой разум начал перемещаться к более приятным вещам, таким как реакция на письма ТСЖ, уплата налогов и решение Пи. Так что я этого не делал .... Идем дальше!

Кажется, я поняла, что тебе нужно. Всего четыре смены, по две смены в день. Смены 1 и 3 работают с воскресенья по вторник, 1 начинается в 06:10 и освобождается в 18:10, когда начинается смена 3. Это похоже на смены 2 и 4, их дни с четверга по субботу, и у них одинаковые часы. Среды чередуются между двумя группами: 1 и 3 - среда, когда номер недели делится на две. Смены 2 и 4 сменяют среду.

Вы можете увидеть мои данные испытаний на изображении ниже, и я думаю, что вы найдете результаты в соответствии с моим объяснением. Вы заметите, что слева от даты есть столбец данных, а другой справа. Это потому, что я тестировал два разных метода. Результаты совпадают, поэтому я уверен в качестве своей работы и надеюсь, что вы направитесь в правильном направлении.

В столбце слева от дат используется очень короткая формула:

=CoveringShift(B1)

А в столбце справа от дат используется гораздо более длинная формула:

=IF(WEEKDAY(B1)<>4,IF(WEEKDAY(B1)<=3,IF(AND(TIME(HOUR(B1),MINUTE(B1),0)>=TIME(6,10,0),TIME(HOUR(B1),MINUTE(B1),0)<TIME(18,10,0)),1,3),IF(AND(TIME(HOUR(B1),MINUTE(B1),0)>=TIME(6,10,0),TIME(HOUR(B1),MINUTE(B1),0)<TIME(18,10,0)),2,4)),IF(ISEVEN(WEEKNUM(B1)),IF(AND(TIME(HOUR(B1),MINUTE(B1),0)>=TIME(6,10,0),TIME(HOUR(B1),MINUTE(B1),0)<TIME(18,10,0)),1,3),IF(AND(TIME(HOUR(B1),MINUTE(B1),0)>=TIME(6,10,0),TIME(HOUR(B1),MINUTE(B1),0)<TIME(18,10,0)),2,4)))

Test Date

Хорошо, хорошо, вы меня поймали. Я использовал VBA для создания пользовательской функции. Это код:

Option Explicit

Public Function CoveringShift(TimeQuery As Date) As Single
    Dim AM As Date
    Dim PM As Date
    Dim Shifts As String
    Dim iVal As Integer
    AM = TimeSerial(6, 10, 0)
    PM = TimeSerial(18, 10, 0)
    iVal = Application.WorksheetFunction.WeekNum(TimeQuery)
    Select Case Weekday(TimeQuery, vbSunday)
        Case 1 To 3
            Shifts = "1,3"
        Case 5 To 7
            Shifts = "2,4"
        Case 4
            If iVal / 2 - Int(iVal / 2) = 0 Then
                Shifts = "1,3"
            Else
                Shifts = "2,4"
            End If
        Case Else
            MsgBox "Something bad happened"
    End Select
    Select Case TimeValue(TimeQuery)
        Case Is < AM
            Shifts = Right(Shifts, 1)
        Case AM To DateAdd("s", -1, PM)
            Shifts = Left(Shifts, 1)
        Case Is >= PM
            Shifts = Right(Shifts, 1)
        Case Else
            MsgBox "Something bad happened"
    End Select
    CoveringShift = CSng(Shifts)
End Function

Лично я предпочитаю чистоту и удобочитаемость UDF; но иногда багаж VBA не стоит перевозить.

Надеюсь, это как-то помогло!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...