|
楼主 |
发表于 2022-8-5 11:49
|
显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
改好了,在大佬的基础上加了几个逻辑,删除第一次出现累计=期末库存之后的所有行
,按物料代码聚合之后是我自己摸索写的,之前是抄的大佬的
let
源 = Excel.CurrentWorkbook(){[Name="表1"]}[Content],
分组 = Table.Group(源,"物料代码",{"a",each _}),
fx = (l,t)=>List.Accumulate(l,
[a={},b=0] ,
(s,c)=>if t<c+s
then [a=s[a]&{List.Max({t-s,0})},b=s+c]
else [a=s[a]&{c},b=s+c]
)[a],
结果 = Table.Combine(List.Transform(分组[a],
each Table.FromColumns(
Table.ToColumns(_)&{fx([入库数量],[期末库存]{0})},
Table.ColumnNames(_)&{"分配"})
)),
按物料代码聚合 = Table.Group(结果,"物料代码",{"D",each _}),
遍历添加索引 = Table.TransformColumns(按物料代码聚合,{"D",(x)=>Table.AddIndexColumn(x,"索引",1,1)}),
遍历累加 = Table.TransformColumns(遍历添加索引,{"D",(y)=>Table.AddColumn(y,"累计",each List.Sum(Table.SelectRows(y,(x)=>x[索引]<=[索引])[分配]),type number)}),
/*1.求出第一次出现[累计]=[期末库存]的下标+1
2.以1作为筛选条件,对表格进行遍历筛选,删除不需要的记录行
*/
删除出现负数导致的不符合的行 = Table.TransformColumns(遍历累加,{"D",(y)=>Table.SelectRows(y,(x)=>x[索引]<=List.PositionOf(y[累计],y[期末库存]{0})+1)}),
展开 = Table.ExpandTableColumn(删除出现负数导致的不符合的行, "D", {"入库日期", "入库数量", "期末库存", "分配", "索引", "累计"})
in
展开
|
|