Excel2级联动菜单
去年公司拆分,大家忙忙碌碌了一年,在母公司拆分的同时,子公司也纷纷改名,然后就有不少的表单要做。
其中最多的一种就是两级下拉菜单,第一个格子里面选一下公司,然后第二个格子里面可以根据这个公司来选择成本中心。看起来比较先进一点。
其实这个在百度上一搜就是,以前为了省力就让同事们直接去百度一下算了,话说现在有时候觉得自己作为中国人的福利了,有好几次我搜索问题在google上都没找到什么好的答案,要么就是年代久远的时候有人问了一个同样的问题然后没有下文了,之后换成中文描述一下,居然搜出来了。后来想想也可以理解,我国人口众多,电脑用户也多,而且相对于国外大家战线拖得长来说,我们这里大家的情况都差不多,所以能遇到的问题也相似,所以能搜到也不奇怪。
像这个Excel 2级联动菜单的问题,百度上一搜一大堆,写得都很清楚,按照上面的来做一遍之,得出的结果也很理想,可是回去按照上面的办法来做自己的表单,折腾了一会之后,又一个一个来打电话求助了。我仔细看了看,其实这个二级菜单,里面陷阱还不少,网上的教程也省略了一些说明,自然容易出问题。
基础
要把2级菜单彻底搞清楚,要先明白3个概念:
- 命名区域
- 数据验证/数据有效性
- Indirect函数
命名区域
命名区域在公式下面的“定义的名称”这个组里面
点击名称管理器就能查看现在的表单里面已经存在的命名区域,也可以自行增减新的命名区域。
命名区域的作用其实就是你圈一块地方,然后给它一个名字,这样下次用的时候就只要用那个你自己定义的名称就好了,比如说我们习惯把江苏镇江上海合在一起叫做江浙沪,然后包个邮,气死那帮有集中供暖的家伙们。定义了江苏浙江上海是江浙沪之后,每次我们要说到这三个地方的时候就不需要一个一个来说了。这就是命名区域的作用,同样我们可以框起从A1格到D9格这36个格子,命名为”Area”下次用这个区域就不需要用$A$1:$D$9,只要用Area代替就好了,注意的是,因为命名区域其实就是你定义的一个常量,所以在函数里面用的时候是不要加引号的,加了引号就变成字符串了。
命名区域有一个要求就是给这个区域取名字的时候,名字里面不能用很多特殊符号,而且名字的开头必须是字母或者下划线,比如说40.IT就是不可以的,名字里面有空格也不可以,大家尽量用字母开头来取名,如果要分割单词的话,用下划线来代替空格,例如IT_Service_Desk_01这样就是一个合乎规范的命名。
数据验证/数据有效性
数据有效性大家用得应该还是蛮多的,一般都是用它来做下拉菜单,有时候也可以用来控制一下格子里面的内容。
选中一个格子之后就可以设置它的数据有效性。做下拉菜单的话,一般就是选择列表,然后填入列表位置,注意的是,这里的列表是不需要表头的。
Indirect函数
Indirect函数的用法很简单,就是理解起来可能有点费解,这个函数的作用是取出某个格子的值,比如说Indirect(A2)就是取出A2格子的值,困扰在哪里呢?因为我们直接=A2取到的就是A2的值啊,那为什么还要用Indirect呢?举个栗子吧:
我这里有张表,数据在A2~A10里面B2格子里面是一个2~10的参数,我在C2格子里面填充一个A列的值,选哪一个根据B2来,也就是说如果B2里面是3,那C2里面就A3格子的值,如果B2是7,那么C2就是A7的值。
这样就不能直接引用了,大家可以试一下=A2是可以的,=A&B2会报什么错误,=”A”&B2又会报什么错误。
用Indirect就没这个问题啦,我们可以很简单的用=Indirect(“A”&B2)来搞定。
二级菜单的制作
明白了这三个的概念我们再来讨论二级菜单就很简单了。
首先,第一级菜单很简单,我们只要在数据有效性那里选择List,然后把我们要显示的那几个值的列表框进来就可以了
而第二级菜单就是要根据这个第一级菜单的结果,来选择不同的list。这时候怎么办呢?我们用命名区域,把这些不同的List定义成一个个命名区域,每个命名区域用第一级菜单里面的值来做名字,然后在数据有效性那里用Indirect函数来读取(一般在Excel的材料中这个叫返回,不过用读取比较好理解啦)那个list的值就可以啦
实战
- 首先我们来把我们的二级菜单的参数List做好,第一行是第一级菜单的内容:

- 然后我们选中这块区域,然后按Ctrl+G弹出转到(Go to)菜单,选择Sepcial-Constants


这一步是只选择那些有内容的格子,这样做出来的List里面才不会有空格
- 然后在函数(Formulas)菜单中点击Create from Selection,选择Top row.

这样就建立了三个命名区域,名字是第一行的IT;HR和Finance,然后区域是每个标题下面对应的列表

- 然后我们建立第一级下拉菜单
简单的在格子上设置数据有效性,选List,然后引用就是第一行的内容
之后是第二级
当然也是用数据有效性,但是引用的话,我们要根据第一级来选择不同的list,所以用Indirect来引用第一级菜单格子的内容,这样就自然定义到了第一级菜单中的内容所对应的List了
大家来试一下吧!
补充
因为主要是定义命名区域,所以如果你分别一列一列数据选好然后一个一个来建立命名区域,效果也是一样的。
例子的Excel在这里:L2Menu.xlsx

