我创建了一个函数,用于在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
在此功能中,星期的最后日期必须在当前月份,如果在该星期的第一个日期的月末将被关闭,并且星期的最后日期将是星期的第一个日期或当前星期中剩余的天。
答案 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
的日期,然后检查该日期的天数是否小于提供的日期(指示它已误入以下日期)月)。如果是这样,则返回当月的最后一天。