请求协助生成两日期间的日期数组(MS Project假期导出场景)
生成日期范围数组并提取MS Project日历假期的完整方案
我来帮你完善这段代码,同时结合你提取MS Project日历假期的需求,给出完整的实现思路和代码:
首先看你最初的代码,核心是要生成两个日期之间的所有日期数组,然后结合Calendar.Exception处理假期范围的问题。
第一步:实现基础的日期范围数组生成
先把你未完成的日期数组生成逻辑补全,这段代码可以生成包含起止日期在内的所有日期数组:
Sub ArrayOfDates() Dim StartDate As Date, EndDate As Date, aDates() As Date Dim currentDate As Date Dim arrIndex As Integer StartDate = #1/1/2018# EndDate = #1/31/2018# ' 先计算日期区间的天数,初始化数组大小 ReDim aDates(0 To DateDiff("d", StartDate, EndDate)) arrIndex = 0 currentDate = StartDate ' 循环逐个添加日期到数组 Do While currentDate <= EndDate aDates(arrIndex) = currentDate currentDate = currentDate + 1 arrIndex = arrIndex + 1 Loop ' 可选:在立即窗口打印数组内容,验证结果 Dim i As Integer For i = LBound(aDates) To UBound(aDates) Debug.Print aDates(i) Next i End Sub
第二步:结合MS Project日历例外提取假期
接下来是核心需求:提取指定日期范围内的所有假期(包括Calendar.Exception定义的日期范围)。这段代码会遍历目标日历的所有例外,把每个例外的日期范围(和目标区间的交集)拆分成单个日期存入数组:
Sub ExtractProjectHolidays() Dim projCalendar As Calendar Dim holidayException As Exception Dim holidayDates() As Date Dim currentHolidayDate As Date Dim arrIndex As Integer Dim targetStartDate As Date, targetEndDate As Date ' 设置你要查询的日期范围 targetStartDate = #1/1/2018# targetEndDate = #1/31/2018# arrIndex = 0 ' 指定要提取的日历(这里用项目默认的Standard日历,可根据需求修改) Set projCalendar = ActiveProject.Calendars("Standard") ' 遍历每个日历例外项 For Each holidayException In projCalendar.Exceptions ' 计算当前例外和目标日期范围的交集,避免提取超出范围的日期 Dim exceptionStart As Date, exceptionEnd As Date exceptionStart = IIf(holidayException.Start > targetStartDate, holidayException.Start, targetStartDate) exceptionEnd = IIf(holidayException.Finish < targetEndDate, holidayException.Finish, targetEndDate) ' 如果交集有效,就把范围内的每个日期加入数组 If exceptionStart <= exceptionEnd Then currentHolidayDate = exceptionStart Do While currentHolidayDate <= exceptionEnd ' 动态扩展数组容量 ReDim Preserve holidayDates(0 To arrIndex) holidayDates(arrIndex) = currentHolidayDate currentHolidayDate = currentHolidayDate + 1 arrIndex = arrIndex + 1 Loop End If Next holidayException ' 输出提取结果到立即窗口 If arrIndex > 0 Then Debug.Print "指定范围内的假期日期:" Dim i As Integer For i = LBound(holidayDates) To UBound(holidayDates) Debug.Print holidayDates(i) Next i Else Debug.Print "该日期范围内没有设置假期" End If End Sub
几个关键细节说明:
- 动态数组调整:用
ReDim Preserve来动态扩展数组,确保能容纳所有提取到的假期日期 - 日期交集计算:通过
IIf判断例外范围和目标范围的重叠部分,避免提取不需要的日期 - 日历选择:你可以把
ActiveProject.Calendars("Standard")改成你需要的日历,比如资源日历或者自定义任务日历
内容的提问来源于stack exchange,提问作者user2378895
相关产品推荐
相关产品推荐

