如何用单个Excel函数自动填充多工作表项目净利润数据行
问题概述
- 存在「All Projects Net Profit」工作表,用于存储持续新增的项目数据集
- 每个项目对应一张以「Project Name」命名的独立工作表,负责计算该项目的成本及整体净利润
- 当前在「All Projects Net Profit」的K列使用公式提取各项目月度净利润,支持两种规则:
- 根据E列的项目终止日期提前终止统计
- 当F列设为"Yes"时完全排除该项目,且不改动源数据
- 现有痛点:需手动将K2的公式复制到下方各行,希望改为仅在K2输入单个函数,即可自动填充所有项目行的结果
现有K列单行列公式
=LET(StartOfMonths, $K$1:INDIRECT(ADDRESS(ROW($K$1),COLUMN($K$1)+ StudioProjectedOperatingMonths -1)), ProjectNetProfitData, INDIRECT("'"&A2&"'!$I$1:$XX$13"), TerminateProjectEarly, NOT(ISBLANK($E2)), ExcludeProject, EXACT($F2, "Yes"), NetProfitRowIndex, 13, SetRowToZeros, SEQUENCE(1,StudioProjectedOperatingMonths,0,0), IFERROR(IF(ExcludeProject,SetRowToZeros,IF(TerminateProjectEarly,HLOOKUP(IF(StartOfMonths<=$E2,StartOfMonths, 0), ProjectNetProfitData,NetProfitRowIndex,FALSE),HLOOKUP(IF(StartOfMonths,StartOfMonths, 0), ProjectNetProfitData,NetProfitRowIndex,FALSE))),0))
自动填充解决方案公式
=LET(dataset, FILTER(A2:F999,(A2:A999<>"")), prjName, FILTER(dataset,{1,0,0,0,0,0}), exclude, FILTER(dataset,{0,0,0,0,0,1}), incProj, FILTER(prjName, exclude="No"), terminationDate, FILTER(dataset,{1,0,0,0,1,0}), datesProf, I1:BD1, GET_TERMINATION_DATE, LAMBDA(proj, VLOOKUP(proj, terminationDate,2,FALSE)), GET_DATES, LAMBDA(proj, INDIRECT("'"&proj&"'!B1#")), GET_PROFIT,LAMBDA(proj, LET(dates, INDIRECT("'"&proj&"'!B1#"), INDIRECT("'"&proj&"'!B3:"&ADDRESS(3,MAX(COLUMN(dates)))))), DROP(REDUCE("", prjName, LAMBDA(ac,p, VSTACK(ac, N(ISNUMBER(XMATCH(p, incProj))) * XLOOKUP(datesProf,GET_DATES(p)*(IF(NOT(ISBLANK(GET_TERMINATION_DATE(p))), GET_DATES(p)<= GET_TERMINATION_DATE(p),1)), GET_PROFIT(p),0)))),1))
核心逻辑说明
- 用
FILTER自动筛选非空项目数据,适配后续新增的项目条目 - 封装三个
LAMBDA函数简化重复操作:GET_TERMINATION_DATE:根据项目名称匹配对应的终止日期GET_DATES:提取对应项目工作表中的日期序列GET_PROFIT:提取对应项目工作表中的月度净利润数据
- 通过
REDUCE+VSTACK循环处理每个项目,生成逐行结果,最后用DROP移除初始空行 - 用
N(ISNUMBER(XMATCH(p, incProj)))实现对F列为"Yes"项目的排除逻辑 - 日期判断逻辑
GET_DATES(p)*(IF(NOT(ISBLANK(...)), GET_DATES(p)<=...,1))实现提前终止统计的规则
内容的提问来源于stack exchange,提问作者Automation Monkey
相关产品推荐
相关产品推荐

