VBA将为每年3月找到第二个星期日

VBA将为每年3月找到第二个星期日,vba,excel,Vba,Excel,我的VBA代码中有一个if条件,可以检查它是否是春光节,也就是3月的第二个星期日。以下代码适用于所有情况,但2015年3月1日(例如)为星期日时除外,然后显示第三个星期日。我可以添加另一个条件来检查是否是星期天,然后不要在公式中添加7,但是有更好的方法吗 如果my_date=(DATEVALUE(“3/1/”&this_year)+7+选择(工作日(DATEVALUE(“3/1/”&this_year),1),7,6,5,4,3,2,1))在单元格A1中输入您想要查看的年份,然后选择一个单元格,

我的VBA代码中有一个if条件,可以检查它是否是春光节,也就是3月的第二个星期日。以下代码适用于所有情况,但2015年3月1日(例如)为星期日时除外,然后显示第三个星期日。我可以添加另一个条件来检查是否是星期天,然后不要在公式中添加7,但是有更好的方法吗


如果my_date=(DATEVALUE(“3/1/”&this_year)+7+选择(工作日(DATEVALUE(“3/1/”&this_year),1),7,6,5,4,3,2,1))

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

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
子测试()
作为整数的Dim i
Dim dt作为日期
Dim y作为整数
i=0
y=范围(“A1”).值
dt=“3/1/”&y
当我<2
如果WeekdayName(Weekday(dt),False,vbUseSystemDayOfWeek)=“Sunday”,则
i=i+1
如果我2那么
dt=日期添加(“d”,1,dt)
如果结束
其他的
如果我2那么
dt=日期添加(“d”,1,dt)
如果结束
如果结束
温德
ActiveCell.Value=dt
端接头
这项工作:

对于VBA: DateSerial(今年,3,1)+6-工作表函数。工作日(DateSerial(今年,3,1),3)+7

对于Excel:
DateSerial(今年,3,1)+6-工作日(DateSerial(今年,3,1),3)+7

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

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

干杯

这里对Slubee的答案做了一点修改,我觉得这更优雅,更容易理解:

DateSerial(Year, 3, 1) - WorksheetFunction.Weekday(DateSerial(Year, 3, 1), 2) + 14
第1项=3月1日的日期值

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

所以(第一学期减去第二学期)给你二月的最后一个星期天。。。很明显,加上14会让你得到3月的第二个星期日


有了这种结构,公式可以更容易地适应类似的用例,如欧洲夏时制的开始/结束(3月/10月的最后一个星期日)或美国夏令时的结束(11月的第一个星期日).

我正在寻找一种不用检查周日就可以编辑公式的方法。该公式有效:my_date=DATEVALUE(“3/1/”&今年)+6个工作日(DATEVALUE(“3/1/”&今年),3)+7我建议不要使用DATEVALUE()如果您所在的国家/地区使用DD/MM/yyyyy格式而不是MM/DD/yyyyyyy格式,则可能会出现这种情况:DateSerial(this_year,3,1)+6-WorksheetFunction.Weekday(DateSerial(this_year,3,1),3)+7:-对于VBA DateSerial(今年,3,1)+6-工作日(DateSerial(今年,3,1),3)+7:-对于Excels,由于您发现了一些有用的东西,并且发布了其他显然不符合您要求的“答案”,请将您的代码放入“答案”可以向上投票,您可以(稍后)通过单击旁边的复选标记将其标记为“答案”。这将有助于网站管理员和其他可能有相同问题并正在搜索答案的人:-)如果您觉得“答案”不好,您可以向下投票(单击左侧的“向下”箭头)。在这个网站上,将某些内容标记为“非答案”只能用于主题外、评论、垃圾邮件、人们在“你的问题”的上方发布其他问题等。是的,这让人困惑…:-)我在“低质量帖子”队列中遇到了这一点。通常,只有代码且没有上下文的帖子才会被删除。
DateSerial(Year, 3, 1) - WorksheetFunction.Weekday(DateSerial(Year, 3, 1), 2) + 14