You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求协助生成两日期间的日期数组(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:27:11