При разработке рабочего листа вам может потребоваться знать последний рабочий день данного месяца. Предполагая, что ваши рабочие дни идут с понедельника по пятницу, следующая формула вернет желаемую дату:

=DATE(YEAR(A1),MONTH(A1)+1,0)-(MAX(0,WEEKDAY (DATE(YEAR(A1),MONTH(A1)+1,0),2)-5))

Эта формула возвращает дату только с понедельника по пятницу и всегда последний такой день в месяце, представленном датой в A1. Для некоторых целей вам может потребоваться знать, какая последняя пятница каждого месяца. Это легко определить с помощью этой формулы:

=DATE(YEAR(A1),MONTH(A1)+1,0)-WEEKDAY(DATE (YEAR(A1),MONTH(A1)+1,0))+(WEEKDAY(DATE (YEAR(A1),MONTH(A1)+1,0))>5)*7-1

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

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

Следующий макрос возвращает дату с понедельника по пятницу, которая представляет последний рабочий день. Дата сравнивается со списком праздников (HolidayList), который должен быть именованным диапазоном в вашей книге. Если выясняется, что дата является выходным днем, то конечный рабочий день уменьшается до тех пор, пока не будет найден подходящий день.

Function LastWorkDay(lRawDate As Long, _     Optional rHolidayList As Range, _     Optional bFriday As Boolean = False) As Long

LastWorkDay = DateSerial(Year(lRawDate), _       Month(lRawDate) + 1, 0) - 0     If bFriday Then         LastWorkDay = MakeItFriday(LastWorkDay)

Else         LastWorkDay = NoWeekends(LastWorkDay)

End If

If Not rHolidayList Is Nothing Then         Do Until myMatch(LastWorkDay, rHolidayList) = 0             LastWorkDay = LastWorkDay - 1             If bFriday Then                 LastWorkDay = MakeItFriday(LastWorkDay)

Else                 LastWorkDay = NoWeekends(LastWorkDay)

End If         Loop     End If End Function
Private Function myMatch(vValue, rng As Range) As Long     myMatch = 0     On Error Resume Next     myMatch = Application.WorksheetFunction _         .Match(vValue, rng, 0)

On Error GoTo 0 End Function
Private Function NoWeekends(lLastDay As Long) As Long     NoWeekends = lLastDay     If Weekday(lLastDay) = vbSunday Then _       NoWeekends = NoWeekends - 2     If Weekday(lLastDay) = vbSaturday Then _       NoWeekends = NoWeekends - 1 End Function
Private Function MakeItFriday(lLastDay As Long) As Long     MakeItFriday = lLastDay     While Weekday(MakeItFriday) <> vbFriday         MakeItFriday = MakeItFriday - 1     Wend End Function

Обратите внимание, что включены три закрытые функции. Эти функции вызываются из основной функции LastWorkDay. Первый, myMatch, является «оболочкой» для обычного метода Match. Это использование включено из-за необходимой обработки ошибок.

Вторая функция, NoWeekdends, используется для резервного копирования даты до предыдущей пятницы, если это просто суббота или воскресенье. Функция MakeItFriday используется, чтобы гарантировать, что дата всегда будет пятницей.

Чтобы использовать эту определяемую пользователем функцию из рабочего листа, используйте ее в формуле, например:

=LastWorkDay(A1, HolidayList, TRUE)

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

Если этот параметр указан, то функция гарантирует, что любая возвращаемая ею дата не находится в списке дат в HolidayList.

Последний параметр также необязателен; это может быть ИСТИНА или ЛОЖЬ.

(Значение по умолчанию, если оно не указано, — ЛОЖЬ.) Если для этого параметра установлено значение ИСТИНА, функция всегда возвращает последнюю пятницу месяца. Если этот параметр имеет значение ИСТИНА и указан HolidayList, функция возвращает последнюю непраздничную пятницу месяца.

_Примечание: _

Если вы хотите узнать, как использовать макросы, описанные на этой странице (или на любой другой странице на сайтах ExcelTips), я подготовил специальную страницу, содержащую полезную информацию.

link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера].

ExcelTips — ваш источник экономичного обучения Microsoft Excel.

Этот совет (2452) применим к Microsoft Excel 97, 2000, 2002 и 2003. Вы можете найти версию этого совета для ленточного интерфейса Excel (Excel 2007 и новее) здесь:

link: / excelribbon-The_Last_Business_Day [Последний рабочий день].