【问题标题】:excel sum vlookup by delimiterexcel sum vlookup by delimiter
【发布时间】:2020-06-12 18:17:01
【问题描述】:

我正在尝试根据产品名称数组在 Google 电子表格中求和。产品名称(单个产品和组合产品)通过这样的查询水平动态地列出。组合的产品标题用管道“|”分隔。

=TRANSPOSE(QUERY(Product_Range;"select A where "&SUBSTITUTE(ADDRESS(1;MATCH(B1;Customer_Range;0);4);1;"")&" > 0"))

我可以为分隔的产品标题(例如“产品 1|附加组件 1|附加组件 3”)创建一个静态公式,并对相关列进行汇总,但标题/产品名称的顺序可能会在编辑时发生变化。例如,列标题“Addon-on 1”将来可能是“Product 2”。所以我想动态地制作。

https://docs.google.com/spreadsheets/d/1gJAZHLst707rnfcDTDYWwoLneSwhGgezYaCYpLKOtLI/edit?usp=sharing

单个产品的价格是通过这个公式获取的:

=SUM(
(VLOOKUP($A2 ;Products_Range ;MATCH( C$4; Products_Price_Range  ;0);FALSE)) * 
(VLOOKUP(C$4; Factor_Range; MATCH( Customer_Name;Customers_Range  ;0);FALSE)) )

我需要某种循环来为每个嵌套在分隔产品标头中的产品项使用此公式。

我在 Google Script 中创建了一个自定义函数来执行此操作,但由于行数和连接表的数量,性能确实很慢。

所以我希望使用原生公式快速完成这项工作。

您能否建议如何对每个项目(单个产品列和/或基于数组的产品列)使用我的求和公式?

我希望这可能吗?

【问题讨论】:

  • 请使用上面的 Gsheet-link。
  • 例如 B3。如果公式在此单元格中有效。然后我们可以将其扩展为 B3:F

标签: for-loop google-sheets sum vlookup


【解决方案1】:

清除 B3:B1950

B3:

=ARRAYFORMULA(VLOOKUP(B2;Factor!A:E;MATCH(A1;Factor!1:1;0);0)*MMULT(VLOOKUP(A3:A1949;Prices!A:E;(MATCH(SPLIT(B2;"|");Prices!1:1;0));0);(ROW(A1:index(A:A;counta(SPLIT(B2;"|"))))^0)))

从内到外:从内部拆分开始mmult/match

  • 按分隔符拆分 B2 并创建匹配的索引
  • 将所有不同的索引提供给 vlookup,它会查找所有格式
  • 矩阵将它们与垂直 1s 数组相乘(大小 = 组合实体中组合不同产品的计数)//如果您只查找 1 个结果而不是数组,则不需要。时间>
  • 通过 Vlookup/Match 查找要相乘的因子
  • 将所有 mmult 输出数组乘以因子得到最终结果。

编辑:

=ARRAYFORMULA(MMULT(VLOOKUP(A3:A1949;Prices!A:E;(MATCH(SPLIT(B2;"|");Prices!1:1;0));0);transpose(VLOOKUP(Split(B2;"|");Factor!A:C;MATCH(A1;Factor!1:1;0);0))))

【讨论】:

  • 很棒的公式!非常感谢。对于客户 2(参见 A1),总和是正确的,因为乘法因子为 1(参见表因子)。请您看一下客户 1 的 B3。B3 应该给出 17,97 欧元作为回复。
  • 我的错误,我不想对组合产品使用 1 个因子,而是数组中提到的每个产品名称的相关因子。我已经编辑了工作表“因素”。
  • 我正在尝试。我认为我应该留在 MMULT 循环中,以便将每个产品数量乘以相关因素。对于单个产品名称,此公式显示相关因素。 =VLOOKUP("Product 1";Factor!A:C;MATCH(A1;Factor!A1:C1);FALSE) 你能再给点建议吗?
猜你喜欢
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多