Table of contents
不久前,我们开始探索Excel数据验证的功能,并学习了如何在Excel中基于逗号分隔的列表、单元格范围或命名的范围创建一个简单的下拉列表。
今天,我们将深入研究这一功能,学习如何创建层叠式下拉列表,根据第一个下拉列表中选择的值来显示选择。 换句话说,我们将根据另一个列表的值来制作一个Excel数据验证列表。
如何在Excel中创建多个从属下拉菜单
在Excel中制作多级从属下拉列表是很容易的。 你所需要的只是一些命名的范围和INDIRECT公式。 这种方法适用于所有版本的Excel 365--2010和更早的版本。
1.为下拉列表键入条目
首先,输入你想在下拉列表中出现的条目,每个列表都在一个单独的列中。 例如,我正在创建一个水果出口商的层叠式下拉列表,我的源表的A列( 水果 )包括第一个下拉菜单的项目,其他3列列出了附属下拉菜单的项目。
2.创建命名范围
现在你需要为你的主列表和每个从属列表创建名称。 你可以通过在列表中添加一个新的名称来做到这一点 名字经理 窗口( 公式 标签> 名称管理器> 新) 或直接输入名字在 名称框 .
请注意,如果你的第一行是列头,就像你在上面的截图中看到的那样,你不应该把它包括在命名范围内。
详细步骤请见如何在Excel中定义一个名称。
需要记住的事情。
- 出现在第一个下拉列表中的项目必须是单字条目,例如 杏色 , 芒果 , 橙子 如果你有由两个、三个或更多的词组成的项目,请看如何创建一个有多词条的级联下拉。
- 从属列表的名称必须与主列表中的匹配条目完全相同。 例如,当" "时要显示的从属列表。 芒果 从第一个下拉列表中选择的""应被命名为 芒果 .
完成后,你可能想按下Ctrl+F3来打开 名字经理 窗口,检查所有的名单是否有正确的名字和参考资料。
3.制作第一个(主)下拉列表
- 在同一个或另一个电子表格中,选择一个或几个单元格,你希望在其中出现你的主下拉列表。
- 转到 数据 标签,点击 数据验证 并以通常的方式在一个命名的范围内设置一个下拉列表,选择 列表 根据 允许 中输入范围名称,并在 来源 箱子。
详细步骤,请参见 "基于命名范围制作下拉列表"。
结果,你的工作表中会有一个类似这样的下拉菜单。
4.创建依赖性下拉列表
选择一个或多个单元格作为你的依赖性下拉菜单,并按照上一步所述再次应用Excel数据验证。 但这一次,你不输入单元格的名称,而是在下面的公式中输入 来源 领域。
=INDIRECT(A2)
其中A2是有你的第一个(主要)下拉列表的单元格。
如果单元格A2目前是空的,你会得到错误信息" 源码目前评估为一个错误,你想继续吗? "
安全地点击 是 ,只要你从第一个下拉菜单中选择一个项目,你就会在第二个从属下拉列表中看到与之对应的条目。
5.添加第三个依赖性下拉列表(可选)
如果需要,你可以添加第3个层叠式下拉列表,它取决于第2个下拉菜单的选择或前两个下拉菜单的选择。
设置第三个下拉列表,取决于第二个列表
你可以按照我们刚才制作第二个从属下拉菜单的方式来制作这种类型的下拉列表。 只要记住上面讨论的2个重要事项,这对你的级联下拉列表的正确工作至关重要。
例如,如果你想根据B列中选择的国家在C列中显示一个地区列表,你就为每个国家创建一个地区列表,并以国家名称命名,与国家在第二个下拉列表中出现的名称完全一致。 例如,印度地区的列表应命名为 "印度",中国地区的列表--"中国",以此类推。
之后,你为第3个下拉菜单选择一个单元格(在我们的例子中是C2),并通过以下公式应用Excel数据验证(B2是有第二个下拉菜单的单元格,包含国家列表)。
=INDIRECT(B2)
现在,每当你选择 印度 在B列的国家名单下,你将在第三个下拉菜单中拥有以下选择。
注意:显示的地区列表对每个国家都是唯一的,但它不取决于第一个下拉列表中的选择。
创建依赖于前两个列表的第三个下拉列表
如果你需要创建一个依赖于第一和第二下拉列表中的选择的级联下拉菜单,那么就这样进行。
- 创建额外的命名范围,并为前两个下拉列表中的单词组合命名。 例如,你有 芒果、橙子等。 在第一个列表中的 印度、巴西等。 然后你创建命名的范围 芒果印度 , 芒果巴西 , 橙子印度 , 橙子巴西 这些名称不应包含下划线或任何其他附加字符。
=INDIRECT(SUBSTITUTE(A2&B2," ", "))
其中A2和B2分别包含第一个和第二个下拉菜单。
结果,你的第3个下拉列表将显示与之对应的区域。 水果 和 国家 在前两个下拉列表中选择。
这是在Excel中创建层叠式下拉框的最简单的方法。 然而,这种方法有一些限制。
这种方法的局限性。
- 你的主下拉列表中的项目必须是单字条目。 请看如何用多字条目创建层叠式下拉列表。
- 如果你的主下拉列表中的条目包含范围名称中不允许的字符,如连字符(-)、安培符(&)等,那么这个方法就不起作用。
- 以这种方式创建的下拉菜单不会自动更新,也就是说,每次你在源列表中添加或删除项目时,你都必须改变命名范围的引用。 为了克服这个限制,可以尝试制作一个动态层叠式下拉列表。
创建具有多词条的层叠式下拉列表
我们在上面的例子中使用的INDIRECT公式只能处理一个字的项目。 例如,公式=INDIRECT(A2)间接引用A2单元格,并显示与被引用单元格中的名称完全相同的命名范围。 然而,Excel名称中不允许有空格,这就是为什么这个公式对多字名称不起作用。
解决办法是使用INDIRECT函数与SUBSTITUTE相结合,就像我们在创建第三个下拉菜单时那样。
假设你有 水瓜 在这种情况下,你用一个不带空格的词来命名西瓜出口商名单----。 西瓜 .
然后,对于第二个下拉菜单,用以下公式应用Excel数据验证,将A2单元格中的名称中的空格删除。
=indirect(substitute(a2," ","))
如何防止主要下拉列表中的变化
想象一下下面的情景:你的用户已经在所有的下拉列表中做了选择,然后他们改变了主意,回到第一个列表中,选择了另一个项目。 结果,第一个和第二个选择是不匹配的。 为了防止这种情况发生,你可能想在第二个列表中做出选择后,立即阻止第一个下拉列表中的任何变化。
要做到这一点,在创建第一个下拉菜单时,使用一个特殊的公式来检查第二个下拉菜单中是否有任何条目被选中。
=IF(B2="", Fruit, INDIRECT("FakeList"))
其中B2包含第二个下拉菜单," 水果 "是出现在第一个下拉菜单中的列表名称,而" 赝品清单 "是任何不存在的假名字。
现在,如果在第二个下拉列表中选择了任何项目,当用户点击第一个列表旁边的箭头时,将没有任何选择。
在Excel中创建动态层叠式下拉列表
动态的Excel依赖性下拉列表的主要优点是,你可以自由地编辑源列表,你的下拉框将得到即时更新。 当然,创建动态下拉列表需要更多的时间和更复杂的公式,但我认为这是一个值得的投资,因为一旦设置好,这样的下拉菜单是真正的工作乐趣。
与Excel中的几乎任何事情一样,你可以通过多种方式实现同样的结果。 特别是,你可以使用OFFSET、INDIRECT和COUNTA函数的组合或更有弹性的INDEX MATCH公式来创建动态下拉。 后者是我首选的方式,因为它提供了许多优势,其中最基本的是。
- 你必须只创建3个命名的范围,无论主列表和从属列表中有多少个项目。
- 你的列表可能包含多字项目和任何特殊字符。
- 每一栏中的条目数量可以不同。
- 项目的排序顺序并不重要。
- 最后,维护和修改源列表非常容易。
好了,理论够了,让我们开始实践吧。
1.将你的源数据组织在一个表中
像往常一样,你要做的第一件事是在工作表中写下下拉列表的所有选择。 这一次,你将在Excel表格中存储源数据。 为此,一旦你输入了数据,选择所有条目并按Ctrl + T或点击 插入 标签> 表 .然后在 "表 "中键入一个你的表的名称。 表名 箱子。
最方便、最直观的方法是将第一个下拉菜单的项目存储为表头,而将从属下拉菜单的项目存储为表数据。 下面的截图说明了我的表的结构,名为 出口商_tbl - 水果名称是表头,在相应的水果名称下增加了出口国名单。
2.创建Excel名称
现在你的源数据已经准备好了,是时候设置命名引用了,它将从你的表中动态地检索出正确的列表。
2.1. 为表的标题行添加一个名称(主下拉)。
要创建一个引用表头的新名称,选择它,然后点击 公式 > 名字经理 > 新的 或按Ctrl + F3 。
Microsoft Excel将使用内置的表格参考系统来创建名称为 table_name[#Headers] 模式。
给它起一些有意义的、容易记住的名字,比如说。 水果_列表 ,然后点击 认可 .
2.2. 为包含第一个下拉列表的单元格创建一个名称
我知道你还没有任何下拉菜单 :) 但你必须选择单元格来承载你的第一个下拉菜单,并为该单元格创建一个名称,因为你将需要在第三个名称的引用中包含这个名称。
例如,我的第一个下拉框位于工作表2的B1单元格中,因此我为它创建了一个名称,一些简单的、不言自明的名称,如 水果 :
提示:使用适当的单元格引用来 复制下拉列表 整个工作表。
请一定要仔细阅读下面几段话,因为这是一个非常有用的提示,你不应该错过。 非常感谢Karen发布的信息!
如果你打算将下拉列表复制到其他单元格,那么在为第一个下拉列表的单元格创建名称时要使用混合单元格引用。
为了使下拉菜单能够正确地复制到其他的 专栏 (即向右),使用相对列(不含$符号)和绝对行(含$)引用,如=Sheet2!B$1。
结果,B1的从属下拉列表将出现在B2单元格;C1的从属下拉将显示在C2,以此类推。
如果你打算将下拉菜单复制到其他的 行数 (即顺列),然后使用绝对列(含$)和相对行(不含$)坐标,如= Sheet2!$B1。
要在任何方向上复制下拉单元格,请使用相对引用(没有$符号),如= Sheet2!B1。
2.3. 创建一个名称来检索从属菜单的条目
我们没有像上一个例子中那样为每个从属列表设置唯一的名字,而是要创建一个 命名公式 它将根据第一个下拉列表中的选择,为第二个下拉列表检索正确的条目列表。 使用这个公式的主要好处是,当你向第一个下拉列表添加新条目时,你不必创建新的名称--一个命名的公式涵盖了所有条目。
你用这个公式创建一个新的Excel名称。
=INDEX(exporters_tbl,,MATCH(fruit,fruit_list,0))
在哪里?
出口商_tbl
- 表的名称(在步骤1中创建)。水果
- 包含第一个下拉列表的单元格的名称(在步骤2.2中创建)。水果_列表
- 指的是表头行的名称(在步骤2.1中创建)。
我给它起了个名字 出口商名单 ,正如你在下面的截图中看到的那样。
好了,你已经完成了主要部分的工作!在进入最后一步之前,可能是一个好主意,打开名称管理器(Ctrl + F3)并验证名称和引用。
3.设置Excel数据验证
这实际上是最简单的部分。 有了这两个命名的公式,你就可以用通常的方式设置数据验证( 数据 标签> 数据验证 ).
- 在第一个下拉列表中,在来源框中,输入 =水果_列表 (步骤2.1中创建的名称)。
- 对于依赖的下拉列表,输入 =exporters_list (步骤2.3中创建的名称)。
完成了!你的动态层叠式下拉菜单已经完成,并将自动更新,反映你对源表所做的改变。
这种动态的Excel下拉菜单,在所有其他方面都很完美,但有一个缺点--如果你的源表的列包含不同数量的项目,那么空白行将会像这样出现在你的菜单中。
从动态级联下拉中排除空白行
如果你想清除下拉框中的任何空行,你将不得不更进一步,改进用于创建依赖性动态下拉列表的INDEX / MATCH公式。
我们的想法是使用2个INDEX函数,第一个获得左上角的单元格,第二个返回区域的右下角单元格,或者使用嵌套INDEX和COUNTA的OFFSET函数。 详细步骤如下。
1.创建两个额外的名字
不让公式太过庞大,先用下面的简单公式创建几个辅助名称。
- 一个叫作 col_num 来引用所选的列号。
=MATCH(fruit,fruit_list,0)
- 一个叫作 整个col 来引用选定的列(不是列的编号,而是整个列)。
=INDEX(exporters_tbl,,col_num)
在上述公式中。 出口商_tbl
是你的源表的名称。 水果
是包含第一个下拉菜单的单元格的名称,而 水果_列表
是指引用表头行的名称。
2.为从属的下拉菜单创建命名引用
接下来,利用以下任一公式来创建一个新的名称(让我们称它为 出口商_列表2 )与依赖性下拉列表一起使用。
=INDEX(exporters_tbl,1,col_num) : INDEX(exporters_tbl, COUNTA(whole_col), col_num)
=OFFSET(INDEX(exporters_tbl,1,col_num),0,0,COUNTA(whole_col))
3.应用数据验证
最后,选择包含依赖性下拉的单元格,并通过输入=来应用数据验证。 出口商_列表2 (在上一步中创建的名称)在 来源 箱子。
下面的截图显示了在Excel中产生的动态下拉菜单,其中所有的空白行都消失了!
注意:当使用上述公式创建的动态级联下拉列表时,没有任何东西可以阻止用户在第二个菜单中做出选择后改变第一个下拉框中的值,结果是主下拉框和副下拉框中的选择可能不匹配。 你可以通过使用VBA或其他方式阻止在第二个下拉框中做出选择后对第一个框的改变。本教程中建议的复杂公式。
这就是你如何根据另一个列表的值创建一个Excel数据验证列表。 请随时下载我们的样本工作簿,看看层叠式下拉列表的实际效果。 谢谢您的阅读!
供下载的实践工作手册
层叠式下拉样本1-简易版
层叠式下拉样本2--没有空白的高级版本