You need to enable JavaScript to run this app. 如何使用行定义名称实现SUMPRODUCT计算的简洁方案(适配openpyxl)?
优惠活动
大模型
产品
解决方案
定价
更多

如何使用行定义名称实现SUMPRODUCT计算的简洁方案(适配openpyxl)?

最优实现方案(推荐)

核心通过新增两个全局维度的定义名称,彻底避免逐产品累加的冗长公式,可维护性最高。

前置定义配置

  • 新增全局定义名称 all_quantities:引用范围为所有产品的月度销量行的连续合并区域,维度为「产品总数 × 月份数」(例如3个产品的销量行分别为15、16、17行,对应月份为E到P列,则范围为E15:P17)
  • 新增全局定义名称 all_prices:引用范围为所有产品的月度售价行的连续合并区域,维度与all_quantities完全一致(例如3个产品的售价行分别为18、19、20行,则范围为E18:P20)

后续新增产品时,仅需将新的销量行、售价行的范围追加到上述两个全局定义的引用区间即可,总价值行的公式完全无需修改。

公式编写

场景1:按行输出每个月的总价值(对应你现有需求)

在总价值行的首个月份对应单元格(例如E22),输入如下CSE数组公式,按Ctrl+Shift+Enter确认后向右填充覆盖所有月份列:
=MMULT(TRANSPOSE(ROW(all_quantities))^0, all_quantities * all_prices)

场景2:单个单元格输出全年累计总价值

无需CSE输入,直接使用SUMPRODUCT公式即可:
=SUMPRODUCT(all_quantities, all_prices)

公式逻辑说明

  • all_quantities * all_prices:逐元素匹配计算每个产品单月的「销量×售价」,生成与两个区域同维度的二维数组
  • TRANSPOSE(ROW(all_quantities))^0:生成1行「产品总数」列的全1向量,作用是按列对二维数组做求和计算
  • MMULT(...):矩阵乘法后输出1行「月份总数」列的数组,直接对应每个月的全产品总价值
  • SUMPRODUCT(...):直接对两个区域的逐元素乘积求和,输出全年总价值

OpenPyXL 实现要点
  • 全局定义名称绑定到工作簿层级,而非单工作表,保证公式可全局调用:
from openpyxl.workbook.defined_name import DefinedName

# 新增 all_quantities 全局定义,替换为实际工作表名与范围
wb.defined_names.add(DefinedName('all_quantities', attr_text='工作表名!$E$15:$P$17'))
# 新增 all_prices 全局定义
wb.defined_names.add(DefinedName('all_prices', attr_text='工作表名!$E$18:$P$20'))
  • 写入数组公式时使用ArrayFormula对象,无需手动添加CSE标记:
from openpyxl.worksheet.formula import ArrayFormula

# 总价值行E22单元格写入公式,覆盖范围为总价值行的所有月份列E22:P22
ws['E22'] = ArrayFormula('E22:P22', '=MMULT(TRANSPOSE(ROW(all_quantities))^0, all_quantities * all_prices)')

备选方案(保留单产品定义名称,无新增全局范围)

如果必须保留现有单产品的定义名称,且产品编号为连续规则,可通过间接引用构造数组,但可维护性较弱:
假设现有产品编号为1~N,命名规则固定为product_x_quantity、product_x_selling_price,对应输出每月总价值的CSE公式为:
=MMULT(TRANSPOSE(ROW(INDIRECT("1:"&N))^0), INDIRECT("product_"&ROW(INDIRECT("1:"&N))&"_quantity")*INDIRECT("product_"&ROW(INDIRECT("1:"&N))&"_selling_price"))

缺点:INDIRECT为易失函数,新增产品时需手动修改公式中的N值,远不如全局方案易维护。

内容的提问来源于stack exchange,提问作者agjc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.03 21:24:05