Excel 根据物料清单 (BOM) 和采购价格历史动态计算产品成本

问题描述 投票:0回答:1

目标:

根据物料清单和每种材料(组件)的采购价格历史记录计算一系列日期的产品成本


源数据

TableBOM 包含每种产品所需的组件组合(Q = 数量)

组件 1 Q1 组件 2 Q2 结果
纸1 1 塔吉塔个人 20 塔吉塔 x20
纸2 2 塔尔杰顿 40 Tarjetón x40
银行 4 Empaque pequeño
辛塔佩 5 Empaque pequeño
分离器pe 6 Empaque pequeño
塔吉塔 x20 1 Empaque pequeño 1 Tarjeta empaque pe
Tarjetón x40 1 大恩帕克 1 Tarjetón empaque gr
Caja gr 7 大恩帕克
辛塔格 8 大恩帕克
诺塔 1 Empaque pequeño 1 Nota empaque pe
塔吉塔 x20 1 大恩帕克 1 Tarjeta empaque gr
Tarjetón empaque gr 1 Nota empaque pe 2 Tarjetón + 注释
纸3 3 塔尔杰顿
迪维格 9 大恩帕克
索布雷4 1 Nota sola 1 诺塔

TablePurchaseComponent有每种材料(组件)的历史价格

费查 组件 Preciounitario
2023 年 1 月 1 日 Caja gr 100
2023 年 1 月 1 日 银行 110
2023 年 1 月 1 日 辛塔格 120
2023 年 1 月 1 日 辛塔佩 130
2023 年 1 月 1 日 迪维格 140
2023 年 1 月 1 日 Nota sola 150
2023 年 1 月 1 日 纸1 10
2023 年 1 月 1 日 纸2 20
2023 年 1 月 1 日 纸3 30
2023 年 1 月 1 日 分离器pe 190
2023 年 1 月 1 日 索布雷4 200
2023 年 1 月 1 日 塔吉塔个人 2
2024 年 1 月 1 日 Caja gr 200
2024 年 1 月 1 日 银行 220
2024 年 1 月 1 日 辛塔格 240
2024 年 1 月 1 日 辛塔佩 260
2024 年 1 月 1 日 迪维格 280
2024 年 1 月 1 日 Nota sola 300
2024 年 1 月 1 日 纸1 20
2024 年 1 月 1 日 纸2 40
2024 年 1 月 1 日 纸3 60
2024 年 1 月 1 日 分离器pe 380
2024 年 1 月 1 日 索布雷4 400
2024 年 1 月 1 日 塔吉塔个人 4

工作表中的表格:


Lambda 函数(按定义名称):

fxProcessVal:

=LAMBDA(lookup_val;LET(comp_res; VSTACK(FILTER(TableBOM[[Componente 1]:[Q1]]; TableBOM[Resultado] = lookup_val); FILTER(TableBOM[[Componente 2]:[Q2]]; TableBOM[Resultado] = lookup_val)); comp_res_fil; FILTER(comp_res; CHOOSECOLS(comp_res; 2) <> ""); lookup_col; IFNA(EXPAND(lookup_val; ROWS(comp_res_fil)); lookup_val); IFERROR(HSTACK(lookup_col; comp_res_fil); "")))

fxProcessCompRow:

=LAMBDA(data;lookup_row;LET(sourceData; fxProcessVal(INDEX(data; lookup_row; 2)); res_val; INDEX(data; 1; 1); res_col; IFNA(EXPAND(res_val; ROWS(sourceData)); res_val); sourceRes; HSTACK(res_col; DROP(sourceData; 0; 1)); IF(sourceData <> ""; FILTER(sourceRes; CHOOSECOLS(sourceRes; 2) <> ""); CHOOSEROWS(data; lookup_row))))

fxProcessComp:

=LAMBDA(source;LET(seq; SEQUENCE(ROWS(source)); reducer; REDUCE(""; seq; LAMBDA(acc;curr; VSTACK(acc; IFNA(fxProcessCompRow(source; curr); HSTACK(""; ""; ""))))); temp_res; DROP(reducer; 1); temp_res))

fxCompCost:

=LAMBDA(comp;date;INDEX(TablePurchaseComponent[Precio unitario]; MATCH(MAXIFS(TablePurchaseComponent[Fecha]; TablePurchaseComponent[Fecha]; "<=" & date; TablePurchaseComponent[Componente]; comp) & comp; TablePurchaseComponent[Fecha] & TablePurchaseComponent[Componente]; 0)))

近似值:

=LAMBDA(seed;LET(res; IF(COUNTA(seed) = 1; fxProcessVal(seed); fxProcessComp(seed)); comp; CONCAT(seed) = CONCAT(res); IF(comp; seed; prox(res))))

公式

分解 BOM 清单的公式(并分解所需的每种产品材料和数量):

=UNIQUE(DROP(REDUCE("";TableBOM[Resultado];LAMBDA(acc;curr;VSTACK(acc;prox(curr))));1))

计算每种产品成本的日期是使用以下公式在一个范围内动态设置的:

=DATE(YEAR(Q1);SEQUENCE(1;DATEDIF(Q1;Q2;"M")+1;MONTH(Q1);1);1)

卡在这里:

我想设置Q3(日期范围作为溢出范围)并计算每个月每种产品的成本。

目前 SUMPRODUCT 计算所有月份(范围内的日期)的总计。

我尝试过 BYCOL 以及 MAP 和 Sequence 的组合,但还没有弄清楚。

如有任何帮助,我将不胜感激。

链接到只读示例文件(无宏)

=LET(
     data;L4#;
     date;Q3#;
     res;INDEX(data;;1);
     comp;INDEX(data;;2);
     q;INDEX(data;;3);
     lab;UNIQUE(res);
     cost;q*fxCompCost(comp;date);
     rt;MAP(lab;LAMBDA(a; SUMPRODUCT((res=a)*cost)));
     temp;HSTACK(lab;rt);
temp
)

想要的结果:

excel office365 dynamic-arrays excel-lambda
1个回答
0
投票

我使用了

REDUCE
SEQUENCE
的组合来迭代每个日期列。

=LET(
     data;L4#;
     dateRow;DATE(YEAR(ParamStartDate);SEQUENCE(1;DATEDIF(ParamStartDate;ParamEndDate;"M")+1;MONTH(ParamStartDate);1);1);
     headers;HSTACK("";dateRow);
     date;dateRow;
     res;INDEX(data;;1);
     comp;INDEX(data;;2);
     q;INDEX(data;;3);
     lab;UNIQUE(res);
     cost;q*fxCompCost(comp;date);
     reducer;REDUCE("";SEQUENCE(COLUMNS(date));LAMBDA(acc;curr;HSTACK(acc;MAP(lab;LAMBDA(a; SUMPRODUCT((res=a)*CHOOSECOLS(cost;curr)))))));
     result;VSTACK(headers;HSTACK(lab;DROP(reducer;;1)));
     result
)

已添加到工作表中的姓名:

参数开始日期:

Q2
参数结束日期:
Q3

决赛:

如果有人提出更好的解决方案,甚至可以处理 BOM,请发布。

希望这对其他人有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.