我试图更好地理解递归如何使用 Lambda 函数在 Excel 中工作。我没有想好如何增加函数所在的“值”。
这里的想法是将所有唯一的“发票”值堆叠在一个单元格中,并以“-”作为分隔符,如屏幕截图中以蓝色突出显示的那样。
l_uf = LAMBDA(array,criteria,
UNIQUE(FILTER(CHOOSECOLS(array,2),CHOOSECOLS(array,1)=criteria,"")));
l_ar = lambda(array, criteria,
let(v, l_uf(array, criteria),
n, counta(v),
if(n="","",
CHOOSEROWS(v, n) & "-" &CHOOSEROWS(v, n-1))));
然后我尝试了 lambda 函数 l_ar,它只重试最后两行而不遍历所有数组...请帮助
非常感谢
您可以使用以下公式:
• 单元格中使用的公式
E2
=VSTACK({"Suplier","Invoices"},
DROP(REDUCE("",UNIQUE(B3:B12),
LAMBDA(x,y,VSTACK(x,HSTACK(y,
TEXTJOIN("-",1,UNIQUE(FILTER(C3:C12,B3:B12=y))))))),1))
以更基本和易于理解的方式可以是
• 单元格中使用的公式
E11
=UNIQUE(TOCOL(B:B,1))
• 单元格中使用的公式
F11
=TEXTJOIN("-",1,UNIQUE(FILTER(C:C,E11=B:B)))
上面的公式显然需要往下填
如果你急于使用 LAMBDA() 并希望溢出整个数组,那么你也可以这样使用它,
• 单元格中使用的公式
J2
=LET(_uniqueSup,UNIQUE(TOCOL(B:B,1)),
HSTACK(_uniqueSup,BYROW(_uniqueSup,LAMBDA(x,TEXTJOIN("-",1,UNIQUE(FILTER(C:C,x=B:B)))))))
使用
LET()
并将每个步骤定义为变量:
=LET(_data,B2:C12,
_headers,TAKE(_data,1),
_suplier,DROP(_data,1,-1),
_usuplier,UNIQUE(_suplier),
_invoice,DROP(_data,1,1),
_invoicedelimited,BYROW(_usuplier,LAMBDA(u,TEXTJOIN("-",1,UNIQUE(FILTER(_invoice,_suplier=u))))),
_joindata,HSTACK(_usuplier,_invoicedelimited),
VSTACK(_headers,_joindata))
要使上述递归只需包装在
LAMBDA()
中,您可以在定义的名称管理器中使用一个友好的名称:
=LAMBDA(array,
LET(_data,array,
_headers,TAKE(_data,1),
_suplier,DROP(_data,1,-1),
_usuplier,UNIQUE(_suplier),
_invoice,DROP(_data,1,1),
_invoicedelimited,BYROW(_usuplier,LAMBDA(u,TEXTJOIN("-",1,
UNIQUE(FILTER(_invoice,_suplier=u))))),
_joindata,HSTACK(_usuplier,_invoicedelimited),
VSTACK(_headers,_joindata)))(B2:C12)
公式
=LET(Data,A1:B10,Delimiter,"-",
d,DROP(Data,1),di,TAKE(d,,-1),
du,TAKE(d,,1),u,UNIQUE(du),
ui,BYROW(u,LAMBDA(r,
TEXTJOIN(Delimiter,,FILTER(di,du=r,"")))),
VSTACK(TAKE(Data,1),HSTACK(u,ui)))
LAMBDA 公式
=LAMBDA(Data,Delimiter,LET(
d,DROP(Data,1),di,TAKE(d,,-1),
du,TAKE(d,,1),u,UNIQUE(du),
ui,BYROW(u,LAMBDA(r,
TEXTJOIN(Delimiter,,FILTER(di,du=r,"")))),
VSTACK(TAKE(Data,1),HSTACK(u,ui))))(A1:B10,"-")
LAMBDA 函数
这个你将放在名称管理器中并称之为例如
JoinInv
并与一起使用
=JoinInv(A1:B10,"-")
=LAMBDA(Data,Delimiter,LET(
d,DROP(Data,1),di,TAKE(d,,-1),
du,TAKE(d,,1),u,UNIQUE(du),
ui,BYROW(u,LAMBDA(r,
TEXTJOIN(Delimiter,,FILTER(di,du=r,"")))),
VSTACK(TAKE(Data,1),HSTACK(u,ui))))
变量
A2:B10
- 没有标题的数据B2:B10
- 发票数据A2:B10
- 供应商数据D3:D4
- 唯一供应商的单列数组E3:E4
- 发票加入列的单元格(行)TAKE(Data,1)
- A1:B1
- 标题流量
DROP
和 TAKE
用于引用范围的各个部分。UNIQUE
用于获得独特的供应商。BYROW
Lambda 辅助函数中,发票数据由供应商的数据列值过滤,等于当前行中的唯一值,并且它是 TEXTJOIN
-ed 以获得单个字符串(每行)。最后,我们得到与唯一供应商一样多的联合发票。HSTACK
用于将连接的发票堆叠到唯一的供应商,而 VSTACK
用于将结果列堆叠到标题。