夜雨聆风学习资料网

ARTICLE · 1066309

用一个跨表多条件搜索的经典案例解锁Excel函数嵌套的底层逻辑

用一个跨表多条件搜索的经典案例解锁Excel函数嵌套的底层逻辑
今天接一活比较经典,分享出来帮一些新手读者掌握拆解需求来组合函数的思路,也将函数嵌套的底层逻辑给讲透。文章有点长,但本文含金量很高,直接讲透组合复杂公式的底层逻辑,仔细读完肯定大有收获,文末有案例文件的下载链接。
任务需求看似很简单,有10张工作表,每张表都保存着10个分店不同的销售数据,要求把所有门店同一产品的所有销售信息按条件提取到汇总表中。
具体要求细节:
(1) 按商品名称和销售方式两种搜索条件搜索查询;
(2) 两个搜索条件同时满足或只满足一个搜索条件均可搜索出正确的数据;
(3) 两个搜索条件都为空时,数据区域也为空,无类似0等冗余无效数据;
(4) 搜索出的数据按时间顺序排序。
 分表样式如下:
汇总表样式如下:
制作好的成品如下:
制作过程分享
1、需求拆解
需求很简单,就是在10张分表中把所有满足条件的数据提取到汇总表,然后按时间顺序排序,无冗余无效数据。
将两个条件暂时命名为条件1或条件2,因为两个条件均为下拉框,分别有空值和非空值两种状态,查询条件就有下面4种情况:
(1) 条件1和条件2都为非空值,条件1=TRUE,条件2=TRUE;
(2) 条件1和条件2都为空值,即条件1=FALSE,条件2=FALSE;
(3) 条件1为非空值,条件2为空值,即条件1=TRUE,条件2=FALSE;
(3) 条件1为空值,条件2为非空值,即条件1=FALSE,条件2=TRUE;
为条件1和条件2都为空值时,不提取数据,数据区域为空,那么这个任务需求的最终公式应该为
=IF(AND(条件1="",条件2=""),"",按要求提取数据)
另外三个条件就可以理解为,两个条件中只要有1个条件为非空值时就按条件搜索数据,这个条件的公式应该为:
=AND(OR(条件1="",条件1=商品名称),OR(条件2="",条件2=销售方式))
2、思路分析
主要思路逻辑理顺了之后,下面就看怎么操作。其实用函数实现一个功能就跟手工实现一个功能的过程是一样的,就是将手工操作公式化。如果用手工实现这个功能,第1步该干嘛?
第1步:
如果纯手动实现这个功能,第1步就是将所有分表的数据通过复制粘贴或其他方式合并到一张表中。Excel正好提供了一个函数VSTACK用于分表合并;我们这个案例需要将四块数据区域合并,分别是:合并所有数据区域,合并销售日期区域、合并名称区域,合并销售方式区域;公式如下:
合并所有数据区域
公式1K3=(VSTACK(观音桥门店:两江新区门店!A3:G100)
合并销售日期区域:
公式2:S3=(VSTACK(观音桥门店:两江新区门店!A3:A100)
合并名称区域:

公式3:T3=(VSTACK(观音桥门店:两江新区门店!B3:B10))

合并销售方式区域:

公式4:U3=(VSTACK(观音桥门店:两江新区门店!G3:G100)

小技巧及注意事项:

(1) 因为嵌套函数稍微复杂一些,新手可以将每个公式先写在某个不受影响的单元格中,如K3、S3、T3、U3中,在函数嵌套时复制过去;

(2) 写公式需要跨表选择数据区域时,选中第一张分表,按住shift键后选中最后一张分表,这样10张分表都会被选中,框选数据区域时就会将所有选中分表的区域均选中,如:观音桥门店:两江新区门店!G3:G100)

(3)写嵌套函数时,最好提前将公式用括号括起来,避免在嵌套函数时遗漏括号导致出错;

(4) 所有公式中选取数据的行数必须一致,如上面四个公式中的数据区域均是3行到100行。

第2步

纯手工制作的第2步就是筛选,Excel也提供了实现筛选功能的函数FILTER。其用法是=FILTER(数据区域,筛选条件,无符合项时该怎么办),因为FILTER函数是数组函数,在进行多条件筛选时,用*代替AND函数,用+代替OR函数,不能直接用AND和OR函数。

那么前面理顺的筛选条件应该改为:

=((条件1="")+(条件1=商品名称))*((条件2="")+(条件2=销售方式))

结合案例,条件1为B3单元格中的内容,条件2为E3单元格中的内容,商品名称为上述公式3,销售区域为上述公式4,用相应单元格和公式替换后,筛选条件的表达式为:

公式5:=(((B3="")+(B3=公式3))*((E3="")+(E3=公式4)))

用FILTER函数筛选的公式为:=FILTER(公式1,公式5)

注:FILTER函数的第三参数“无匹配项时该怎么办”先空着,后面再来处理

当写完公式验证时发现,有效数据后面有很多无效的0数据,这是因为分表中有效的数据区域可能只有20几行,为了数据的可扩展性,在选取数据区域时选了第3行到100行的区域,有空行。那么还要剔除掉空行。应该在筛选条件中需增加一个条件,仅筛选有销售日期的数据,即筛选销售日期不为空值的数据,公式表达式为公式2<>"",那么完整的筛选条件为:

公式6:

=(((B3="")+(B3=公式3))*((E3="")+(E3=公式4))*(公式2<>""))

完整的筛选公式为:

公式7:=(FILTER(公式1,公式6))

第3步:

纯手工制作的第3步就是排序,Exce同样提供了排序函数SORT,用法是SORT(需要排序的数据,按第几列排序,升序还是降序,按行排序还是按列排序),我们这里需要排序的数据区域是按条件筛选出来的所有数据区域即公式7,按销售日期第1列)排序,排序后的公式为:

公式8:=SORT(函数7,1)

注:SORT函数的另外两个函数可不填,即为默认值。

第4步:

第4步就是最后一步,当两个查询条件都为空值时,数据区域返空,只要有一个不为空值时,按要求提取数据,公式表达式为

函数9:

=IF(AND(B3="",E3=""),"",公式8)

完整函数为:

=IF(AND(B3="",E3=""),"",SORT(FILTER((VSTACK(观音桥门店:两江新区门店!A3:G100)),((B3="")+(B3=VSTACK(观音桥门店:两江新区门店!B3:B100)))*((E3="")+(E3=VSTACK(观音桥门店:两江新区门店!G3:G100)))*(VSTACK(观音桥门店:两江新区门店!A3:A100)<>"")),1))

嵌套函数编写的小技巧:

(1) 先将内层公式写在其它不受影响的单元格中,并验证公式的正确性;

(2) 在写外层函数时,先不写等号,将内层函数复制进去后,最后输入等号;

案例源文件下载链接:8月份销售明细.xlsx

相关学习资料