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

82 篇文章 6 订阅
56 篇文章 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行代码设置插入单元格填充色为黄色。

自动排班表使用说明 1、在设置好年份与表头。 "2、每年1月1日,在中按一个排班周期设置好人员名单,将自动生成全年排班表,   第一行就是1月1日上班人员,如使用该表时不是1月1日,可以通过调整中   的排班次序来获得之后日期的正确排班表。单元格内的多行人员代表当天几个班   (如三行就是早中晚),当天增加一个班,就在人员单元格内按[Alt-Enter]换行。" 3、在表中,请自行增加本年的节日,假日会以红底黑字增亮显示 4、在中设置好班次与工时。 5、在中可以自动统计每人每月或全年的工作量 "6、对于不规则情况的排班,如换班,可以在当月人员名单中手动更改,另外,如果每天   的班次大于三个,会出现单元格显示不下的情况,这时可以用快捷键来修改字体大小。" "7、快捷键:   Ctrl-q 所有表保护状态,只有人员显示栏可以更改   Ctrl-e 取消所有表的保护状态,所有栏都可编辑   Ctrl-r 所有表人员名称字体加大   Ctrl-t 所有表人员名称字体减小 Ctrl-p 下打印排班表 Alt-F4 退出EXECL" "8、注意事项:理论上没有限制,但由于单元格显示宽高度有限(字体太小影响显示效果),       本表建议适用一个班最多三人,一天最多四个班上班(四行)的情况,不符合       该条件的可以使用《排班表(考勤版)》解决。"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值