下拉菜单的制作和使用,在工作中非常普及,很多人都会。
但是,如果下拉菜单选项列表过多,每次选择的时候要不停地拖动、寻找,这会非常浪费时间。
所以,今天就教大家做一些优化:制作带模糊查询功能的下拉菜单。也就是说,在保留原有功能的基础上,还可以通过输入关键字,搜索菜单项列表。
下面就来看制作方法。
案例:
基于下图 1 的数据表制作查询表格,要求:
将“姓名”制作成下拉菜单
根据“姓名”查询出“与投保人关系”
下拉菜单具有关键字模糊查询功能
效果如下图 2 所示。
解决方案:
今天教大家两种解决方案,先说优劣。
解决方案 1:
优点:
公式相对简单,更加容易上手
缺点:
“姓名”列必须排序,如果顺序打乱,查询结果会出错
只能从姓名的第一个字开始,依次输入关键字查询;比如,如果查询“美”,结果会出错
解决方案 2:
优点:
“姓名”列不需要排序
不需要从第一个字开始查询,查任何位置的关键字都能出正确结果,这才是真正的智能查询
缺点:
公式相对复杂一些,对部分同学来说理解较困难
解决方案 1:
先看一下最终效果。
先将表格按“姓名”重新排序。
1. 选中 A1 至 B15 区域,选择菜单栏的“数据”-->“排序”
2. 在弹出的对话框中按以下方式设置 --> 点击“确定”
勾选“数据包含标题”
主要关键字:姓名
现在数据表按照姓名的拼音升序排列了。
接下来开始制作下拉菜单。
3. 选中 D2 单元格 --> 选择菜单栏的“数据”-->“数据验证”
4. 在弹出的对话框中选择“设置”选项卡,进行以下设置:
允许:序列
来源:=OFFSET($A$2,MATCH("*"&$D$2&"*",$A$2:$A$14,0)-1,0,COUNTIFS($A$2:$A$15,"*"&$D$2&"*"),1)
公式释义:
OFFSET(起始单元格,要偏移的行数,偏移的列数为 0,要引用多少行,引用 1 列)
MATCH("*"&$D$2&"*",$A$2:$A$14,0)-1:在 A2 至 A15 区域模糊查找包含 D2 内容的单元格,找到后返回行号,将该行号 -1,即需要偏移的行数
COUNTIFS($A$2:$A$15,"*"&$D$2&"*"):统计 A2 至 A15 区域中,包含 D2 内容的单元格个数,即需要引用多少行
5. 选择“出错警告”选项卡 --> 取消勾选“输入无效数据时显示出错警告”--> 点击“确定”
最后设置 E 列的查询公式。
6. 在 E2 单元格中输入以下公式:
=IFERROR(VLOOKUP(D2,A:B,2,0),"")
现在就已设置完成,以下是演示效果。
解决方案 2:
相比前一种方法,效果更佳,不需要排序“姓名”列,还可以查找姓名中间的任何一个字。
1. 将 G 列用作辅助列,在 G2 单元格中输入以下公式 --> 按 Ctrl+Shift+Enter 使数组公式生效:
=INDEX(A:A,SMALL(IF(ISNUMBER(FIND(CELL("contents"),$A$2:$A$15)),ROW($A$2:$A$15),4^8),ROW(A1)))&""
公式释义:
A:A:在 A 列中查找
CELL("contents"):返回单元格的值
FIND(CELL("contents"),$A$2:$A$15):查找该值在“姓名”列表中是否存在,存在会返回一个位置数值,不存在则返回错误值
IF(ISNUMBER(FIND(CELL("contents"),$A$2:$A$15)),ROW($A$2:$A$15),4^8):用 isnumber 函数判断 find 结果是否为数值;如果是,就返回其行号;如果不是,则返回 4^8
SMALL(...,ROW(A1)):依次取出数组中第 n 小的值,这个 n 就是 row() 函数返回的值
最后用 index 函数根据行值,查找出姓名
&"":去除无意义的 0 值
2. 向下拖动复制公式,至最后一个姓名所在的行
3. 选中 D2 单元格 --> 选择菜单栏的“数据”-->“数据验证”
4. 在弹出的对话框中选择“设置”选项卡,进行以下设置:
允许:序列
来源:选择刚才制作的辅助列区域
5. 选择“出错警告”选项卡 --> 取消勾选“输入无效数据时显示出错警告”--> 点击“确定”
6. 在 E2 单元格中输入以下公式:
=IFERROR(VLOOKUP(D2,A:B,2,0),"")
现在就已设置完成,以下是演示效果。
Excel学习世界