在 MS Access 中根据年份和周数填充周开始日期和周结束日期
Populate Week Start and Week End dates given the Year and Week Number in MS Access
我在访问表单上有一个组合框,用户可以从中 select 特定年份,比如从下拉列表中选择 2014 年。此表单上存在另一个组合框,其中包含从 1 到 53 的周数下拉列表。这两个组合框没有链接。 (还是我必须 link/bound 他们?)
此外,此表单上还有两个名为 "WeekStart" 和 "WeekEnd" 的文本框。
我想要做的是让 selected 周数和年份的周开始和结束日期填充在 "WeekStart" 和 "WeekEnd" 个文本框。我从星期天开始我的一周。我将此代码放在 "week number" 组合框的 "After Update" 事件中。
Me.WeekStart = DateSerial(Me.cboYear, 1, Me.cboWeekNum * 7)
但我知道这是不对的,我被困住了。任何帮助,将不胜感激。而且,我必须将周数绑定到年份吗?如果是这样,我该怎么做。谢谢
您可以使用 VBA 函数来计算一周的开始日期。例如,使用这样的形式:
你可以像这样使用表单代码
Option Compare Database
Option Explicit
Private Sub cboWeekNum_AfterUpdate()
UpdateStartEndDates
End Sub
Private Sub cboYear_AfterUpdate()
UpdateStartEndDates
End Sub
Private Sub UpdateStartEndDates()
Me.txtWeekStart.Value = WeekStartDate(Me.cboYear.Value, Me.cboWeekNum.Value)
Me.txtWeekEnd.Value = DateAdd("d", 6, Me.txtWeekStart.Value)
End Sub
Private Function WeekStartDate(yyyy As Integer, ww As Integer) As Date
' per ISO 8601, week starts on Monday
Dim Jan1 As Date
Jan1 = DateSerial(yyyy, 1, 1)
Dim Jan1Weekday As Integer
Jan1Weekday = Weekday(Jan1, vbThursday)
Dim FirstThursday As Date
' per standard, Week 1 contains the first Thursday of the year
FirstThursday = DateAdd("d", IIf(Jan1Weekday = 1, 0, 8 - Jan1Weekday), Jan1)
' back up 3 days to Monday, then add 7 days for each week after Week 1
WeekStartDate = DateAdd("d", -3 + (7 * (ww - 1)), FirstThursday)
End Function
我在访问表单上有一个组合框,用户可以从中 select 特定年份,比如从下拉列表中选择 2014 年。此表单上存在另一个组合框,其中包含从 1 到 53 的周数下拉列表。这两个组合框没有链接。 (还是我必须 link/bound 他们?)
此外,此表单上还有两个名为 "WeekStart" 和 "WeekEnd" 的文本框。
我想要做的是让 selected 周数和年份的周开始和结束日期填充在 "WeekStart" 和 "WeekEnd" 个文本框。我从星期天开始我的一周。我将此代码放在 "week number" 组合框的 "After Update" 事件中。
Me.WeekStart = DateSerial(Me.cboYear, 1, Me.cboWeekNum * 7)
但我知道这是不对的,我被困住了。任何帮助,将不胜感激。而且,我必须将周数绑定到年份吗?如果是这样,我该怎么做。谢谢
您可以使用 VBA 函数来计算一周的开始日期。例如,使用这样的形式:
你可以像这样使用表单代码
Option Compare Database
Option Explicit
Private Sub cboWeekNum_AfterUpdate()
UpdateStartEndDates
End Sub
Private Sub cboYear_AfterUpdate()
UpdateStartEndDates
End Sub
Private Sub UpdateStartEndDates()
Me.txtWeekStart.Value = WeekStartDate(Me.cboYear.Value, Me.cboWeekNum.Value)
Me.txtWeekEnd.Value = DateAdd("d", 6, Me.txtWeekStart.Value)
End Sub
Private Function WeekStartDate(yyyy As Integer, ww As Integer) As Date
' per ISO 8601, week starts on Monday
Dim Jan1 As Date
Jan1 = DateSerial(yyyy, 1, 1)
Dim Jan1Weekday As Integer
Jan1Weekday = Weekday(Jan1, vbThursday)
Dim FirstThursday As Date
' per standard, Week 1 contains the first Thursday of the year
FirstThursday = DateAdd("d", IIf(Jan1Weekday = 1, 0, 8 - Jan1Weekday), Jan1)
' back up 3 days to Monday, then add 7 days for each week after Week 1
WeekStartDate = DateAdd("d", -3 + (7 * (ww - 1)), FirstThursday)
End Function