Excel中的高级动态验证列表
虽然其他一些帖子也提到了类似的问题,但我无法找到一个能满足我特定需求的帖子,比如使用多张表单等等 我需要的是能够从一列中的验证列表中选择一个值,然后将第二个验证列表缩小到仅可基于第一个验证列表选择的值,然后是遵循相同逻辑的第三个值,等等 例如,我有5张纸:Excel中的高级动态验证列表,excel,Excel,虽然其他一些帖子也提到了类似的问题,但我无法找到一个能满足我特定需求的帖子,比如使用多张表单等等 我需要的是能够从一列中的验证列表中选择一个值,然后将第二个验证列表缩小到仅可基于第一个验证列表选择的值,然后是遵循相同逻辑的第三个值,等等 例如,我有5张纸: 日志-此工作表用于输入,将包含 有下拉验证列表 客户-此表是两列客户列表。A列有 客户机ID的B列具有客户机名称 事项-本表为三列事项列表。A列有 一个客户ID,B列有事务ID,C列有事务ID 名字 计时员-此表为两列计时员列表。纵队 A有计
- 列A(计时器)将是一个简单的验证列表下拉列表,我将从中选择一个计时器(按名称)。此验证列表由计时表上的列表填充
- B列(客户机)将是另一个简单的验证列表下拉列表,我将从中选择(按名称)客户机。此验证列表由“客户端”工作表上的列表填充
- C列(事项)将有一份事项验证清单。这是第一个动态验证列表,因为该列表应仅显示属于在B列中选择的客户的事项。我们通过事项表中的a列(客户ID)知道哪些事项属于客户
- D列(速率)将简单地显示给定计时器/事件组合的速率。现在,我们将从A列和C列的输入中获得事务id和客户id,因此我们只需要在费率表中找到具有该事务id和计时器id的行
- 此工作簿将从数据库动态生成,因此我需要使用一种可以通过编程生成的方法
- “日志”表将包含许多行,其中用户将从下拉列表中选择计时器,然后从下拉列表中选择客户端(这将限制事件下拉列表),然后从事件下拉列表中选择事件(这与计时器字段中的选择相结合将确定“速率”)
- 下拉列表将显示“名称”值(即计时员名称、客户名称、事项名称),但基于这些选择的后续列表限制必须基于所选“名称”的“ID”值
- 演示如何使用后续列表限制的示例将非常有用。我看到的所有示例都显示了如何选择一个值并限制第二个列表,但我需要能够让第二个列表中的选择限制第三个列表,第三个列表限制第四个列表,最后,“速率”由两个列表中选择的内容决定
=INDIRECT(SomeNamedRange)
作为数据验证列表类型中的源数据
现在,最困难的部分是动态生成这个合作伙伴列表。在本例中,我假设您有三个工作表:Sheet1、Config和Validation。我还假设您正在基于区域选择合作伙伴
,因为这是一个更简单的示例
让我们从验证开始。
以下是我的数据示例:
请注意,我是如何根据最一般的标准(本例中为区域)对数据进行排序的。这将在以后很重要。还要注意,我将A1:A26
命名为Validation.Region
。我还将B1:B26
命名为Validation.Partner
配置是你的魔法发生的地方。
转到配置,我们需要添加一个唯一区域的列表,以及描述它们所在位置的地址。我们将此地址命名为Region.Choices
对于本例,我使用COUNTIF函数查找列表中的最后一个合作伙伴。确切的公式是=“Config!$B$2:”&CELL(“地址”偏移量(B$2;COUNTIF(B$2:B$230;“?*”))-1;0))
。不幸的是,Excel没有用于工作表名称的内置函数,所以我不得不硬编码。我继续硬编码$B$2以提高性能(也许?),但您也可以动态地这样做
Sheet1是您进行动态选择的地方。
在本表中,我们有以下结构
取B4
,将其命名为“Region.Selected”,并将数据验证添加为源=间接(Region.Choices)
列表
创建动态深入分析背后的逻辑
现在转到Config,复制C1上B1的内容,确保更改硬编码的$B$2)。最后,命名Partner.Choices
,并在C2:C100中键入以下数组公式:
=IF(Region.Selected=“”;OFFSET(Validation.Partner;1;0;COUNTA(Validation.Partner);1);OFFSET(Validation.Region;MATCH(Region.Selected;Validation.Region;0)-1;1;COUNTIF(Validation.Region;Region.Selected))
注意:要添加数组公式,请在键入公式之前选择C2:C100,键入完毕后,按Ctrl+Shift+Enter键而不是Enter键
虽然一开始它可能看起来很复杂,但这基本上是返回每个伙伴
,如果没有区域
i