Поздний ответ на вопрос о производительности.
TL / DR: версии Math примерно на 5x быстрее
Здесь я вижу две группы ответов
- Математическая интерпретация определения високосного года
- Использование функций даты / времени в Excel для обнаружения 29 февраля (они делятся на два лагеря: те, которые строят дату в виде строки, и те, которые не строят)
Я провел временные тесты для всех опубликованных ответов, обнаружил, что методы Math примерно на 5x быстрее , чем методы Date / Time.
Затем я провел некоторую оптимизацию методов и придумал (верите или нет Integer
немного быстрее, чем Long
в этом случае, не знаю почему.)
Function IsLeapYear1(Y As Integer) As Boolean
If Y Mod 4 Then Exit Function
If Y Mod 100 Then
ElseIf Y Mod 400 Then Exit Function
End If
IsLeapYear1 = True
End Function
Для сравнения подошел (очень мало разницы по отношению к выложенной версии)
Public Function IsLeapYear2(yr As Integer) As Boolean
IsLeapYear2 = Month(DateSerial(yr, 2, 29)) = 2
End Function
Версии даты / времени, которые строят дату в виде строки, были сброшены, поскольку они снова стали намного медленнее.
Тест должен был получить IsLeapYear
в течение лет 100..9999, повторенный 1000 раз
Результаты
- Математическая версия: 640ms
- Дата / Время версия: 3360 мс
Тестовый код был
Sub Test()
Dim n As Long, i As Integer, j As Long
Dim d As Long
Dim t1 As Single, t2 As Single
Dim b As Boolean
n = 1000
Debug.Print "============================="
t1 = Timer()
For j = 1 To n
For i = 100 To 9999
b = IsYLeapYear1(i)
Next i, j
t2 = Timer()
Debug.Print 1, (t2 - t1) * 1000
t1 = Timer()
For j = 1 To n
For i = 100 To 9999
b = IsLeapYear2(i)
Next i, j
t2 = Timer()
Debug.Print 2, (t2 - t1) * 1000
End Sub