You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
代码关键说明
  1. 字典的核心作用:用「员工姓名|日期」作为唯一键,自动把同一员工同一天的两条记录合并,累加工时总和,避免重复统计。
  2. 统一日期格式:用Format函数把日期转成yyyy-mm-dd字符串,解决不同单元格日期格式(比如2024/5/1和2024-5-1)导致的分组错误。
  3. 动态适配表格:用ActiveSheet绑定当前表格,lastRow自动获取数据最后一行,不管你每周换什么表格,只要数据列对应,直接运行就行。
  4. 灵活调整输出列:如果想把结果输出到其他列(比如H、I、J列),只要把代码中"E"、"F"、"G"改成对应的列字母即可。
新手适配提示
  • 如果运行时报错「找不到对象」:不用慌,代码用的是后期绑定字典,不需要手动设置引用,重启Excel再试一次就行。
  • 调整数据列位置:如果你的员工姓名在B列、日期在C列、工时在D列,只要把代码里的"A"、"B"、"C"改成"B"、"C"、"D"即可。
  • 测试前备份数据:建议先复制一份测试表格运行宏,避免误改原始数据。

内容的提问来源于stack exchange,提问作者Cassy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:46:05