Excel 检查有效日期-VBA

Excel 检查有效日期-VBA,excel,vba,validation,days,Excel,Vba,Validation,Days,伙计们,我的主要目标是避免无效的日子 在第1页中,我有: A1年数据验证(1900-2019年) B1所有月份的数据验证 C1我使用变更事件(如果A1和A2两个字段均不为空)根据所选年份计算所选月份的天数,并创建包含所有可用天数的数据验证 对于天数计算,我使用: Option Explicit Sub test() Dim ndays As Long With ThisWorkbook.Worksheets("Sheet1") ndays = Day(

伙计们,我的主要目标是避免无效的日子

在第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   
板材结构:

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

您可以使用:

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

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

具体如下:

With someSheet
    ...
    nb_days = Day(WorksheetFunction.EoMonth(DateValue(.Range("A1").Value & " " & .Range("B1").Value & " 1"), 0))
    ...
End With
我建议使用下面的UDF(用户定义函数)

您可以使用类似于
=MonthDays(A1:A2)
的函数调用直接从工作表中调用它,其中A1表示年份,A2表示月份。如果缺少其中一个,则函数返回0。该函数接受年和月的不可能数字,并将返回逻辑结果,例如一年的第14个月是下一年的2月。但是,您可以通过数据验证来限制条目


所有UDF都可以作为普通函数从代码中调用<代码>单元格(3,1).Value=MonthDays(范围(“A1:A2”)的效果与在A3中输入上一段中描述的函数调用相同。但是,如果从VBA调用函数,则不需要使用行
Application.Volatile
(无效)。

我不认为您需要VBA来执行此操作,您是否考虑过使用命名范围创建一个问题?当数据在A2中时,为什么您的代码使用B1???@Gary的学生我编辑了这个问题,因为前一个问题包含错误。我还上传照片和我的代码。任何帮助都将不胜感激。注意,在您的第二个示例中,范围不符合表格(无点)@DisplayName@DisplayName的要求。您能看到更新的问题吗?我试图澄清问题,因为我收到一个错误类型13..@Error1004,请根据您编辑的问题查看编辑的答案fwiw我认为
应用程序。Volatile
在这里是多余的;如果我没记错的话,UDF是根据与正常工作表函数相同的规则重新计算的-即,只要先前的更改(
Rng
更改)。根据我的经验,
Application.Volatile
通常只适用于不带参数或使用时间/随机数的自定义项。在OP的情况下,您只希望函数在选择不同月份时重新计算,这应该自动发生
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