【问题标题】:Check for valid date - VBA检查有效日期 - VBA
【发布时间】:2019-03-09 09:49:32
【问题描述】:

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

在表 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   

图纸结构:

有没有办法计算天数?

【问题讨论】:

  • 我认为您不会为此需要 VBA,您是否考虑过使用命名范围创建 dynamic data validation list
  • 当数据在A2时,为什么你的代码使用B1??
  • @Gary'sStudent 我编辑了这个问题,因为前一个问题包含错误。我还上传照片和我的代码。任何帮助将不胜感激。

标签: excel vba validation days


【解决方案1】:

你可以使用:

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

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

如下:

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

【讨论】:

  • 注意,在您的第二个示例中,范围不符合工作表(无点)
  • @DisplayName 你能看到更新的问题吗?我尝试清除问题,因为我收到错误类型 13..
  • @Error1004,根据您编辑的问题查看编辑后的答案
【解决方案2】:

我建议使用下面的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(无效)。

【讨论】:

  • FWIW 我认为Application.Volatile 在这里是多余的;如果我没记错的话,UDF 会根据与正常工作表函数相同的规则重新计算 - 即每当先例发生变化时(Rng 发生变化)。根据我的经验,Application.Volatile 通常只对不带参数或使用时间/随机数的 UDF 有用。在 OP 的情况下,您只希望函数在选择不同月份时重新计算,这应该自动发生
猜你喜欢
  • 1970-01-01
  • 2017-02-28
  • 1970-01-01
  • 2012-03-15
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
相关资源
最近更新 更多