如何在 Excel 中实现动态依赖数据验证列表

如何在 Excel 中实现动态依赖数据验证列表

网络上的资源展示了如何实现依赖数据验证列表,但我遇到的都是静态的并且不会自动更新。

我相信任何能够回答这个问题的人都已经专业地了解数据验证列表是如何工作的,但为了像我这样的学习者的目的,我将给出一个简短的描述(我建议进一步阅读谷歌和 YouTube 视频)。

数据验证列表使您能够在工作簿中创建定义的数据结构。它们更适合用于用户交互。如果您希望工作簿用户仅插入一组给定的数据(例如甜甜圈、蛋糕、松饼和松饼),您可以使用命名范围(例如“零食”)创建一个列表,或者可以创建一个表并将表命名为“零食”。给定的名称是一个单词(即给定的名称中不存在空格)

使用列表的缺点是,如果我们必须在列表中添加另一种名为羊角面包的零食,那么我们就需要重新定义最初创建的列表。表格可以避免这种低效率,因为您可以轻松地将新行添加到表格中,方法是从最后一行追加新行,或者在当前表格行之后的下一行中写入新行并按回车键。

现在为了进行数据验证,我建议访问下面的链接以获得详细的揭示,因为解释使这个问题太长了。http://analyticsdemystified.com/excel-tips/excel-dropdowns-done-right/

因此,依赖验证列表是基于用户从先前验证列表中选择的值的列表,例如,甜甜圈类型包括冰圈、巧克力釉面、果酱和蛋奶甜甜圈。松饼类型包括香蕉、蓝莓和巧克力。蛋糕类型包括红丝绒、胡萝卜和椰子。最后,松饼类型包括英式、苏格兰和薄饼。

因此,如果一个单元格有一个主类别列表的下拉列表,您如何根据子类别制作动态依赖验证列表。

通过动态依赖验证列表,我的意思是所有列表都是表格,如下所示。

数据列表作为表格

现在的问题是我如何实现相邻单元格,例如,如果单元格 C13 有一个零食表的验证列表,如何根据用户选择的 C13 输入使单元格 D13 成为验证列表(即,如果选择 C13 作为 Donuts,则 D13 的验证列表的可能选择将是 Donuts 表的列数据)。

请注意,C13 中的原始验证列表将使用 INDIRECT 函数创建,因为它是一个表而不是命名范围。

答案1

只需 4 个简单步骤即可轻松完成

步骤1 创建表格:

在此处输入图片描述

第2步 命名表:选择表并重命名,使其与主表中的值匹配表格1例如,标题为“蛋糕”的表 2 应命名为蛋糕,因为这是主表中的值表格1
但是如何操作呢?单击表格的一角以将其选中,在表格中输入新标签表2或类似内容,然后按 Enter。如果它仍然显示“Table2”等,请不要担心。
笔记!对于主表(例如 Table1)来说,这不是必需的。)

在此处输入图片描述

步骤3 选择您想要的第一个列表的位置,转到数据选项卡并进入数据验证。选择“列表”并=INDIRECT("Table1")在源窗口中输入:

在此处输入图片描述

步骤4 为第二个列表选择一个单元格,该单元格将依赖于第一个列表。返回数据验证,选择“列表”并输入=INDIRECT(K2)“K2”是第一个列表的位置。

在此处输入图片描述

完毕

对于依赖于第二个列表的第三个列表,请重复步骤 4 并参考第二个列表。祝你好运!

答案2

您只需要相信我的话,这确实有效,但我为此编写了一个(非常混乱、乱七八糟的代码)宏。不幸的是,代码一点也不优雅,但它确实有效!正如他们所说......“让它有效,让它正确,让它快速”。

步骤 1:VBA 代码

你需要三样东西:

  1. Chip Pearson 的数组模块--- 实际的 VBA 代码已接近尾声。

  2. Chip Pearson 的排序模块——实际的 VBA 代码也接近尾声。

  3. 我的宏组织得很糟糕

