Я предлагаю использовать UDF (пользовательскую функцию) ниже.
Function MonthDays(Rng As Range) As Integer
Const Y As Integer = 1
Const M As Integer = 2
Dim Arr As Variant
Application.Volatile ' recalculates on every change
If Application.WorksheetFunction.Count(Rng) = 2 Then
Arr = Rng.Value
MonthDays = DateDiff("d", DateSerial(Arr(Y, 1), Arr(M, 1), 1), _
DateSerial(Arr(Y, 1), Arr(M, 1) + 1, 1))
End If
End Function
Вы можете вызвать его напрямую с рабочего листа с помощью вызова функции, подобного =MonthDays(A1:A2)
, где A1 содержит год, а A2 - месяц. Если какой-либо из них отсутствует, функция возвращает 0. Функция принимает невозможные числа как для года, так и для месяца и возвращает логический результат, например, 14-й месяц года, являющийся февралем следующего года. Однако вы можете ограничить записи проверкой данных.
Все UDF-функции можно вызывать из вашего кода как обычные функции. Cells(3, 1).Value = MonthDays(Range("A1:A2"))
будет иметь тот же эффект, что и ввод вызова функции, как описано в предыдущем абзаце в A3. Однако если функция вызывается из VBA, строка Application.Volatile
не будет обязательной (неэффективной).