ARTICLE · 1119194
Excel联网版VBA系统:多维度排班系统的实现逻辑
导读
自动一键排班, 批量二次调整, 单独调整个别人, 排班颗粒度由粗到细, 由大大小, 完全由系统一键完成, 支持连上休1, 支持最大休息人数限制, 支持指定每周/每月固定休息日, 同部门错峰排休, 节假日出勤设置, 排班结果跨月关联......, 让排班更透明, 让轮休更公平, 老板再也不用绞尽脑汁地安排谁出勤谁休息, 只需1秒即可出结果, 这就是联网版VBA系统实现的多维度排班功能。
实现原理: 根据自动排班规则一键自动排班, 根据个性化规则二次排班调整, 根据特别员工单独排班调整, 实现多维度,立体化,无死角,一站式一键式排班.
这里有几个重点也是难点需要克服:1. 排版规则的逻辑设计; 2. 不同规则间发生冲突时的排他设计; 3. 排班规则间的优先级设计; 4. 关联表结构间的设计
本文重点介绍核心逻辑的核心事件.
步骤1: 窗体设计




个体排班结果单独调整窗体
步骤2: 保存自动排版规则
将当前勾选和填写的规则保存到数据库逻辑:
① 判定保存对象(优先员工,其次部门,其次全局)
② 校验输入合法性
③ 先删后插,避免重复
④ 分别写入4类规则
⑤ 刷新界面回显

步骤3:自动排班
自动排班算法是核心中的核心,被拆分成了如下几块儿, 主体方法是计算相位

步骤4:计算相位方法
该方法是"同一个部门内、不同员工之间"错开休息日"的关键机制, 相位即部门内每个员工比第1个人"晚休几天"的偏移量, 原理是按部门内员工序号(0、1、2……)对周期取模,得到 0~周期-1 的相位, 其核心作用是让同部门员工休息日错开,避免全员同日休导致部门瘫痪.

步骤5:二次排班(即重排)
即根据手动规则,重新排班选中员工, 支持三种场景:
A. 指定具体休息日:手动休息日 → 强制休(占用上6休1的"1")
B. 指定周几休息:手动休息日 → 强制休(占用上6休1的"1")
C. 指定节假日上班:手动上班日 → 强制上班(顺延连上计数)
其它仍按原规则排, 结果不受影响.


步骤6: 单独排班
基于已经排好的结果再次进行微调, 相对于自动排和二次调整,单独排的范围将大大缩小, 多用于对个别人员个别时间的调整.

步骤7:排班结果展示
该环节充分利用了mysql自身的优势,因为通过前述步骤的操作,排班结果已经存储在数据库中,只不过存储结构和需要显示的格式不太一致, 而sql命令可以很灵活的按需要的格式对原始数据进行组装, vba只需要调用并显示出来即可.

通过看打到日志文件中的sql命令会更直观.

因为涉及情况比较多, 所以看起来比较长,执行一下就一目了然了.

虽然在查询方面msyql直接处理比通过VBA来处理效率要高得多,但也不总是这样.
比如,一开始的时候自动排班是通过msyql的存储过程实现的(见下图),最终效果虽然和上面一样,但执行效率却低得多,大概需要15秒,而把这个逻辑写到VBA中则耗时不到1秒钟.

如果你想进一步了解差别如此之大的原因, 可以去问问AI



识别二维码
关注视频号
VBA匠人




长按
关注
立即添加星标

每天学好教程