虽然其他一些帖子解决了类似的问题,但我无法找到满足我特定需求的帖子,使用多张表等。
我需要的是能够从一列中的验证列表中选择一个值,然后将第二个验证列表缩小到可以根据第一个验证列表选择的值,然后是第三个验证列表。遵循相同的逻辑等。
例如,我有5张纸:
日志表:
列A(计时器)将是一个简单的验证列表下拉列表,我将从中选择一个计时器(按名称)。此验证列表由计时器表上的列表填充。
B列(客户端)将是另一个简单的验证列表下拉列表,我将从中选择(按名称)客户端。此验证列表由客户表上的列表填充。
C列(物质)将有一份事项验证清单。这是第一个动态验证列表,因为列表应该只显示属于B列中选择的客户端的事项。我们通过事项表中的列A(客户端ID)知道哪些事务属于客户端。 / p>
列D(速率)将仅显示给定计时器/事件组合的速率。我们现在将输入内容ID和客户端ID从输入到A和C列,因此我们只需要在Rate表中找到具有该id和timekeeper id的行。
无论您喜欢什么,解决方案都可以使用VBScript。我是一名软件开发人员,所以我对VBScript感到满意,而且我对Excel比较熟悉,所以嵌套的内置函数也可以。
提前致谢!
编辑:
此工作簿将从数据库动态生成,因此我需要使用可以通过编程方式生成的方法。
“日志”表格将包含许多行,用户将从下拉列表中选择计时器,然后从下拉列表中选择客户端(这将限制物质下拉列表)然后从物质下拉列表中选择一个问题(结合计时器字段中的选择将确定“费率”)。
下拉列表将显示“名称”值(即计时器名称,客户名称,事项名称),但基于这些选择的后续列表的限制必须基于所选“的”ID“值”名”。
显示如何使用后续列表限制的示例将非常有用。我看到的所有示例都显示了如何选择一个值并限制第二个列表,但我需要能够从第二个列表中选择限制第三个列表,第三个列表限制第四个列表,最后, “rate”由两个列表中选择的内容决定。
答案 0 :(得分:1)
动态验证的要点是使用=INDIRECT(SomeNamedRange)
作为数据验证列表类型中的源数据。
现在,最难的部分是动态生成此合作伙伴列表。为了这个例子,我假设你有三张: Sheet1 ,配置和验证。我还假设您选择基于Partner
的{{1}},因为这是一个更简单的示例。
以下是我的数据示例:
请注意我是如何根据最常用的标准(在本例中为Region)对数据进行排序的。这在以后很重要。另请注意,我已将Region
命名为A1:A26
。我还将Validation.Region
命名为B1:B26
。
转到 Config ,我们需要添加一个唯一区域列表,以及一个描述它们所在位置的地址。我们将此地址命名为Validation.Partner
。
对于此示例,我使用COUNTIF函数查找列表中的最后一个伙伴。确切的公式是Region.Choices
。不幸的是,Excel没有工作表名称的内置函数,所以我不得不对其进行硬编码。我继续硬编码$ B $ 2来提高性能(也许?),但你也可以动态地做到这一点。
在此表中,我们有以下结构。
选择="Config!$B$2:"&CELL("address";OFFSET(B$2;COUNTIF(B$2:B$230;"?*")-1;0))
,将其命名为“Region.Selected”,并将数据验证添加为来源B4
列表。
现在转到Config,并在C1上复制B1的内容,确保更改硬编码的$ B $ 2)。最后,命名为=INDIRECT(Region.Choices)
,并在C2中键入以下数组公式:C100:
Partner.Choices
注意:要添加数组公式,请在键入公式前选择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以提高性能,但你也可以动态地做到这一点。
现在继续测试你的动态验证!它应该是这样的: