使用相同名称列表嵌套数据validation列表

我有三个数据validation列表,它们共享相同的名称列表。 我们称之为Name1,Name2和Name3。 现在我需要在分层结构中构build这三个数据validation下拉菜单。 就像,如果我在第一个数据validation列表中selectName1,那么在第二个列表中将只有Name2和Name3,然后在第二个列表中selectName2,第三个列表中只有Name3。 我可以用什么方法来实现 在这种情况下我应该使用vba还是有其他方法?

为了得到你想要的结果,答案看似复杂。 我将会展示它是如何完成的,但是我不会深入研究它的工作原理,因为它非常先进,如果你正在寻找这样的教育,堆栈溢出不是地方。

首先,让我们来看看我们的工作簿设置。 在我的示例工作簿中,我有两张表。 我留下的第一张纸张名为Sheet1 ,第二张纸张名为Lists 。 Sheet1包含从第2行开始的数据validation下拉单元,因为第1行是标题行。 它应该是这样的(当一切完成后,下拉菜单将会是什么样子,所以显示它是有效的):

Sheet1屏幕截图

“列表”工作表应具有列A中的名称列表,同样从第2行开始,因为第1行是标题行。 我们将使用一个dynamic命名的范围名称的完整列表,我把它命名为listNames ,它是用这个公式定义的:

 =Lists!$A$2:INDEX(Lists!$A:$A,MAX(2,ROWS(Lists!$A:$A)-COUNTBLANK(Lists!$A:$A))) 

接下来,我们需要生成每行中尚未在Sheet1上的该行中select的其余名称。 首先,在C2单元格中,下面是行号。 这不需要在这里,但它使我们更容易手动引用,并确保其正常工作。 在单元格D2中,上下复制的是这个公式:

 =IFERROR(INDEX(listNames,MATCH(1,INDEX((COUNTIF(Sheet1!$A2:$C2,listNames)=0)*(COUNTIF($C2:C2,listNames)=0),),0)),"") 

我把它复制到第一列,这个例子适用。 要使其适合您的实际数据,请确保将其复制到与完整列表中的项目数相等的许多列中。 因为只有三个名字,所以我只需要将它复制到三列(D:F),但是这表明它可以结束,这很好。 它必须复制到最less数量的列,等于列A中的项目总数。我还复制了每个包含Sheet1中的数据validation单元格的行。 在我的示例工作簿中,我将其复制了15行,所以它从第2行到第16行,看起来像这样:

列表表单截图

请注意,因为在Sheet1的第2行中select了Name2和Name3,所以该公式仅在第2行返回Name1,因为它是唯一的剩余名称。 对于第3行和第4行,因为只有Name1被选中,所以只有Name2和Name3是这些行所显示的。

下一步是另一个dynamic命名范围公式。 这一个是棘手的,因为我们希望它看到活动行,而不是整个数据集。 这通过在行号上省略绝对引用符号$来实现。 所以在Listsselect单元格D2。 你必须有细胞D2为此select(技术上你可以select任何细胞,但复制/粘贴命名的范围公式将失败,调整它匹配目前select的任何行),并创build一个新的命名范围,我命名这一个listRemaining并用此公式定义:

 =Lists!$D2:INDEX(Lists!$D2:$IV2,0,MAX(1,COLUMNS(Lists!$D2:$IV2)-COUNTBLANK(Lists!$D2:$IV2))) 

最后是创build实际的数据validation单元。 select要包含下拉列表的单元格,并将其设置为“数据validation列表”,并将“源”设置为=listRemaining

数据验证截图

瞧! 你现在有你正在寻找的dynamic下拉列表(如第一张图片所示)。

我希望这可以帮助你,你可以调整它,以适应你的实际数据。

示例工作簿: https : //drive.google.com/open?id = 0Bz-nM5djZBWYNGotU3ZleEk1bk0