Excel INDEX公式动态行引用问题:拖拽复制时如何自动适配行号
问题说明
我在工作表中有多个计算月度和年度员工招聘、离职的数据集,另有一个数据集用于通过两行数据相减计算特定学科的年度累计人员总数,使用的函数如下:
=LET(duration, SEQUENCE(1,(StudioProjectedOperatingMonths+12)/12, COLUMN(K:K)), StartRow, 25, RowsUntilSecondRow, 44, DisciplineEntryIndex, ROW(INDEX(DisciplineTbl[Discipline],MATCH(J113,DisciplineTbl[Discipline],0)))-ROW(DisciplineTbl[#Headers])-1, FirstRow, StartRow+DisciplineEntryIndex, SecondRow, StartRow+RowsUntilSecondRow+DisciplineEntryIndex, DisciplineValues, INDEX($1:$84,{25;69},duration), StaffInOut, LET(x, DisciplineValues,INDEX(x,1)-INDEX(x,2)), SCAN(0, StaffInOut,LAMBDA(x,y,x+y)) )
该公式在K113单元格中能得到正确结果,但将其拖拽复制到K114等单元格时,需手动将INDEX函数中的行引用调整为INDEX($1:$84,{26;70},duration)等。
我尝试创建FirstRow和SecondRow变量(初始值为25和69,通过学科表中的索引行号叠加数值,如Programming加0、Design加1等),想用INDEX($1:$84,{FirstRow;SecondRow},duration)替换原INDEX部分,但该语法不被支持。请问是否有可行的解决方法,或需要换一种实现思路?
解决方法
方法1:用VSTACK生成动态行数组
Excel的VSTACK函数可以将单个值合并为垂直数组,完美替代硬编码的常量数组{25;69}。修改DisciplineValues行代码:
DisciplineValues, INDEX($1:$84, VSTACK(FirstRow, SecondRow), duration),
拖拽单元格时,FirstRow和SecondRow会随DisciplineEntryIndex自动更新,VSTACK会动态生成对应两行的数组,INDEX即可正确引用目标行数据。
方法2:用CHOOSE兼容旧版本
如果你的Excel版本不支持VSTACK,可以用CHOOSE函数构建行数组:
DisciplineValues, INDEX($1:$84, CHOOSE({1,2}, FirstRow, SecondRow), duration),
{1,2}作为索引,CHOOSE会依次返回FirstRow和SecondRow的值,形成INDEX可识别的垂直数组。
优化后的完整公式
替换后可简化内部嵌套的LET,整体公式如下,拖拽时无需手动调整行号:
=LET(duration, SEQUENCE(1,(StudioProjectedOperatingMonths+12)/12, COLUMN(K:K)), StartRow, 25, RowsUntilSecondRow, 44, DisciplineEntryIndex, ROW(INDEX(DisciplineTbl[Discipline],MATCH(J113,DisciplineTbl[Discipline],0)))-ROW(DisciplineTbl[#Headers])-1, FirstRow, StartRow+DisciplineEntryIndex, SecondRow, StartRow+RowsUntilSecondRow+DisciplineEntryIndex, DisciplineValues, INDEX($1:$84, VSTACK(FirstRow, SecondRow), duration), StaffInOut, INDEX(DisciplineValues,1)-INDEX(DisciplineValues,2), SCAN(0, StaffInOut,LAMBDA(x,y,x+y)) )
内容的提问来源于stack exchange,提问作者Automation Monkey
相关产品推荐
相关产品推荐

