Код, о котором идет речь, идиотский - он был четко написан кем-то, кто не имел ни малейшего представления о датах VBA, который уже знает все, что нужно без необходимости кодировать это дерьмо в CASE SELECT.
Это выражение даст вам количество дней в месяце:
Day(DateAdd("m", 1, DateValue(Month(Date()) & "/1/" & Year(Date()))) - 1)
Для этого нужно получить первое число текущего месяца, добавить к нему месяц (первое число следующего месяца), а затем вычесть 1 из него. Так как целочисленная часть типа даты VBA - это дневная часть, вы получите последний день текущего месяца. Затем вы берете результат и извлекаете день с помощью функции Day ().
Кодирование как функция:
Function DaysInMonth(ByVal dteDate As Date) As Integer
Dim dteFirstOfMonth As Date
Dim dteLastOfMonth As Date
dteFirstOfMonth = DateValue(Month(dteDate) & "/1/" & Year(dteDate))
dteLastOfMonth = DateAdd("m", 1, dteFirstOfMonth) - 1
DaysInMonth = Day(dteLastOfMonth)
End Function
Вы также можете кодировать это, используя тот факт, что функция DateSerial () обрабатывает нулевой день как последний из предыдущего месяца:
Function DaysInMonth(ByVal dteDate As Date) As Integer
Dim dteOneMonthFromDate As Date
Dim dteLastOfThisMonth As Date
dteOneMonthFromDate = DateAdd("m", 1, dteDate)
dteLastOfThisMonth = DateSerial(Year(dteOneMonthFromDate), Month(dteOneMonthFromDate), 0)
DaysInMonth = Day(dteLastOfThisMonth)
End Function
Но это не делает его короче ...
Ничего из этого не требует определения правил високосного года - они встроены в тип даты VBA.
И, конечно, функция должна возвращать не Long, а Integer, поскольку максимальное значение, которое она может вернуть, равно 31.