VBA宏修改需求:按单日汇总员工工时并复制至指定列
刚接触VBA就能动手修改现有宏,很棒!针对你要按单日汇总员工工时(每人每天两条记录)且不能用数据透视表/参考表的需求,我给你写了一段适配性强的VBA代码,附详细解释,新手也能快速上手:
核心思路
因为每个员工每天有两条记录,我们需要按「员工姓名+日期」的唯一组合来分组求和。用VBA的Scripting.Dictionary(字典对象)是最适合的方案——它能高效存储键值对,自动去重并累加数值,而且完全不依赖固定表格结构,完美适配你每周换不同表格的需求。
完整代码
Sub 按单日汇总员工工时() Dim ws As Worksheet Dim lastRow As Long Dim i As Long Dim dict As Object Dim key As String Dim empName As String, workDate As String Dim workHours As Double ' 绑定当前激活的工作表(打开目标表格后直接运行即可,无需固定表名) Set ws = ActiveSheet ' 创建字典对象(后期绑定,无需手动设置引用,跨电脑通用) Set dict = CreateObject("Scripting.Dictionary") ' 自动获取数据最后一行(假设数据从第2行开始,第1行是表头) lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row ' 遍历所有数据行,累加工时到字典 For i = 2 To lastRow empName = Trim(ws.Cells(i, "A").Value) ' 提取员工姓名(Trim去除前后空格) workDate = Format(ws.Cells(i, "B").Value, "yyyy-mm-dd") ' 统一日期格式,避免格式差异 workHours = ws.Cells(i, "C").Value ' 提取当日工时 ' 生成唯一键:员工姓名+分隔符+日期,确保同一员工同一天的记录被合并 key = empName & "|" & workDate ' 累加工时:键存在就加,不存在就新增 If dict.Exists(key) Then dict(key) = dict(key) + workHours Else dict(key) = workHours End If Next i ' 准备输出汇总结果(这里默认输出到E、F、G列,可自行修改列号) ws.Cells(1, "E").Value = "员工姓名" ws.Cells(1, "F").Value = "日期" ws.Cells(1, "G").Value = "单日汇总工时" ' 将字典中的汇总结果写入表格 i = 2 ' 从第2行开始写入结果 For Each key In dict.Keys ' 拆分唯一键,还原员工姓名和日期 empName = Split(key, "|")(0) workDate = Split(key, "|")(1) ws.Cells(i, "E").Value = empName ws.Cells(i, "F").Value = workDate ws.Cells(i, "G").Value = dict(key) i = i + 1 Next key ' 可选:给结果列设置规范格式 ws.Columns("F").NumberFormat = "yyyy-mm-dd" ' 日期统一格式 ws.Columns("G").NumberFormat = "0.00" ' 工时保留两位小数 MsgBox "单日工时汇总完成!", vbInformation End Sub
代码关键说明
- 字典的核心作用:用「员工姓名|日期」作为唯一键,自动把同一员工同一天的两条记录合并,累加工时总和,避免重复统计。
- 统一日期格式:用
Format函数把日期转成yyyy-mm-dd字符串,解决不同单元格日期格式(比如2024/5/1和2024-5-1)导致的分组错误。 - 动态适配表格:用
ActiveSheet绑定当前表格,lastRow自动获取数据最后一行,不管你每周换什么表格,只要数据列对应,直接运行就行。 - 灵活调整输出列:如果想把结果输出到其他列(比如H、I、J列),只要把代码中
"E"、"F"、"G"改成对应的列字母即可。
新手适配提示
- 如果运行时报错「找不到对象」:不用慌,代码用的是后期绑定字典,不需要手动设置引用,重启Excel再试一次就行。
- 调整数据列位置:如果你的员工姓名在B列、日期在C列、工时在D列,只要把代码里的
"A"、"B"、"C"改成"B"、"C"、"D"即可。 - 测试前备份数据:建议先复制一份测试表格运行宏,避免误改原始数据。
内容的提问来源于stack exchange,提问作者Cassy
相关产品推荐
相关产品推荐

