Трюк №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 возвратит число, указывающее, сколько раз указанный день встречался в указанном месяце.

Top