打卡明细里有重复记录、缺卡和错误时间,怎样整理成能核对的考勤表?这次我们用 WorkBuddy 配合 VBAYYDS,让 AI 读取表里的规则、编写 VBA,并运行检查。整个案例不做窗体,结果直接写入工作表。

本例把 55 条虚拟打卡记录整理成 25 行每日考勤、5 行员工汇总和 6 条数据异常。重复运行后结果没有累加,三张源数据表保持不变。
零基础读者可以先照着本文的自然语言需求操作,再用几个已知答案检查结果。这里展示的是固定白班的教学案例,不包括跨夜班、加班、请假或工资计算;换成自己的业务时,需要先补充相应规则。
先把数据和计算规则放进表里
先准备启用宏的工作簿。把员工、打卡记录和规则分开保存,AI 就能从文件中读取具体时间,不必让使用者在提示词里逐项解释。

图1 原始打卡记录包含正常时间和故意设置的错误数据
| 工作表 | 用途 |
|---|---|
| 打卡明细 | 保存记录编号、工号和打卡时间,保留原始记录 |
| 员工名单 | 保存工号和姓名,用来识别有效员工 |
| 考勤规则 | 保存统计期间、应考勤日、上下班及午休时间 |
| 每日考勤 | 输出每人每天的时间、工时和状态 |
| 考勤汇总 | 按员工汇总天数及有效工时 |
| 数据异常 | 留下异常源记录编号和原因,方便回查 |
本例统计 2026 年 9 月 1 日至 7 日,表内明确列出 1、2、3、4、7 日为应考勤日。每天 09:00 上班、18:00 下班,12:00 至 13:00 午休不计工时。完整的一天最多计算 8 小时。
在 WorkBuddy 里用自然语言提需求
打开 VBA 编辑器,在 VBAYYDS 菜单中复制项目路径。来到 WorkBuddy,新建任务并加入这个项目文件夹,再输入需求。

图2 WorkBuddy 中的实际首轮提示词输入框
下面是本例实际使用的完整提示词,可以直接复制。也可以用语音输入说出同样的需求,发送前核对识别出的文字。
请使用vba相关技能完成以下任务。帮我把这份Excel里的打卡记录算成考勤表,不要做窗体。按表里的上班、下班和午休时间,算每个人每天的迟到、早退和工作时长,再按人汇总。重复打卡别重复算,缺卡和异常单独提醒。保留原始数据,表格做得清楚好看,做好后运行检查。
这段话不要求你知道字典、数组或 VBA 对象。只要说明想得到什么结果、重复记录怎么办、哪些情况需要提醒,以及不能修改原始数据,AI 就有了明确的任务范围。
“按表里的时间”让计算依据落在工作簿中;“做好后运行检查”则要求 AI 继续验证代码。语音输入只负责把需求变成文字,规则有没有说清楚,仍要由使用者确认。
让 AI 写代码后继续运行检查
WorkBuddy 读取项目资料和工作表后,生成了标准模块 m考勤计算。随后通过 VBAYYDS 调用工作簿运行宏,并读取生成的数据检查结果。这里没有窗体,因此也不涉及窗体控件测试。

图3 WorkBuddy 完成运行核验和表格整理后的反馈
这次并非代码写出后就结束。过程中出现过数组参数、二维数组调整以及时间计算问题,WorkBuddy 根据执行反馈继续修正。时间问题尤其容易忽略:打卡记录带有完整日期,而规则里的 09:00 只是一天中的时间,两者不能直接相减。
修正后的代码先把当天日期加到上班、下班和午休时间上,再计算差值。这样迟到分钟数和有效工时才处于同一天的时间范围内。
后续还根据追加要求放大了表格字号、调整列宽,并把异常中的日期序列值显示为日期时间。这部分属于追加需求后的整理,不是首次生成就已完成的效果。
AI 显示“完成”以后,仍需查看工作表中的实际数值。本例又独立核对了每日结果、员工汇总、异常归类及原始数据,避免只凭完成提示判断成功。
代码怎样处理重复打卡和午休
同一工号在同一完整时间戳重复出现,只保留一次有效打卡,其余记录进入数据异常表。同一个人同一天的有效记录,再取最早和最晚时间参与计算。

图4 实际 VBA 模块中的当天时间对齐和工时计算代码
有效工时分别计算打卡区间与上午、下午工作时段的重叠,再相加。下面是实际模块中的辅助函数,它只返回两个区间共同覆盖的分钟数。
Function 重叠分钟(a1, a2, b1, b2) As Double
Dim s, e
s = a1: If b1 > s Then s = b1
e = a2: If b2 < e Then e = b2
If e > s Then 重叠分钟 = (e – s) * 1440 Else 重叠分钟 = 0
End Function
因此,提前到岗或延后离岗不会在本例中增加工时,午休也不会被算进去。它按当天最早和最晚打卡之间的跨度计算,不会根据中间的多次打卡自动扣除外出时间。
去重后只剩一次打卡,标记为“缺卡待核实”;完全没有记录,标记为“无打卡待核实”。这两类的迟到、早退和工时留空,不把缺少的信息猜成一个确定答案。
用已知答案核对汇总结果
运行后先检查每日明细,再查看按人的汇总。本例林晨、周宁、陈悦、许安、赵晴的有效工时分别为 39.83、39.50、32.00、32.00、39.75 小时。汇总先累加分钟数,再换算为小时。

图5 重复运行后生成的员工考勤汇总
| 检查内容 | 实际核对结果 |
|---|---|
| 林晨 9 月 2 日 | 迟到 10 分钟 |
| 周宁 9 月 3 日 | 早退 30 分钟 |
| 陈悦 9 月 4 日 | 重复记录剔除后为缺卡待核实 |
| 许安 9 月 7 日 | 无打卡待核实 |
| 赵晴 9 月 2 日 | 迟到 5 分钟且早退 10 分钟 |
| 再次运行宏 | 仍为 25 行每日考勤、5 行汇总、6 条异常 |
6 条异常分别包含 2 条重复打卡,以及无效时间、非考勤日、统计期外、未知工号各 1 条。首次独立核验通过 224 项检查,重复运行核验通过 227 项;这些是本组教学数据的检查项,不代表已经覆盖所有考勤场景。
宏会清空并重写三张同名结果表,不要在结果表里长期保存手工备注。用于自己的文件前,先用副本验证,并补齐班次、请假和异常处理规则。让 AI 完成计算后,再拿已知答案核对。

