源文件
目标效果
如图,有两个表格分别为应收账款、收款明细,如何形成以客户名称为统计标准的对账单?公式如下:
=REDUCE("",UNIQUE(应收账款!C2:C17),LAMBDA(x,y,LET(
i,FILTER(应收账款!B:E,应收账款!C:C=y,""),
j,FILTER(收款明细!B:E,收款明细!C:C=y),
k,{"日期","客户","单号","金额","收款日期","收款金额","方式","余额"},
IFERROR(VSTACK(x,VSTACK("","对账单",HSTACK("客户名称:",y),k,HSTACK(i,IFERROR(CHOOSECOLS(j,1,3,4),"")),HSTACK("","合计","",SUM(INDEX(i,,4)),"",IFERROR(SUM(INDEX(j,,3)),0),"",SUM(INDEX(i,,4))-IFERROR(SUM(INDEX(j,,3)),0)))
),""))))
公式思路:通过filter将所需要的数据提取出来,分为应收和收款明细两类,然后通过vstack和hstack的组合构建出表格,最重要的一点是通过“”将所要呈现的数据移动到合适的位置。
通过reduce遍历每一个客户,然后以变量y传递给filter函数,最后用vsatck函数将数据全部呈现出来。
这例思路不是很困难,但是在reduce构建过程中却经常出错,问题就在于使用sum函数计数时会遇到错误值,产生原因是空行。所以要加iferror进行容错,不然会导致整个公式出错,这也是一个公式一键生成要特别注意的地方。
评论 (0)