了解 Excel lambda

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

我试图更好地理解递归如何使用 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,它只重试最后两行而不遍历所有数组...请帮助

非常感谢

excel excel-lambda
3个回答
3
投票

您可以使用以下公式:


• 单元格中使用的公式

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)


3
投票

创建 Lambda 函数

公式

=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))))

变量

  • d -
    A2:B10
    - 没有标题的数据
  • di -
    B2:B10
    - 发票数据
  • du -
    A2:B10
    - 供应商数据
  • u -
    D3:D4
    - 唯一供应商的单列数组
  • ui -
    E3:E4
    - 发票加入列的单元格(行)
  • TAKE(Data,1)
    -
    A1:B1
    - 标题

流量

  • DROP
    TAKE
    用于引用范围的各个部分。
  • UNIQUE
    用于获得独特的供应商。
  • BYROW
    Lambda 辅助函数中,发票数据由供应商的数据列值过滤,等于当前行中的唯一值,并且它是
    TEXTJOIN
    -ed 以获得单个字符串(每行)。最后,我们得到与唯一供应商一样多的联合发票。
  • HSTACK
    用于将连接的发票堆叠到唯一的供应商,而
    VSTACK
    用于将结果列堆叠到标题。

0
投票

这是我的输出..

=LET(data,A3:A11,result,B3:B11,unq,UNIQUE(data),VSTACK(A2:B2,HSTACK(unq,MAP(unq,LAMBDA(val,TEXTJOIN(",",,IF(val=data,result,"")))))))

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