You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Excel:基于ID、生效日期及序号自动填充结束日期列

嘿,这个需求我太懂了!要给同一员工(ID)同一天的最后一条记录填特定结束日期,其他记录填当日生效日期对吧?我给你两种实用的解决方法,看你习惯哪种:

方法一:Excel公式法(无编程基础也能用)

如果你的Excel是365/2021及以后版本,直接用MAXIFS函数就行,简单高效:
在D2单元格输入下面的公式,然后下拉填充到所有行:
=IF(C2=MAXIFS(C:C,A:A,A2,B:B,B2),"31/12/9999",B2)
解释MAXIFS(C:C,A:A,A2,B:B,B2)会找出当前ID(A2)、当前日期(B2)对应的最大序号(也就是最后一条记录),如果当前行的序号C2等于这个最大值,就填你需要的结束日期(这里用的是31/12/9999,你可以改成自己要的日期),否则直接填当日的生效日期B2。

要是你用的是旧版Excel(不支持MAXIFS),就用数组公式:
=IF(C2=MAX(IF((A:A=A2)*(B:B=B2),C:C)),"31/12/9999",B2)
注意:输入完公式后别直接回车,要按Ctrl+Shift+Enter组合键确认(这是数组公式的要求),然后再下拉填充。

方法二:VBA宏批量处理(大数据量更高效)

如果你的数据行数特别多,公式下拉可能有点卡,用VBA宏处理会更快:

  1. Alt+F11打开VBA编辑器
  2. 右键你的工作簿名称→选择「插入」→「模块」
  3. 把下面的代码粘贴进去:
Sub FillEndDate()
    Dim ws As Worksheet
    Dim lastRow As Long
    Dim i As Long
    Dim dict As Object
    Dim key As String
    Dim maxSeq As Integer
    
    ' 这里改成你实际的工作表名称,比如Sheets("员工记录")
    Set ws = ActiveSheet
    lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
    Set dict = CreateObject("Scripting.Dictionary")
    
    ' 第一步:先统计每个ID+日期对应的最大序号
    For i = 2 To lastRow
        key = ws.Cells(i, "A").Value & "|" & ws.Cells(i, "B").Value
        If dict.Exists(key) Then
            If ws.Cells(i, "C").Value > dict(key) Then
                dict(key) = ws.Cells(i, "C").Value
            End If
        Else
            dict(key) = ws.Cells(i, "C").Value
        End If
    Next i
    
    ' 第二步:遍历填充D列
    For i = 2 To lastRow
        key = ws.Cells(i, "A").Value & "|" & ws.Cells(i, "B").Value
        maxSeq = dict(key)
        If ws.Cells(i, "C").Value = maxSeq Then
            ' 这里改成你需要的结束日期,比如DateSerial(2025,12,31)
            ws.Cells(i, "D").Value = DateSerial(9999, 12, 31)
        Else
            ws.Cells(i, "D").Value = ws.Cells(i, "B").Value
        End If
    Next i
    
    Set dict = Nothing
    MsgBox "处理完成啦!"
End Sub
  1. F5运行宏,或者回到Excel界面,点击「开发工具」→「宏」→选择FillEndDate执行就行。

小提醒

  • 确保B列是真正的日期格式,不是文本格式,不然匹配会出错
  • 两种方法里的结束日期都可以根据你的需求修改,比如改成项目截止日之类的
  • VBA里的工作表名称一定要改成你实际用的表名,不然会在当前激活的工作表上处理哦

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

火山引擎 最新活动