检查有效日期 - VBA

Check for valid date - VBA

伙计们,我的主要 objective 是避免无效的日子。

在 sheet 1 我有:

我使用的天数计算:

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   

Sheet 结构:

有没有更好的计算天数的方法?

你可以使用:

  • DateValue() 函数从您用年和月值组成的字符串中构建日期并添加任何有效的日期数字(我选择“1”以确保... )

  • EOMONTH() 工作表函数获取结果日期月份的最后一天:

喜欢如下:

With someSheet
    ...
    nb_days = Day(WorksheetFunction.EoMonth(DateValue(.Range("A1").Value & " " & .Range("B1").Value & " 1"), 0))
    ...
End With

我建议使用下面的 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 保存月份。如果其中任何一个缺少函数 returns 0。该函数接受不可能的年份和月份数字,并将 return 一个逻辑结果,例如一年的第 14 个月是下一年的二月。但是,您可以通过数据验证来限制条目。

所有 UDF 都可以作为普通函数从您的代码中调用。 Cells(3, 1).Value = MonthDays(Range("A1:A2")) 与A3 中上一段所述的函数调用具有相同的效果。但是,如果从 VBA 调用该函数,则不需要行 Application.Volatile(无效)。