函数返回当前月份的第一个星期几和最后一个星期几

时间:2018-10-20 17:58:37

标签: excel vba access-vba

我创建了一个函数,用于在MS Access表单和报表中获取星期四的第一个日期,但是该函数返回上个月的星期几。

我需要它仅返回当前月份的日期。如果当前周的第一天在上个月,则返回一周的第一天作为当月的第一天。

当前输出

从日期选择器中选择1-10-2018时,它返回27-09-2018,这是上个月的第一个星期几,但我需要它会返回在文本框中选择的月初。

Function GetFirstofWeek(dtDate As Date)
    GetFirstofWeek = DateAdd("d", dtDate, -(Weekday(dtDate)) + 1)
         ' Excel formula for this function which is perfect and may be converted to function as required ‘=MAX(B2-WEEKDAY(B2,14)+1, EOMONTH(B2, -1)+1)
    GetFirstofWeek = DateAdd("d", dtDate, -(Weekday(dtDate, vbThursday) - 1)) 
End Function

一周的最后一天

Function GetLastofWeek(dtDate) as date
    '=MIN(B2+(7-WEEKDAY(B2,14)), EOMONTH(B2, 0))
     ‘this excel formula return date as I need. 
      GetLastofWeek = DateAdd("d", dtDate, (7 - (Weekday(dtDate, vbWednesday)) + 1)) 

End Function

在此功能中,星期的最后日期必须在当前月份,如果在该星期的第一个日期的月末将被关闭,并且星期的最后日期将是星期的第一个日期或当前星期中剩余的天。

2 个答案:

答案 0 :(得分:1)

您需要检查输出月份是否与输入月份匹配。为避免为GetFirstofWeek连续分配值,我为您的初始计算创建了一个Temp日期。验证完成后,分配输出。

要从Access中调用Excel函数,请创建一个Excel.Application的实例,如@ComputerVersteher所述(谢谢

注意:由于存在已创建的对象,请勿在excel中使用它。代码旨在从Access运行。


Option Explicit

Function GetFirstofWeek(dtDate As Date)

Dim Temp As Date

'Temp = DateAdd("d", dtDate, -(Weekday(dtDate)) + 1)
Temp = DateAdd("d", dtDate, -(Weekday(dtDate, vbThursday) - 1))

If Month(Temp) = Month(dtDate) Then
    GetFirstofWeek = Temp
Else
    Dim obj as Object: Set obj = CreateObject("Excel.Application")
    GetFirstofWeek = obj.WorksheetFunction.EoMonth(Temp, 0) + 1
    Set obj = Nothing
End If

End Function

Function GetLastofWeek(dtDate) As Date

Dim Temp As Date

Temp = DateAdd("d", dtDate, (7 - (Weekday(dtDate, vbWednesday)) + 1))

If Month(Temp) = Month(dtDate) Then
    GetLastofWeek = Temp
Else
    Dim obj as Object: Set obj = CreateObject("Excel.Application")
    GetLastofWeek = obj.WorksheetFunction.EoMonth(Temp, 0)
    Set obj = Nothing
End If

End Function

答案 1 :(得分:1)

除非我误解了您的要求,否则请考虑以下两个功能:

第一周

Function FirstOfWeek(datRef As Date) As Date
    If Day(datRef) >= Weekday(datRef, vbThursday) Then
        FirstOfWeek = DateAdd("d", 1 - Weekday(datRef, vbThursday), datRef)
    Else
        FirstOfWeek = DateAdd("d", 1 - Day(datRef), datRef)
    End If
End Function

一些示例

?FirstOfWeek(#2018-10-04#)
04/10/2018 

?FirstOfWeek(#2018-10-10#)
04/10/2018 

?FirstOfWeek(#2018-10-11#)
11/10/2018 

?FirstOfWeek(#2018-10-03#)
01/10/2018 

在这里,该函数测试要获得Thursday->Wednesday周的第一天要减去的天数是否小于当前月份的天数,如果是,则返回本月的第一天。

可以将表达式DateAdd("d", 1 - Day(datRef), datRef)写成DateSerial(Year(datRef), Month(datRef), 1)以获得相同的结果。


过去一周

Function LastOfWeek(datRef As Date) As Date
    LastOfWeek = DateAdd("d", 7 - Weekday(datRef, vbThursday), datRef)
    If Day(datRef) > Day(LastOfWeek) Then
        LastOfWeek = DateSerial(Year(datRef), Month(datRef) + 1, 0)
    End If
End Function

一些示例

?LastOfWeek(#2018-10-04#)
10/10/2018 

?LastOfWeek(#2018-10-03#)
03/10/2018 

?LastOfWeek(#2018-09-27#)
30/09/2018 

类似于第一个函数,此函数首先计算下一个Wednesday的日期,然后检查该日期的天数是否小于提供的日期(指示它已误入以下日期)月)。如果是这样,则返回当月的最后一天。