Трюк №77. Как в Excel определить количество указанных дней в любом месяце
При создании приложений с возможностями календаря, в частности платежных ведомостей, иногда нужно знать, сколько раз данный день недели встречался в определенном месяце. Хотя в Excel много функций даты и времени, на данный момент не существует функции, которая, например, сказала бы, сколько понедельников будет в январе 2005 года. Чтобы узнать это, можно использовать много функций даты и времени Excel с глубокой вложенностью, но, к сожалению, как можно представить, это будет весьма громоздкий и неуклюжий процесс.
VBA поможет упростить сложную задачу. Вместо того чтобы нащупывать нужную комбинацию сложных функций, можно написать пользовательскую функцию, которая будет выполнять ту же задачу, и все, что нужно сделать, — ввести день и дату, для которой нужно выполнить функцию.
Для определения количества дней в определенном месяце можно воспользоваться следующей функцией. Например: =HowManyDaysInMonth("l/12/03";"wed")
вернет 5, так как в декабре 2003 года было пять сред. (Обратите внимание, что дату нужно указывать в местном формате, например, в США это 12/1/03. В примере формат даты показан для Австралии.) Схожим образом следующая функция: =HowManyDaysInMonth("1/12/03";"thu")
вернет 4, так как в декабре 2003 года было четыре четверга.
Чтобы использовать эту пользовательскую функцию в рабочей книге, сначала необходимо поместить следующий код в стандартный модуль. Откройте рабочую книгу, куда нужно поместить код, и выберите команду Разработчик → Visual Basic (Developer → Visual Basic) (сочетание клавиш Alt/Option+Fll). Затем выберите команду Insert > Module и вставьте код, приведенный в листинге 6.3.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | //Листинг 6.3 Function HowManyDaysInMonth(FullDate As String, sDay As String) As Integer Dim i As Integer Dim iDay As Integer, iMatchDay As Integer Dim iDaysInMonth As Integer Dim FullDateNew As Date iMatchDay = Weekday(FullDate) Select Case UCase(sDay) Case "SUN" iDay = 1 Case "MON" iDay = 2 Case "TUE" iDay = 3 Case "WED" iDay = 4 Case "THU" iDay = 5 Case "FRI" iDay = 6 Case "SAT" iDay = 7 End Select iDaysInMonth = Day(DateAdd("d", -1, DateSerial _ (Year(FullDate), Month(FullDate) + 1, 1))) FullDateNew = DateSerial(Year(FullDate), Month(FullDate), iDaysInMonth) For i = iDaysInMonth - 1 To 0 Step -1 If Weekday(FullDateNew - i) = iDay Then HowManyDaysInMonth = HowManyDaysInMonth + 1 End If Next i End Function |
Закройте окно, чтобы вернуться в Excel. Теперь введите функцию в любую ячейку, как показано ранее, и Excel возвратит число, указывающее, сколько раз указанный день встречался в указанном месяце.