检查有效日期 - VBA
Check for valid date - VBA
伙计们,我的主要 objective 是避免无效的日子。
在 sheet 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
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
(无效)。
伙计们,我的主要 objective 是避免无效的日子。
在 sheet 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
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
(无效)。