首页 > 解决方案 > 当后续行中的单元格填写完成任务的人的ID时,如何在开始时间旁边的单元格中输入任务的“结束时间”?

问题描述

我正在设置一个电子表格来跟踪有关员工完成的任务的信息。我希望这个工作的方式是员工将在每个任务开始时将他们的 ID 扫描到电子表格中。

我设置了一张表格,允许将员工 ID 扫描/输入到 D 列中,并使用当前日期/时间自动填充相邻的单元格(E 列)。

我正在努力的一点是进入任务的“结束时间”;当同一员工返回后续工作并将其徽章扫描到工作表中时,我希望将上一个任务的完成时间输入与该任务相关联的行的 F 列。

即,将徽章扫描到工作表中的后一行会触发员工执行的上一个任务的“结束”,因此第二个/下一个任务的开始时间是第一个/上一个任务的完成时间。

我对 VBA 的了解非常有限,我想不出一个简单的方法来实现这一点。

该表如下所示: https ://imgur.com/a/uz6unv7

我在网上找到了一些我试图编辑的代码。我正在尝试处理的基础是代码: - 在 D 列中搜索给定员工 ED 的值 - 当找到匹配的 ID 时,将 E 列从“找到的行”复制到原始的 F 列排。- 然后它应该遍历整个 D 列,在匹配 ID 的每个实例处停止,如上所述复制和粘贴,然后继续遍历该列。

下面的代码:


'Sub FindCopy()

Dim calc As Long
Dim Cel As Range
Dim LastRow As Long
Dim rFound As Range
Dim LookRange As Range
Dim CelValue As Variant

    ' Speed
    calc = Application.Calculation
    With Application
        .Calculation = xlCalculationManual
        .ScreenUpdating = False
    End With

    'Get Last row of data Sheet2, Col D (Stager ID)
       LastRow = Sheet2.Cells(Rows.Count, 4).End(xlUp).Row

    ' Set range to look in (Stager ID)
   Set LookRange = Sheet2.Range("D2:D" & LastRow)


    ' Loop on each value (cell)
    For Each Cel In LookRange
        ' Get value to find
        CelValue = Cel.Value
        ' Look on sheet2
        With Sheet2

            ' Allow not found error
            On Error Resume Next

            Set rFound = .Cells.Find(What:=CelValue, _
                After:=.Cells(1, 1), LookIn:=xlValues, _
                    LookAt:=xlWhole, MatchCase:=False)

            ' Reset
            On Error GoTo endo

            ' Not found, go next
            If rFound Is Nothing Then
                GoTo nextCel
            Else
                ' Found. Copy Sheet2, Col E to Sheet2 found Row, Col F

           Sheet2.Cells(Cel.Row, 6).Value = Sheet2.Cells(rFound.Row, 5).Value


            End If          

        End With
nextCel:
    Next Cel

'Reset

endo:

    With Application
        .Calculation = calc
        .ScreenUpdating = True
    End With

End Sub

不幸的是,目前它只是将 E 列的第一个值粘贴到与该员工 ID 关联的所有行的 F 列。

我希望它独立确定每个任务的完成时间,以便我可以计算每个任务的持续时间。

有谁知道如何更正我正在使用的代码或其他(可能更简单的方法)来实现上述目标?是否可以将其设置为填充“实时”,即输入员工 ID?

标签: excelvba

解决方案


如果我对您的理解正确,您可以使用列中的公式来执行此操作,以End Time查找该 Employee 下次在Employee ID列中列出的时间。

如果您的桌子在里面,F1:F100那么类似:

H2:  =IFERROR(INDEX(Start_Time,AGGREGATE(15,6,1/(F2=F3:$F$100)*ROW(F3:$F$100),1)-1),"")

在此处输入图像描述

算法:

  • F2=F3:$F$100: 查找 F2 中 ID 的所有匹配项,从下一行开始
  • 1/(…):更改FALSE对错误的响应
  • * ROW(…)计算匹配 ID 的行
  • AGGREGATE返回最小的行号,这将是下一个匹配
  • IFERROR在没有 NEXT 匹配的情况下返回空白

推荐阅读