Проверьте действительную дату - VBA - PullRequest
0 голосов
/ 09 марта 2019

Ребята, моя основная задача - избежать недействительных дней.

В листе 1 у меня есть:

  • Проверка данных A1 по годам (с 1900-2019)
  • Проверка данных B1 со всеми месяцами
  • C1 Я использую событие изменения (если оба поля A1 и A2 не пустые) вычисляет, сколько дней выбранный месяц имеет на основе выбранного года, и создает проверку данных, включающую все доступные дни.

Для расчета дней я использую:

Option Explicit

Sub test()

    Dim ndays As Long

    With ThisWorkbook.Worksheets("Sheet1")

        ndays = Day(DateSerial(.Range("A1").Value, .Range("B1").Value + 1, 1) - 1)

    End With

End Sub   

Структура листа:

enter image description here

Есть ли способ вычисления дней?

Ответы [ 2 ]

2 голосов
/ 09 марта 2019

Вы можете использовать:

  • DateValue(), чтобы построить дату из строки, которую вы составляете, со своими значениями года и месяца и добавить любой действительный номер дня (я выбрал "1"чтобы быть уверенным ...)

  • EOMONTH() функция листа, чтобы получить последний день месяца с полученной датой:

как показано ниже:

With someSheet
    ...
    nb_days = Day(WorksheetFunction.EoMonth(DateValue(.Range("A1").Value & " " & .Range("B1").Value & " 1"), 0))
    ...
End With
0 голосов
/ 09 марта 2019

Я предлагаю использовать 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 не будет обязательной (неэффективной).

...