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

如何修改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的注释即可实现
  • 无离岗记录处理:对没有对应离岗的入职记录进行明确标记

使用注意事项

  1. 替换代码中的工作表名称:将"考勤数据"和"结果汇总"改为你实际的工作表名称
  2. 匹配实际考勤标识:确认入职/离岗的文字标识(比如代码中的"ENTRADA"/"SAIDA")与你的数据一致,不一致则修改对应内容
  3. 调整列位置:如果员工ID、入职/离岗标识、日期所在的列不是A、B、C,修改代码中Cells(i, "A")这类引用的列号

内容的提问来源于stack exchange,提问作者Gonçalo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 05:52:56