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宏处理会更快:
- 按
Alt+F11打开VBA编辑器 - 右键你的工作簿名称→选择「插入」→「模块」
- 把下面的代码粘贴进去:
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
- 按
F5运行宏,或者回到Excel界面,点击「开发工具」→「宏」→选择FillEndDate执行就行。
小提醒
- 确保B列是真正的日期格式,不是文本格式,不然匹配会出错
- 两种方法里的结束日期都可以根据你的需求修改,比如改成项目截止日之类的
- VBA里的工作表名称一定要改成你实际用的表名,不然会在当前激活的工作表上处理哦
内容的提问来源于stack exchange,提问作者Rexksvii




