Excel中的高级dynamicvalidation列表

虽然其他一些post解决类似的问题,我无法find一个满足我的具体需求,使用多张表等。

我需要的是能够从一列中的validation列表中select一个值,然后再将第二个validation列表缩小到只能根据第一个validation列表select的值,然后是第三个validation列表逻辑等

例如,我有5张纸:

  1. 日志 – 此工作表用于input,并将包含具有下拉validation列表的列。
  2. 客户 – 此表是客户的两列列表。 列A具有客户端ID,列B具有客户端名称。
  3. 事项 – 这张表是事项的三列列表。 列A具有客户端ID,列B具有物质ID,列C具有物质名称。
  4. 计时器 – 这张表是Timekeepers的两列列表。 列A具有计时器ID,列B具有计时器名称。
  5. 利率 – 这张表是三列税率。 列A有一个问题ID,列B有一个计时器ID,列C有一个数字率。

日志表:

  • 列A(计时器)将是一个简单的validation列表下拉列表,我将从中select一个计时器(按名称)。 此validation列表由Timekeeper表中的列表填充。

  • B列(客户)将是另一个简单的validation列表下拉列表,我将从中select(按名称)客户端。 此validation列表由“客户表”中的列表填充。

  • C栏(Matter)将有一个事项的确认清单。 这是第一个dynamicvalidation列表,因为列表应该只显示属于B列中select的客户端的事项。我们知道哪些事项属于客户端,由“问题”表中的列A(客户端ID)。

  • 列D(费率)将只显示给定计时员/事项组合的费率。 我们现在将事件ID和客户ID从input到列A和C中,所以我们只需要在具有id和timekeeper id的费率表中find该行。

该解决scheme可以使用VBScript或不,你喜欢的。 我是一名软件开发人员,所以我对VBScript很熟悉,而且我对Excel比较熟悉,所以嵌套的内置函数也可以。

提前致谢!

编辑:

  • 这个工作簿将从数据库dynamic生成,所以我需要利用一种可以通过编程方式生成的方法。

  • “日志”工作表将包含许多行,用户将从下拉列表中select一个计时器,然后从下拉列表中select客户端(这将限制事件下拉列表),然后从事件下拉列表中select一个事项计时器字段中的select将决定“速率”)。

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

  • 显示如何使用后续列​​表限制的示例将是最有帮助的。 我见过的所有示例都显示了如何select一个值并限制第二个列表,但是我需要能够从第二个列表中select限制第三个列表,第三个列表限制第四个列表,最后是“费率”由两个列表中select的内容决定。

dynamicvalidation的要点是使用=INDIRECT(SomeNamedRange)作为数据validation列表types中的源数据。

现在,最难的部分是dynamic生成这个合作伙伴列表。 为了这个例子,我假设你有三张纸: Sheet1ConfigValidation 。 我还假设你正在select一个基于RegionPartner ,因为这是一个更简单的例子。

我们从validation开始。

这里是我的数据的一个例子:

验证中的示例数据

请注意我是如何根据最一般的标准(在这种情况下是Region)对数据进行sorting的。 这将在稍后重要。 另外请注意,我已经将A1:A26命名为Validation.Region 。 我也将B1:B26命名为Validation.Partner

configuration是你的魔法发生的地方。

移到configuration文件中 ,我们需要添加一个唯一区域列表和一个地址来描述它们的位置。 我们将把这个地址Region.Choices

在这里输入图像说明

在这个例子中,我使用COUNTIF函数来查找列表中的最后一个伙伴。 确切的公式是="Config!$B$2:"&CELL("address";OFFSET(B$2;COUNTIF(B$2:B$230;"?*")-1;0)) 。 不幸的是,Excel没有表格名称的内置函数,所以我必须对其进行硬编码。 我继续硬编码$ B $ 2来提高性能( 也许? ),但你也可以dynamic地做到这一点。

Sheet1是你做dynamicselect的地方。

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

工作表Sheet1

B4命名为“Region.Selected”,并将Data Validation添加为Source =INDIRECT(Region.Choices)的列表。

在这里输入图像说明

创builddynamic深入分析的逻辑

现在进入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)))

在这里输入图像说明

注意:要添加数组公式,在input公式之前selectC2:C100,一旦完成input,请按Ctrl + Shift + Enter而不是Enter。

虽然起初可能看起来有点复杂,但是如果没有selectRegion ,则基本上返回每个Partner ,或者通过计算其结束位置并开始并使用OFFSET向右移动一列来从所选Region返回伙伴。

包括dynamic深入

现在返回Sheet1 ,取C4 ,将其命名为“Partner.Selected”(为了一致性),并将Data Validation添加为Source =INDIRECT(Partner.Choices)的List,如下所示:

在这个例子中,我使用COUNTIF函数来查找列表中的最后一个伙伴。 确切的公式是="Config!$C$2:"&CELL("address";OFFSET(C$2;COUNTIF(C$2:C$230;"?*")-1;0)) 。 不幸的是,Excel没有表格名称的内置函数,所以我必须对其进行硬编码。 我继续硬编码$ C $ 2来提高性能,但你也可以dynamic地做到这一点。

现在继续testing你的dynamicvalidation! 它应该是这样的:

在这里输入图像说明