1 (изменено: Евген, 2012-12-06 08:38:50)

Тема: VBS: Определение последнего рабочего дня в месяце

Сегодня поставили задачу, отправлять базу в последний рабочий день месяца, начал рыться в календарях и органайзерах - нет такого события и определения, для того, чтобы запланировать напоминалку, поэтому решил нацарапать сам скриптец для оного определения. Воткнул в шедулер и забыл
Получилось вот что... (может кому пригодиться)

currDay=Date()
currMonth=Month(currDay)
currYear=Year(currDay)

If currMonth=12 Then
    currMonth=1
    currYear=currYear+1
Else
    currMonth=currMonth+1
End If

LastDay=DateAdd("d",-1,DateSerial(currYear,currMonth,1))
currMonth=Month(LastDay)
currYear=Year(LastDay)

For i=Day(LastDay) To 1 Step -1
    oneDay=Weekday(DateSerial(currYear,currMonth,i),2)
        If oneDay>=1 and oneDay<=5 Then
            If DateSerial(currYear,currMonth,i)=currDay Then
                Msgbox "Сегодня последний рабочий день месяца !!!" & VbCr & "Нужно отправить базу по очереди !!!"
            End If
            Exit For
        End If
Next
Времени не хватает... :-(

2 (изменено: yuriy2000, 2012-12-06 20:46:15)

Re: VBS: Определение последнего рабочего дня в месяце

Сперва нужно правильно сформулировать задачу,  а то  может получится как в этом описании "покрышка на веревке":

А  что если в конце месяца будут праздничные дни или суббота/воскресенье будут рабочими?


функция, приведенная ниже, вернет последний рабочий "понедельник-пятницу" в этом месяце.


function LastWDay(dDate)
       ' получаем последний день месяца
       LastWDay=DateAdd("m",1,dDate)-day(dDate)
       ' если попадаем на субботу/воскресенье, то пару шагов назад
       if WeekDay(LastWDay,2)>5 then LastWDay=LastWDay-(WeekDay(LastWDay,2)-5)

end function

если нужен реально последний рабочий день - то нужно добавить проверку по словарю...

3

Re: VBS: Определение последнего рабочего дня в месяце

Функция с использованием словаря исключений. в 2013 году таких исключений пока не запланировано.


Function LastWDay(dDate)
'------------------------------------------------------------
' возвращает последний рабочий день месяца для указанной даты
'------------------------------------------------------------
    ' xDays - словарь нестандартных дней 
    ' записываем в него праздники (1) или "черные" суб/вск (0)
    Dim xDays : set xDays = CreateObject("Scripting.Dictionary")
    xDays(#2012-04-30#)=1
    xDays(#2012-04-28#)=0
    xDays(#2012-12-31#)=1
    xDays(#2012-12-29#)=0


    ' получаем последний день месяца
    LastWDay=DateAdd("m",1,dDate)-day(dDate)

    do while true          
       if xDays.Exists(LastWDay) then 
          ' Проверим по словарю:
          ' если это рабочий день, то , выходим
          if xDays(LastWDay)=0 then Exit Do
          ' праздник? ищем дальше
          LastWDay=LastWDay-1            
       elseif WeekDay(LastWDay,2)>5 then
          ' если попадаем на выходные, то шаг назад
          LastWDay=LastWDay-1 
       else
           Exit Do
       end if
    loop 
End Function

4

Re: VBS: Определение последнего рабочего дня в месяце

Праздничных дней, приходящихся на конец месяца в 2013 году нет.
Вот источник http://eduscan.net/help/images/calendar2013.png

Времени не хватает... :-(