如何用Lookup函数匹配早于转移日期的最新历史发票单价
解决方法
针对数十万行的大数据量,推荐以下两种高效方案,避免嵌套IF+Index Match的低效率问题:
公式方案(Excel 365/2021 优先)
用LOOKUP函数的经典匹配逻辑,直接定位符合条件的最后一次开票单价,运算效率远高于嵌套数组公式。
假设表1结构:
- A列:库存转移日期
- B列:合并后的CustomerID&Part#
表2结构: - D列:发票日期
- E列:单价
- F列:合并后的CustomerID&Part#
在表1的C2单元格输入公式(下拉填充):
=LOOKUP(2,1/((F$2:F$100000=B2)*(D$2:D$100000<A2)),E$2:E$100000)
注意:不要用整列引用(如F:F),替换成表2实际的行范围(比如F$2:F$100000),大幅提升运算速度。
公式原理:(F$2:F$100000=B2)*(D$2:D$100000<A2)生成仅包含1(符合条件)和0(不符合)的数组,1/转换为1或错误值,LOOKUP(2,...)会自动匹配最后一个1对应的单价。
如果用Excel 365,也可以用XLOOKUP实现更直观的匹配:
=XLOOKUP(TRUE,(F$2:F$100000=B2)*(D$2:D$100000<A2),E$2:E$100000,,"-1",1)
最后一个参数1表示反向查找,返回最后一个符合条件的结果。
Power Query 方案(大数据量最优)
数十万行数据用公式可能仍有卡顿,Power Query的批量处理更稳定高效:
- 将表1和表2分别转为Excel表格(Ctrl+T),命名为
Table1和Table2 - 打开「数据」选项卡 → 「获取数据」→ 「从表格/区域」,分别导入两张表到Power Query编辑器
- 在
Table1的编辑器界面,点击「合并查询」→ 合并Table1和Table2,匹配列选择合并后的CustomerID&Part#,合并类型选「左外部」 - 展开合并后的列,仅勾选「发票日期」和「单价」
- 添加自定义列,输入
=[发票日期]<[库存转移日期],筛选该列为TRUE的行 - 点击「分组依据」,分组列选「合并后的CustomerID&Part#」和「库存转移日期」,新列名设为「最后单价」,操作选「最大值」,列选「发票日期」;再重复分组,这次操作选「提取值」,列选「单价」(确保对应最大发票日期的单价)
- 点击「关闭并上载」,将处理结果加载回Excel
内容的提问来源于stack exchange,提问作者Ryrytheguyguy
相关产品推荐
相关产品推荐

