如何修改Excel VBA代码以正确提取员工多次离岗时间?
多次离岗时间提取的VBA宏修改方案
原宏仅提取首次离岗时间的核心问题是未遍历员工的所有离岗记录,以下是修改后的代码及说明:
修改后的完整代码
Sub ENTRADAS_SAIDAS_ATUALIZADO() Dim wsSource As Worksheet, wsDest As Worksheet Dim lastRowSource As Long, lastRowDest As Long Dim i As Long, j As Long Dim empID As String, entryDate As Date Dim exitCount As Integer ' 替换为你的考勤数据工作表和结果汇总工作表名称 Set wsSource = ThisWorkbook.Worksheets("考勤数据") Set wsDest = ThisWorkbook.Worksheets("结果汇总") ' 清空结果表数据(保留表头) wsDest.Range("A2:Z" & wsDest.Cells(wsDest.Rows.Count, "A").End(xlUp).Row).ClearContents lastRowSource = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row lastRowDest = 2 ' 从第二行开始写入结果 For i = 2 To lastRowSource ' 只处理入职记录(需根据实际标识修改,这里假设为"ENTRADA") If wsSource.Cells(i, "B").Value = "ENTRADA" Then empID = wsSource.Cells(i, "A").Value entryDate = wsSource.Cells(i, "C").Value exitCount = 0 ' 遍历后续行,查找该员工的所有离岗记录 For j = i + 1 To lastRowSource If wsSource.Cells(j, "A").Value = empID And wsSource.Cells(j, "B").Value = "SAIDA" Then exitCount = exitCount + 1 ' 写入入职-离岗对应记录 wsDest.Cells(lastRowDest, "A").Value = empID wsDest.Cells(lastRowDest, "B").Value = entryDate wsDest.Cells(lastRowDest, "C").Value = wsSource.Cells(j, "C").Value wsDest.Cells(lastRowDest, "D").Value = "第" & exitCount & "次离岗" lastRowDest = lastRowDest + 1 ' 若需要每条入职仅匹配下一条离岗(即一对一对应),取消下面的注释 ' Exit For End If Next j ' 处理无对应离岗的入职记录 If exitCount = 0 Then wsDest.Cells(lastRowDest, "A").Value = empID wsDest.Cells(lastRowDest, "B").Value = entryDate wsDest.Cells(lastRowDest, "C").Value = "无离岗记录" lastRowDest = lastRowDest + 1 End If End If Next i MsgBox "多次入职离岗记录提取完成!", vbInformation End Sub
关键改动说明
- 嵌套循环遍历:针对每条入职记录,循环查找该员工后续所有的离岗记录,而非仅第一条
- 离岗次数标记:用
exitCount变量区分同一次入职对应的多条离岗记录 - 可选一对一匹配:如果你的考勤逻辑是“入职→紧接着的离岗”为一组,取消
Exit For的注释即可实现 - 无离岗记录处理:对没有对应离岗的入职记录进行明确标记
使用注意事项
- 替换代码中的工作表名称:将
"考勤数据"和"结果汇总"改为你实际的工作表名称 - 匹配实际考勤标识:确认入职/离岗的文字标识(比如代码中的
"ENTRADA"/"SAIDA")与你的数据一致,不一致则修改对应内容 - 调整列位置:如果员工ID、入职/离岗标识、日期所在的列不是A、B、C,修改代码中
Cells(i, "A")这类引用的列号
内容的提问来源于stack exchange,提问作者Gonçalo
相关产品推荐
相关产品推荐

