加班时间原始记录在一个excel文件里,每个月的加班时间在一个sheet里,共12个sheet,第13个sheet里存放12个月加班时间的和,如下图所示:
原始记录页: 汇总页:
这里要处理的情况是:原始记录中有些名字是汇总表里没有的,所以不是所有原始记录都被写到汇总中,另外原始记录中有空行。
汇总的VBA算法首先遍历前12个sheet,将结果放在一个名为total的Set中(类似于Java中的map,key-value组成的集合),如果没有此人名字,则创建,若已有,则累加,然后遍历最后一个sheet,其中的每一个名字从total里找对应的值填在表格里:
Sub OTSum() Dim Month Month = 12 Set Total = CreateObject("Scripting.Dictionary") For shidx = 1 To Month rowcnt = Worksheets(shidx).UsedRange.Rows.Count For rowidx = 1 To rowcnt empname = Worksheets(shidx).Cells(rowidx, 1).Value jbTime = Worksheets(shidx).Cells(rowidx, 2).Value If Total.exists(empname) Then Total.Item(empname) = Total.Item(empname) + jbTime Else: Total.Add empname, jbTime End If Next Next rowcnt = Worksheets(Month + 1).UsedRange.Rows.Count For rowidx = 1 To rowcnt empname = Worksheets(Month + 1).Cells(rowidx, 1).Value If Total.exists(empname) Then Worksheets(Month + 1).Cells(rowidx, 2) = Total.Item(empname) End If Next End Sub