
使用LET函数通过定义名称来简化公式,此时,参考公式如下:
=LET( 项目1,B4:B16,
数值1,C4:C16,
项目2,E4:E16,
数值2,F4:F16,
项目, UNIQUE(VSTACK(项目1,项目2)),
表1, SUMIF(项目1,项目,数值1),
表2, SUMIF(项目2,项目,数值2),
差值, 表1-表2,
合并, HSTACK(项目,表1,表2,差值),
筛选, FILTER(合并,差值<>0,"全部一致"),
IFERROR(VSTACK({"项目","表1","表2","表1-表2"},筛选),"")
)
显然,这个公式就非常简练和易读了,公式中按照计算步骤顺序,定义了以下几个名称:
•名称“项目1”:表示单元格区域,B4:B16
•名称“数值1”:表示单元格区域,C4:C16
•名称“项目2”:表示单元格区域,E4:E16
•名称“数值2”:表示单元格区域,F4:F16
•名称“项目”:表示不重复项目,UNIQUE(VSTACK(项目1,项目2))
•名称“表1”:表示每个项目在表1中的值,SUMIF(项目1,项目, 数值1)
•名称“表2”:表示每个项目在表2中的值,SUMIF(项目2,项目, 数值2),
•名称“差值”:表示每个项目在两个表的数值的差值,表1-表2
•名称“合并”:表示将不重复项目名称、表1的值、表2的值和计算出来的差值,合并为一个新数组,HSTACK(项目,表1,表2,差值)
•名称“筛选”:表示对合并数组的筛选结果,筛选条件是差值不为0,FILTER(合并,差值<>0,"全部一致")
LET函数的最后一行是使用VSTACK函数将一行标题文字与筛选结果合并为一个完整核对表,并使用IFERROR函数判断处理错误值,因为如果两个表格数据完全一致,那么FILTER函数的返回结果只有1列数据,但标题是4列数据,列不一致就导致VSTACK函数出返回错误值。
不过,为了能够在任何一个表格中对任意位置的两个表进行核对,我们可以联合使用LAMBDA函数和LET函数设计自定义函数公式,此时参考公式如下:
=LAMBDA( 表1项目, 表1值, 表2项目, 表2值,
LET(项目, UNIQUE(VSTACK(表1项目,表2项目)),
表1,SUMIF(表1项目, 项目,表1值),
表2,SUMIF(表2项目, 项目,表2值),
差值, 表1-表2,
合并, HSTACK(项目, 表1, 表2, 差值),
筛选, FILTER(合并, 差值<>0," 全部一致"),
IFERROR(VSTACK({"项目","表1","表2","表1-表2"}, 筛选),"")
)
)
将这个公式定义一个名称“核对”,就可以在当前工作簿的任何一个工作表调用了。


夜雨聆风