VBA每年都会在3月份找到第二个周日

时间:2016-03-09 14:31:32

标签: vba excel-vba excel

我的VBA代码中有一个if条件来检查它是否是春日节日,即3月的第二个星期日。以下代码适用于所有人,除非2015年3月1日(例如)是星期日,然后显示第3个星期日。我可以添加另一个条件来检查它是否是星期日然后不添加7到公式,但是有更好的方法吗?

如果my_date =(DATEVALUE(“3/1 /”& this_year)+ 7+ CHOOSE(WEEKDAY(DATEVALUE(“3/1 /”& this_year),1),7,6,5,4, 3,2,1))

5 个答案:

答案 0 :(得分:0)

在单元格A1中输入您要查看的年份,然后选择要查看给定年份的3月第2个星期日日期的单元格并运行此代码:

Sub test()

Dim i As Integer
Dim dt As Date
Dim y As Integer

i = 0
y = Range("A1").Value
dt = "3/1/" & y

While i < 2

If WeekdayName(Weekday(dt), False, vbUseSystemDayOfWeek) = "Sunday" Then

i = i + 1
If i <> 2 Then
dt = DateAdd("d", 1, dt)
End If

Else

If i <> 2 Then
dt = DateAdd("d", 1, dt)
End If

End If

Wend

ActiveCell.Value = dt

End Sub

答案 1 :(得分:0)

If my_date = (DateSerial(this_year, 3, 1) + (8 - Weekday(DateSerial(this_year, 3, 1)) Mod 7) + 7) Then

答案 2 :(得分:0)

这有效:

对于VBA: DateSerial(this_year,3,1)+ 6 - WorksheetFunction.Weekday(DateSerial(this_year,3,1),3)+ 7

对于Excel: DateSerial(this_year,3,1)+ 6 - Weekday(DateSerial(this_year,3,1),3)+ 7

答案 3 :(得分:0)

我以为我会在遇到此问题的其他人的下面添加此代码。我想创建一个通用目的代码块,该代码块可以在任何月份的一周中的任何一天获得。就是如果我想要第二个星期日或最后一个星期日,可以从一个函数中检索它。因此,我写了下面的内容。您可以根据需要更改它。就是星期日/星期一或第一,第二或第三等。这可以通过在月中的一天中循环来完成,如果返回的是您要查找的星期几,则可以将日期保存在集合中。一旦您浏览了一个月,便可以浏览整个集合以检索所需的日期!

Function DayOfMonth(theDate As String) As String
    'cycle through the given month
    'check each day of month and if sunday add day of month to collection
    'then cycle through collection for required sunday of month
    'daylight savings only happens in march and november
    On Error Resume Next
    Dim i As Long
    Dim testDate As String 'this get passed through function
    Dim theYear As Long, theMonth As Long
    Dim dayCollection As New Collection

    theYear = Year(theDate)
    theMonth = Month(theDate)

    'build collection of sunday's day of month
    For i = 1 To 31
        testDate = i & "/" & theMonth & "/" & theYear
        If Weekday(testDate, vbSunday) = 1 Then
            dayCollection.Add i
        End If
    Next i

    For i = 1 To dayCollection.Count
        '2nd sunday
        If i = 2 Then
            DayOfMonth = dayCollection(i) & "/" & theMonth & "/" & theYear
        End If
        'last sunday of month
        If i = dayCollection.Count Then
            DayOfMonth = dayCollection(i) & "/" & theMonth & "/" & theYear
        End If
    Next i

    'clear collection
    Set dayCollection = New Collection

End Function

干杯!

答案 4 :(得分:0)

这里对 Slubee 的回答稍作修改,我觉得它更优雅、更容易理解:

DateSerial(Year, 3, 1) - WorksheetFunction.Weekday(DateSerial(Year, 3, 1), 2) + 14

第 1 项 = 3 月 1 日的日期值

第 2 项 = 1(星期一)和 7 星期日之间的数字)

因此(第 1 个学期减去第 2 个学期)为您提供了 2 月的最后一个星期日……显然加上 14 将让您成为 3 月的第二个星期日。

通过这种结构,公式可以更轻松地适应类似的用例,例如欧洲夏令时的开始/结束(三月/十月的最后一个星期日)或美国夏令时的结束(十一月的第一个星期日) .