要将这些代码粘贴到工作簿上的 VBA 模块中,请按Alt+ F11,在项目资源管理器中找到您的项目,右键单击模块文件夹并选择“插入模块”。将上述 3 个链接中的代码分别粘贴到单独的模块中。

在此处输入图片描述

在 VBA 编辑器中,打开“引用”对话框(Alt+T然后Enter)并选中“Microsoft Scripting Runtime”。

在此处输入图片描述

第 2 步:构建数据

搞定这些之后,您现在需要的是一张包含数据的工作表(称为“数据”),就像一个结构良好的数据库一样。下面是我的做法:

在此处输入图片描述

请注意,我又创建了两个工作表。一个称为 Validation,用于进行深入验证逻辑;另一个称为 Main,用于最终用户关心的实际内容。

步骤 3:主表

让我们转到数据表并设置以下结构:

在此处输入图片描述

选择单元格C2并将其命名为Snack.Selected。要命名单元格,请选择它,然后点击Alt M M D,然后在出现的对话框中输入名称,如图所示。现在,输入一个值,例如“Cake”,这样下一步就更有意义了。

继续并将单元格命名为C3“Type.Selected”,但现在将其留空。

步骤 4:从数据表中的表格中获取值

转到您的验证表并设置以下结构:

在此处输入图片描述

正如您在屏幕截图中看到的,您应该选择单元格B3:B20并输入以下公式,这就是我的宏实际发挥作用的地方:

=MultiLookup("Data","Snack",TRUE,TRUE)

不要按 Enter,而要按 Ctrl+Shift+Enter,因为这是数组公式

如果它像广告中说的那样有效,你应该会看到一份零食清单,后面跟着一些 #N/A 错误。这些错误是意料之中的——它们只是意味着你拥有的零食比你根据 的大小所预期的要少B3:B20

公式中参数解释:

  1. 数据所在的工作表(“数据”)
  2. 您想要从该工作表中获取的字段(“小吃”)
  3. 删除重复项(即分组)?(TRUE)
  4. 按字母顺序排列?(正确)

好吧,这看起来似乎工作量很大但价值不大,但大结局来了。在单元格中C3:C20,您将放置以下公式:

=MultiLookup("Data","Type",TRUE,TRUE,"Snack",Snack.Selected)

这应该显示可用的蛋糕类型,这是您在上一步中在主表中输入的值,记得吗?

这可以通过在公式中添加两个参数来实现:

  1. 过滤字段(“小吃”)
  2. 仅选择等于 (Snack.Selected) 的值

因此,当您在 Main 中更改数据时,Types 列会自动更新!

步骤 5:完成验证

最后,让我们通过创建Snack.ChoicesType.Choices名称来完成数据验证。请在验证中分别命名单元格B1C1。您也可以在这个小框中键入来命名单元格:

在此处输入图片描述

在单元格上B1,您需要放置以下公式:

="Validation!"&CELL("address",B3)&":"&CELL("address",OFFSET(B$2,COUNTIF(B3:B50,"*"),0))

在此处输入图片描述

这样做的目的是建立一个对 Validation!$B$3:$B$6 的文本引用,这就是您选择的零食的位置。将该公式复制到右侧即可完成!

返回主表并让我们在零食和类型的验证规则中引用这些单元格。

选择单元格C2并按 kbd>AltA V V创建数据验证。选择“列表”并将源设置为=INDIRECT(Snack.Choices)。注意周围没有引号Snack.Choices

在此处输入图片描述

对单元格执行相同操作C3,但将源设置为=INDIRECT(Type.Choices)

我们使用是因为和INDIRECT()的值是对我们的工作簿范围的间接(即文本)引用。Snack.ChoicesType.Choices

现在尝试使用验证选项来查看整个过程的运行情况。

如果您有任何疑问请告诉我!

相关内容