Excel带排除条件的SUMIF序列计算及动态薪资核算问题
动态薪资核算的MMULT公式修正方案
问题背景
- 项目损益表原用固定薪资计算,需改为适配薪资变动的动态核算
- 项目周期通过公式
=EDATE($C$2, SEQUENCE(1, $E$2, 0))生成(从L1开始的日期序列) - 当前薪资成本公式依赖员工分配表的固定薪资列,需移除该列,改为从
EmployeeSalaryTbl匹配对应日期的薪资 - 核心需求:
- 按项目周期生成日期序列
- 判断员工在对应月份是否参与项目
- 若参与,从薪资表匹配当月薪资并按月汇总
原公式报错原因
- AND函数不支持数组运算:AND在数组场景下只会返回单个布尔值,无法逐元素判断员工-月份的参与状态,需用
*代替逻辑与 - SUMIFS维度不匹配:原公式中SUMIFS返回单个值,无法和日期序列、员工分配的多维数组对齐,需改用支持数组匹配的函数
- OFFSET易失性问题:OFFSET是易失性函数,会增加计算卡顿风险,建议用INDEX替代
修正后的公式方案
基础版(适配虚构结束日期31/12/9999)
在L7单元格输入以下公式(Excel 365/2021直接回车,旧版需按Ctrl+Shift+Enter):
=MMULT(SEQUENCE(1,ROWS($A$18#)), (($L$1#>=INDEX($A$18#,0,4))*($L$1#<=INDEX($A$18#,0,5))) *XLOOKUP($A$18#&$L$1#,EmployeeSalaryTbl[员工]&EOMONTH(EmployeeSalaryTbl[薪资生效日期],0),EmployeeSalaryTbl[月度薪资],0,1) )
公式说明:
INDEX($A$18#,0,4)/INDEX($A$18#,0,5):替代OFFSET,稳定引用员工分配表的「开始日期」「结束日期」列($L$1#>=INDEX(...))*($L$1#<=INDEX(...)):生成员工-月份的参与矩阵,1表示该员工当月参与项目XLOOKUP(...):将员工姓名+当月月末日期作为匹配键,统一日期格式避免匹配误差,精准定位对应薪资记录MMULT:将员工维度的参与矩阵与薪资矩阵相乘,得到每个月的总薪资成本
进阶版(处理薪资结束日期为空的情况)
若将EmployeeSalaryTbl的「薪资结束日期」改为空值(表示当前生效),修改判断逻辑:
=MMULT(SEQUENCE(1,ROWS($A$18#)), (($L$1#>=INDEX($A$18#,0,4))*($L$1#<=IF(INDEX($A$18#,0,5)="",TODAY(),INDEX($A$18#,0,5)))) *XLOOKUP($A$18#&$L$1#,EmployeeSalaryTbl[员工]&EOMONTH(EmployeeSalaryTbl[薪资生效日期],0), IF(EmployeeSalaryTbl[薪资结束日期]="",EmployeeSalaryTbl[月度薪资],IF($L$1#<=EmployeeSalaryTbl[薪资结束日期],EmployeeSalaryTbl[月度薪资],0)), 0,1) )
补充说明:
IF(INDEX($A$18#,0,5)="",TODAY(),INDEX(...)):判断项目结束日期是否为空,为空则用当前日期作为截止- XLOOKUP内的嵌套IF:处理薪资表中空结束日期的情况,确保当前生效的薪资能被正确匹配
附参考数据
项目员工分配数据
| 员工 | 职位 | 学科 | 开始日期 | 结束日期 | 月度薪资 |
|---|---|---|---|---|---|
| Bob | 高级程序员 | 编程 | 12/01/2020 | 06/05/2020 | £4,333 |
| Dave | 中级程序员 | 编程 | 01/02/2020 | 30/05/2020 | £3,167 |
| Peter | 高级程序员 | 编程 | 01/01/2020 | 31/01/2020 | £4,583 |
| Jack | 初级程序员 | 编程 | 01/02/2020 | 30/06/2020 | £2,083 |
| Richard | 高级美术师 | 美术 | 01/03/2020 | 30/04/2020 | £3,750 |
| Rodney | QA主管 | QA | 01/03/2020 | 30/06/2020 | £4,333 |
| Proj 1 - Hire 1 | 高级制片人 | 制片 | 01/02/2020 | 30/05/2020 | £3,458 |
| Roger | QA | QA | 01/01/2020 | 30/04/2020 | £1,667 |
| Wesley | 中级程序员 | 编程 | 01/02/2020 | 31/05/2020 | £3,750 |
| Rachel | 高级美术师 | 美术 | 01/01/2020 | 30/06/2020 | £3,333 |
| Proj 1 - Hire 2 | 首席程序员 | 编程 | 01/01/2020 | 31/07/2020 | £4,417 |
EmployeeSalaryTbl数据
| 员工 | 薪资生效日期 | 薪资结束日期 | 年薪 | 月度薪资 | 日薪 |
|---|---|---|---|---|---|
| Bob | 01/01/2020 | 31/03/2021 | £52,000 | £4,333 | £199 |
| Bob | 01/04/2021 | 31/03/2022 | £55,000 | £4,583 | £211 |
| Bob | 01/04/2022 | 31/12/9999 | £58,000 | £4,833 | £222 |
| Dave | 01/01/2020 | 31/03/2021 | £38,000 | £3,167 | £146 |
| Dave | 01/04/2021 | 31/12/9999 | £42,000 | £3,500 | £161 |
| Wesley | 01/01/2020 | 31/12/9999 | £45,000 | £3,750 | £173 |
| Jack | 01/01/2020 | 31/12/9999 | £25,000 | £2,083 | £96 |
| Richard | 01/01/2020 | 31/12/9999 | £45,000 | £3,750 | £173 |
| Rodney | 01/01/2020 | 31/12/9999 | £52,000 | £4,333 | £199 |
| Proj 1 - Hire 1 | 01/01/2020 | 31/12/9999 | £41,500 | £3,458 | £159 |
| Roger | 01/01/2020 | 31/12/9999 | £20,000 | £1,667 | £77 |
| Steve | 01/01/2020 | 31/12/9999 | £27,000 | £2,250 | £104 |
| Rachel | 01/01/2020 | 31/12/9999 | £40,000 | £3,333 | £153 |
| Peter | 01/01/2020 | 31/12/9999 | £34,000 | £2,833 | £130 |
| Sarah | 01/01/2020 | 31/12/9999 | £22,000 | £1,833 | £84 |
| Chloe | 01/01/2020 | 31/12/9999 | £33,000 | £2,750 | £127 |
| Matthew | 01/01/2020 | 31/03/2021 | £23,000 | £1,917 | £88 |
| Matthew | 01/04/2021 | 31/12/9999 | £28,000 | £2,333 | £107 |
| Proj 1 - Hire 2 | 01/01/2020 | 31/12/9999 | £36,000 | £3,000 | £138 |
内容的提问来源于stack exchange,提问作者Automation Monkey
相关产品推荐
相关产品推荐

