Excel 如何按每个项目的最近完成日期排序去重下拉列表?
数据小许
结论
先求出每个运动项目的最近完成日期,再按日期升序排列,最近完成的项目就会排在列表底部。
按现有公式假设,A 列是完成日期,B 列是运动项目。A 列存储有效的 Excel 日期,每个项目至少有一个有效日期。在支持所用函数和动态数组的 Excel 中,可以使用:
=LET(
items,UNIQUE(FILTER(B2:B999,B2:B999<>"")),
lastDates,MAXIFS(A2:A999,B2:B999,items),
SORTBY(items,lastDates,1)
)
原公式为什么不符合预期?
你的公式是:
=UNIQUE(SORTBY(B2:B999, A2:A999,-1))
它先将所有记录按日期降序排列,再由 UNIQUE 按首次出现的顺序保留不同的项目。结果是,各项目按最近完成日期从新到旧排列,最近完成的项目排在前面。
直接把 -1 改成 1 也不行。日期升序后,每个项目最先出现的是它最早的记录,去重结果对应的就是各项目的最早完成日期。
要按最近完成日期升序排列,需要先求出每个项目的最大日期,再排序。
公式如何工作?
公式分为三个步骤:
FILTER排除空白项目,UNIQUE得到不重复的项目名称。MAXIFS根据项目名称查找 A 列中的最大日期,也就是该项目最近一次完成的日期。SORTBY按这些日期升序排列项目,让最近完成的项目位于底部。
例如,有以下记录:
| 完成日期 | 运动项目 |
|---|---|
| 2026-01-01 | 深蹲 |
| 2026-01-05 | 跑步 |
| 2026-01-10 | 深蹲 |
深蹲的最近完成日期是 2026-01-10,跑步的是 2026-01-05,因此最终列表为:
跑步
深蹲
如果两个项目的最近完成日期相同,希望它们再按名称升序排列,可以把公式中的 SORTBY 一行改为:
SORTBY(items,lastDates,1,items,1)
将结果用于下拉列表
假设将完整公式输入同一工作表的 D2,并确保下方有足够的空白区域供结果溢出:
- 选中需要添加下拉列表的单元格。
- 打开“数据验证”,将允许类型设为“序列”。
- 将来源设为:
=$D$2#
# 表示引用 D2 的整个动态数组结果。源数据更新后,公式和下拉选项会随之更新;新增记录需要位于公式引用的范围内。
需要检查的地方
- A 列必须是有效的 Excel 日期。仅修改显示格式不会把文本日期转换成真正的日期,
MAXIFS也不会按预期处理文本日期。 - 项目名称中的多余空格可能让同一个项目被识别成不同值。
- 如果 B 列范围内完全没有项目,当前
FILTER会返回错误;这份公式以至少存在一个项目为前提。 - 这里比较的是完成日期。如果你想按最后录入的行位置排序,即使补录的是较早日期也算“最近录入”,则需要改用行位置作为依据。
备注:内容仅供参考。
