Public Function СдвигПоРабочимДням(ИсходнаяДата As Date, Сдвиг As Integer) As Date
'Отсчитывает от даты нужное количество рабочих дней в любом направлении.
'ВНИМАНИЕ!!! Использует функцию "Выходной"
Dim D As Date, N As Integer, sg As Integer
D = ИсходнаяДата
N = Сдвиг
sg = Sgn(N)
While N <> 0
D = D + sg
If Not Выходной(D) Then N = N - sg
Wend
СдвигПоРабочимДням = D
End Function
Function Выходной(D As Date) As Boolean
'Определяет, выходной ли данная дата в США
Выходной = False
If WeekDay(D) = vbSaturday Or WeekDay(D) = vbSunday Then Выходной = True
If D = #1/1/1996# Then Выходной = True
If D = #2/19/1996# Then Выходной = True
'Дальше длинный-предлинный список американских праздников за много лет
If D = #11/25/2010# Then Выходной = True
If D = #12/24/2010# Then Выходной = True
End Function
Насущный вопрос касаемо даты в Экселе
Заранее спасибо.
1. Самому написать обычные формулы, которые будут учитывать необходимое количество подобных дней.
2. Более простой способ, это подключить надстройку Пакет анализа, которая предоставляет возможность использовать дополнительные функции. Вам в частности нужна функция =РАБДЕНЬ() возможна Вам также окажется полезна функция =ЧИСТРАБДНИ()
Цитата:
Originally posted by pashulka
В любом случае Вам придётся завести отдельные ячейки, которые будут хранить даты всех выходных и праздничных дней. А затем у Вас есть как минимум два пути :
1. Самому написать обычные формулы, которые будут учитывать необходимое количество подобных дней.
2. Более простой способ, это подключить надстройку Пакет анализа, которая предоставляет возможность использовать дополнительные функции. Вам в частности нужна функция =РАБДЕНЬ() возможна Вам также окажется полезна функция =ЧИСТРАБДНИ()
В любом случае Вам придётся завести отдельные ячейки, которые будут хранить даты всех выходных и праздничных дней. А затем у Вас есть как минимум два пути :
1. Самому написать обычные формулы, которые будут учитывать необходимое количество подобных дней.
2. Более простой способ, это подключить надстройку Пакет анализа, которая предоставляет возможность использовать дополнительные функции. Вам в частности нужна функция =РАБДЕНЬ() возможна Вам также окажется полезна функция =ЧИСТРАБДНИ()
Вот это полезная информация. Вы настоящий профессионал, я долго искал эту функцию, оказывается надо ыбло подключить "пакет анализа" :-)
Большое спасибо.
Но если праздничный день поподает на выходной, то ближайший рабочий тоже становится выходным, подскажите, как это можно реализовать?
или как сделать аналог ЧИСТРАБДНИ который не выбрасывает выходные а исключает только даты из массива праздников?
Мне по долгу работы приходится решать подобные задачи с американскими выходными, поэтому никакие российские надстройки мне, очевидно, не подходили. Я для себя решил эту проблему так:
то можно учитывать и российское изобретение связанное с переносом выходного на следующий день, если он приходится на праздник.
Надо писать в условиях типа
If D = #1/1/1996# Then Выходной = n + 1
естественно сперва n=0, потом проверка на субботу и воскресенье с аналогичным инкрементом, а потом все российские праздники перебрать (их по моему штук 10)
В основной же функции СдвигПоРабочимДням() надо сравнивать возврат из Выходной на > 0 и из N вычитать произведение sg * Выходной(Дата)
то можно учитывать и российское изобретение связанное с переносом выходного на следующий день, если он приходится на праздник.
Надо писать в условиях типа
If D = #1/1/1996# Then n = n + 1
....
Выходной = n
естественно сперва n=0, потом проверка на субботу и воскресенье с аналогичным инкрементом, а потом все российские праздники перебрать (их по моему штук 10)
В основной же функции СдвигПоРабочимДням() надо сравнивать возврат из Выходной на > 0 и из N вычитать произведение sg * Выходной(Дата)
Нет, не очень хорошая идея.
Со всякими переносами поступать надо так.
Допустим, в этом году, 4 ноября пришлось на субботу, и выходным стал понедельник, 6 ноября. Тогда просто:
Код:
If D = #11/6/2006# Then Выходной = True
(кстати, у меня, если кто не понял, американский формат даты - месяц впереди)
Более хитрый случай: 9 мая попало на вторник. Тогда 6 мая, суббота, стал рабочим днём, а 8 мая, понедельник, - выходным. Это аукнется в программе тремя строчками:
Код:
If D = #5/6/2006# Then Выходной = False
If D = #5/8/2006# Then Выходной = True
If D = #5/9/2006# Then Выходной = True
If D = #5/8/2006# Then Выходной = True
If D = #5/9/2006# Then Выходной = True
Теперь комментарии, почему я назвал предложение Serzh не очень удачными.
1. Хочется, чтобы функция правильно работала, и когда ИсходнаяДата является выходным днём.
2. Упаси вас Бог пытаться обрабатывать праздники из года в год автоматически. Наша дума не дремлет. За последние 5 лет не было двух подряд лет с одинаковым набором праздников. Ввели 23 февраля, отменили 12 декабря и 2-е мая, перенесли 7 ноября на 4-е. Про новогодние каникулы я вообще молчу. Уж на что в американских выходных больше постоянства, и то я избежал этого соблазна - там тоже бывают изменения.
Большое спасибо!
Замедленная реакция!!:D Можно было вообще не отвечать!!