Office 365中SUMIFS动态切换条件范围遇SPILL错误求解
问题背景与需求
原使用的SUMIFS公式:
=SUMIFS(SILOADRESERVED, SIPDU, B8&"*", SIPHASE, "A", SITYPE, "<>RMT" )
需要实现动态切换条件范围:当$AJ$4<MD_Main_Changeover_Phase时,使用旧范围SIPDU;否则使用新范围SI_NEW_PDU(二者为等长相邻列的命名范围)。
尝试过以下两种写法,均出现SPILL错误:
=SUMIFS(SILOADRESERVED, INDEX((SIPDU, SI_NEW_PDU), MATCH($AJ$4<MD_Main_Changeover_Phase, {TRUE, FALSE}, 0)), B8&"*", SIPHASE, "A", SITYPE, "<>RMT")
=SUMIFS(SILOADRESERVED, CHOOSE(($AJ$4<MD_Main_Changeover_Phase)+1, SIPDU, SI_NEW_PDU), B8&"*", SIPHASE, "A", SITYPE, "<>RMT")
推测问题根源:SUMIFS逐行迭代时,$AJ$4<MD_Main_Changeover_Phase的判断未同步迭代MD_Main_Changeover_Phase的每行值。
额外限制:项目中有8个类似需切换的命名范围,不想使用辅助列。数据集每行对应一个电力负载,负载有新旧两个源;项目分阶段迁移负载,不同负载切换阶段不同,需跟踪过渡期间的负载情况(4个范围由一个阶段范围控制,另外4个由第二个阶段范围控制)。
简化示例数据
基础数据集(CSV可复制)
| 设备ID | 负载 | 旧PDU | 新PDU | 设备切换阶段 |
|---|---|---|---|---|
| 1 | 5 | A | D | 1 |
| 2 | 5 | A | E | 1 |
| 3 | 10 | B | F | 2 |
| 4 | 10 | B | F | 3 |
| 5 | 20 | C | H | 4 |
预期结果(当前阶段=2时)
| 当前阶段 | 2 |
|---|---|
| PDU A上的负载 | 0 |
| PDU B上的负载 | 10 |
| PDU C上的负载 | 20 |
| PDU D上的负载 | 5 |
| PDU E上的负载 | 5 |
| PDU F上的负载 | 10 |
解决方案
核心思路:不对整个条件范围做切换,而是逐行判断每个负载是否已切换,再匹配对应的PDU值,结合SUMPRODUCT或动态数组公式实现。
适配原需求的公式(Office 365)
=SUMPRODUCT( SILOADRESERVED, --(IF($AJ$4<MD_Main_Changeover_Phase, SIPDU, SI_NEW_PDU)=B8&"*"), --(SIPHASE="A"), --(SITYPE<>"RMT") )
或者使用动态数组兼容的SUM(Office 365支持):
=SUM( SILOADRESERVED * (IF($AJ$4<MD_Main_Changeover_Phase, SIPDU, SI_NEW_PDU)=B8&"*") * (SIPHASE="A") * (SITYPE<>"RMT") )
公式说明
IF($AJ$4<MD_Main_Changeover_Phase, SIPDU, SI_NEW_PDU):逐行判断每个负载是否已切换,返回对应行的旧/新PDU值,生成与数据集等长的动态数组。- 后续的
=B8&"*"、(SIPHASE="A")等条件会逐行计算布尔值,与SILOADRESERVED相乘后求和,实现SUMIFS的筛选效果。 - 若有多个需要切换的范围,只需在IF逻辑中对应扩展即可,无需辅助列。
简化示例验证公式(对应示例数据)
假设当前阶段在单元格G2,计算PDU A的负载:
=SUM( B2:B6 * (IF($G$2<E2:E6, C2:C6, D2:D6)="A") )
注:示例中省略了SIPHASE和SITYPE的条件,可根据实际需求添加。
内容的提问来源于stack exchange,提问作者mybluesock
相关产品推荐
相关产品推荐

