Excel中的高级动态验证列表

时间:2014-03-07 23:17:12

标签: excel

虽然其他一些帖子解决了类似的问题,但我无法找到满足我特定需求的帖子,使用多张表等。

我需要的是能够从一列中的验证列表中选择一个值,然后将第二个验证列表缩小到可以根据第一个验证列表选择的值,然后是第三个验证列表。遵循相同的逻辑等。

例如,我有5张纸:

  1. 日志 - 此工作表用于输入,并包含列 有下拉列表验证列表。
  2. 客户端 - 此工作表是两列客户端列表。 A栏有 客户端ID,B列具有客户端名称。
  3. 事项 - 此表是三列事项列表。 A栏有 客户ID,B列具有物质ID,C列具有物质 名称。
  4. 计时员 - 此表是两列计时员。柱 A具有计时器ID,列B具有计时器名称。
  5. 费率 - 此表格是三列费率列表。 A栏有一个 物质ID,列B具有计时器ID,列C具有数字 率。
  6. 日志表:

    • 列A(计时器)将是一个简单的验证列表下拉列表,我将从中选择一个计时器(按名称)。此验证列表由计时器表上的列表填充。

    • B列(客户端)将是另一个简单的验证列表下拉列表,我将从中选择(按名称)客户端。此验证列表由客户表上的列表填充。

    • C列(物质)将有一份事项验证清单。这是第一个动态验证列表,因为列表应该只显示属于B列中选择的客户端的事项。我们通过事项表中的列A(客户端ID)知道哪些事务属于客户端。 / p>

    • 列D(速率)将仅显示给定计时器/事件组合的速率。我们现在将输入内容ID和客户端ID从输入到A和C列,因此我们只需要在Rate表中找到具有该id和timekeeper id的行。

    无论您喜欢什么,解决方案都可以使用VBScript。我是一名软件开发人员,所以我对VBScript感到满意,而且我对Excel比较熟悉,所以嵌套的内置函数也可以。

    提前致谢!

    编辑:

    • 此工作簿将从数据库动态生成,因此我需要使用可以通过编程方式生成的方法。

    • “日志”表格将包含许多行,用户将从下拉列表中选择计时器,然后从下拉列表中选择客户端(这将限制物质下拉列表)然后从物质下拉列表中选择一个问题(结合计时器字段中的选择将确定“费率”)。

    • 下拉列表将显示“名称”值(即计时器名称,客户名称,事项名称),但基于这些选择的后续列表的限制必须基于所选“的”ID“值”名”。

    • 显示如何使用后续列​​表限制的示例将非常有用。我看到的所有示例都显示了如何选择一个值并限制第二个列表,但我需要能够从第二个列表中选择限制第三个列表,第三个列表限制第四个列表,最后, “rate”由两个列表中选择的内容决定。

1 个答案:

答案 0 :(得分:1)

动态验证的要点是使用=INDIRECT(SomeNamedRange)作为数据验证列表类型中的源数据。

现在,最难的部分是动态生成此合作伙伴列表。为了这个例子,我假设你有三张: Sheet1 配置验证。我还假设您选择基于Partner的{​​{1}},因为这是一个更简单的示例。

让我们从验证开始。

以下是我的数据示例:

Example data in Validation

请注意我是如何根据最常用的标准(在本例中为Region)对数据进行排序的。这在以后很重要。另请注意,我已将Region命名为A1:A26。我还将Validation.Region命名为B1:B26

配置是您的魔力发生的地方。

转到 Config ,我们需要添加一个唯一区域列表,以及一个描述它们所在位置的地址。我们将此地址命名为Validation.Partner

enter image description here

对于此示例,我使用COUNTIF函数查找列表中的最后一个伙伴。确切的公式是Region.Choices。不幸的是,Excel没有工作表名称的内置函数,所以我不得不对其进行硬编码。我继续硬编码$ B $ 2来提高性能(也许?),但你也可以动态地做到这一点。

Sheet1 是您进行动态选择的地方。

在此表中,我们有以下结构。

Sheet1

选择="Config!$B$2:"&CELL("address";OFFSET(B$2;COUNTIF(B$2:B$230;"?*")-1;0)),将其命名为“Region.Selected”,并将数据验证添加为来源B4列表。

enter image description here

创建动态深入分析背后的逻辑

现在转到Config,并在C1上复制B1的内容,确保更改硬编码的$ B $ 2)。最后,命名为=INDIRECT(Region.Choices),并在C2中键入以下数组公式:C100:

Partner.Choices

enter image description here

注意:要添加数组公式,请在键入公式前选择C2:C100,输入完成后,按Ctrl + Shift + Enter键而不是Enter键。

虽然最初可能看起来很复杂,但如果没有选择=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))),则基本上每Partner返回,或者通过计算结束和开始的位置从选定的Region返回合作伙伴并使用Region将一列向右移动。

结束动态下钻

现在返回 Sheet1 ,取OFFSET,将其命名为“Partner.Selected”(为了保持一致性),并将数据验证添加为源C4列表,如下所示:

对于此示例,我使用COUNTIF函数查找列表中的最后一个伙伴。确切的公式是=INDIRECT(Partner.Choices)。不幸的是,Excel没有工作表名称的内置函数,所以我不得不对其进行硬编码。我继续硬编码$ C $ 2以提高性能,但你也可以动态地做到这一点。

现在继续测试你的动态验证!它应该是这样的:

enter image description here