Excel中的高级动态验证列表

Excel中的高级动态验证列表,excel,Excel,虽然其他一些帖子也提到了类似的问题,但我无法找到一个能满足我特定需求的帖子,比如使用多张表单等等 我需要的是能够从一列中的验证列表中选择一个值,然后将第二个验证列表缩小到仅可基于第一个验证列表选择的值,然后是遵循相同逻辑的第三个值,等等 例如,我有5张纸: 日志-此工作表用于输入,将包含 有下拉验证列表 客户-此表是两列客户列表。A列有 客户机ID的B列具有客户机名称 事项-本表为三列事项列表。A列有 一个客户ID,B列有事务ID,C列有事务ID 名字 计时员-此表为两列计时员列表。纵队 A有计

虽然其他一些帖子也提到了类似的问题,但我无法找到一个能满足我特定需求的帖子,比如使用多张表单等等

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

例如,我有5张纸:

  • 日志-此工作表用于输入,将包含 有下拉验证列表
  • 客户-此表是两列客户列表。A列有 客户机ID的B列具有客户机名称
  • 事项-本表为三列事项列表。A列有 一个客户ID,B列有事务ID,C列有事务ID 名字
  • 计时员-此表为两列计时员列表。纵队 A有计时器ID,B列有计时器名称
  • 费率-此表为三列费率列表。A列有一个 物质ID,B列有计时器ID,C列有数字 比率
  • 记录表:

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

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

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

    • D列(速率)将简单地显示给定计时器/事件组合的速率。现在,我们将从A列和C列的输入中获得事务id和客户id,因此我们只需要在费率表中找到具有该事务id和计时器id的行

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

    提前谢谢

    编辑:

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

    • “日志”表将包含许多行,其中用户将从下拉列表中选择计时器,然后从下拉列表中选择客户端(这将限制事件下拉列表),然后从事件下拉列表中选择事件(这与计时器字段中的选择相结合将确定“速率”)

    • 下拉列表将显示“名称”值(即计时员名称、客户名称、事项名称),但基于这些选择的后续列表限制必须基于所选“名称”的“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