VBA自适应多种排班计划日期填充

75 篇文章 6 订阅
52 篇文章 4 订阅

实例需求:某公司有两种不同排班计划

  • MWF: 周一周三周五-周一周三周五…
  • TTS: 周二周四周六-周二周四周六…

但是数据表中有时会缺少部分日期,为了便于汇总多个部分的数据,现在需要将日期补全,对于补充的日期标记为黄色。

在这里插入图片描述


先讨论一些如何计算不同排班计划中的下一个有效时间。

  • 使用Weekday函数可以返回代表星期x的数字,这个函数支持多种方案,例如:周一开始,周日开始等等。本代码使用周一作为日历周的开始日,即:周一至周日,返回值为1~7。
  • 下表中“日期间隔”列统计每个日期和之前相邻日期的间隔天数,可以看出两种排班计划都是按2-2-3的模式再重复。
  • 对于TTS排班,除了周二之外,weekday 返回值是日期间隔的两倍
  • 对于MWF排班,只需要将 weekday 返回值加一,就可用按照TTS排班处理
MWFWeekday日期间隔TTSWeekday日期间隔
2024/1/1122024/1/222
2024/1/3322024/1/442
2024/1/5532024/1/663
2024/1/8122024/1/922
2024/1/10322024/1/1142
2024/1/12532024/1/1363
2024/1/1512024/1/162

示例代码如下。

Sub Demo()
    Dim arrRes(), iR As Long, iCnt As Long, i As Long
    Dim iDate As Date, eDate As Date, iOffset As Long
    iR = -1
    With ActiveSheet
        iDate = CDate(.Range("A2"))
        eDate = CDate(.Cells(.Rows.Count, "A").End(xlUp))
    End With
    iOffset = VBA.Weekday(iDate, vbMonday) Mod 2
    Do While iDate <= eDate
        iR = iR + 1
        ReDim Preserve arrRes(iR)
        arrRes(iR) = iDate
        iCnt = (VBA.Weekday(iDate, vbMonday) + iOffset) / 2
        iDate = iDate + IIf(iCnt = 1, 2, iCnt)
    Loop
    For i = 0 To iR
        If Not CLng(CDate(Cells(i + 2, 1).Value)) = CLng(arrRes(i)) Then
            Rows(i + 2).Insert
            Cells(i + 2, 1).Value = arrRes(i)
            Cells(i + 2, 1).Interior.Color = vbYellow
        End If
    Next
End Sub

【代码解析】
第6行代码读取单元格A2,获取开始日期。
第7行代码读取A列最后一个日期,即结束日期。
第9行代码根据日期的星期x,来识别是当前日期序列是TTS还是MWF排班,进而计算一个偏移量,用于计算下一个有效日期。
第10~16行代码从开始日期至结束日期创建日期序列。
第12行代码重新分配结果数组。
第13行代码保存日期。
第14行代码计算下一个有效日期的间隔。
第15行代码计算下一个有效日期。
第17~23行代码循环变量工作表中的数据,插入缺失日期。
第18行代码对比数据表中的日期与结果数组中日期。
第19行代码插入空行。
第20行代码写入增加的日期。
第21行代码设置插入单元格填充色为黄色。

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值