检查有效日期-VBA

时间:2019-03-09 09:49:32

标签: excel vba validation days

我的主要目的是避免无效的日子。

在工作表1中,我有:

  • 具有年份(从1900-2019年)的A1数据验证
  • 所有月份的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 个答案:

答案 0 :(得分:2)

您可以使用:

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

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

像这样:

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

答案 1 :(得分:0)

我建议使用下面的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个月是次年的2月。但是,您可以通过数据验证来限制条目。

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