| Главная » Статьи » Функции |
Работаем с датой
| Выходной/рабочий день с учетом рабочих суббот и праздников: =ЕСЛИ(ЕНД(ВПР(B3;N:N;1;0))=ЛОЖЬ;"выходной";ЕСЛИ(ЕНД(ВПР(B3;M:M;1;0))=ЛОЖЬ;"рабочий";ЕСЛИ(ДЕНЬНЕД(B3;2)>5;"выходной";"рабочий"))) Public Function ЕСЛИРАБДЕНЬ(ByRef день As Double, ByRef праздники As Range, ByRef рабочие_выходные As Range) As Byte 'определяет рабочий ли день - 1 или нет - 0 v_search_result = Application.Match(день, рабочие_выходные, 0) If Not IsError(v_search_result) Then ЕСЛИРАБДЕНЬ = 1: Exit Function v_search_result = Application.Match(день, праздники, 0) If Not IsError(v_search_result) Then ЕСЛИРАБДЕНЬ = 0: Exit Function If Weekday(день, vbMonday) < 6 Then ЕСЛИРАБДЕНЬ = 1: Exit Function End Function Следующий рабочий день, если есть рабочие субботы, но НЕ воскресенья. =ЕСЛИ(СУММЕСЛИ(L:L;B3+1)>0;СУММЕСЛИ(L:L;B3+1);РАБДЕНЬ(B3;1;$M$2:$M$35)) =ЕСЛИ(ЕНД(ВПР(B3+1;L:L;1;0));РАБДЕНЬ(B3;1;$M$2:$M$35);ВПР(B3+1;L:L;1;0)) Public Function РАБДЕНЬСРАБВЫХ(ByRef день As Double, ByVal число_дней%, ByRef праздники As Range, ByRef рабочие_выходные As Range) As Double 'определяет рабочий отстоящий на указанное кол-во раб.дней Dim i%, n% 'n - кол-во рабочих ней с начальной даты If число_дней > 0 Then Do While n <> число_дней i = i + 1 If ЕСЛИРАБДЕНЬ(день + i, праздники, рабочие_выходные) Then n = n + 1 Loop РАБДЕНЬСРАБВЫХ = день + i ElseIf число_дней < 0 Then Do While n <> число_дней i = i - 1 If ЕСЛИРАБДЕНЬ(день + i, праздники, рабочие_выходные) Then n = n - 1 Loop РАБДЕНЬСРАБВЫХ = день + i Else РАБДЕНЬСРАБВЫХ = ЕСЛИРАБДЕНЬ(день, праздники, рабочие_выходные) End If End Function Прошло рабочих дней с начала месяца: =ЧИСТРАБДНИ(КОНМЕСЯЦА(B3;-1)+1;B3;$S$2:$S$100)+СЧЁТЕСЛИМН(R:R;">="&КОНМЕСЯЦА(B3;-1)+1;R:R;"<="&B3) | |
| Просмотров: 397 | | |
| Всего комментариев: 0 | |