我有三个数据验证列表,它们共享相同的名称列表。我们称它们为Name1,Name2和Name3。现在我需要在分层结构中构建这三个数据验证下拉菜单。比如,如果我在第一个数据验证列表中选择Name1,那么在第二个列表中只有Name2和Name3,然后我在第二个列表中选择Name2,第三个列表中只有Name3。我可以用什么方法实现这个目标在这种情况下我应该使用vba还是有其他方式?
答案 0 :(得分:1)
为了得到你想要的结果,答案看似复杂。我将展示它是如何完成的,但我并没有真正深入了解其工作原理,因为它非常先进,如果你正在寻找那种教育,那么Stack Overflow就不是这个地方了。
首先,让我们设置工作簿。在我的示例工作簿中,我有两张表。我留下的第一张图片名为Sheet1
,第二张图片名为Lists
。 Sheet1包含从第2行开始的数据验证下拉单元格,因为第1行是标题行。它应该是这样的(以及当一切都完成时下拉的样子,所以表明它有效):
“列表”表应包含A列中的名称列表,同样从第2行开始,因为第1行是标题行。我们将使用动态命名范围作为完整的名称列表,我将其命名为listNames
,并使用以下公式定义:
=Lists!$A$2:INDEX(Lists!$A:$A,MAX(2,ROWS(Lists!$A:$A)-COUNTBLANK(Lists!$A:$A)))
接下来,我们需要每行生成Sheet1上该行中尚未选择的剩余名称。首先,在单元格C2中,向下只是行号。这不需要在这里,但它使我们更容易手动引用并确保其正常工作。在单元格D2中,上下复制是这个公式:
=IFERROR(INDEX(listNames,MATCH(1,INDEX((COUNTIF(Sheet1!$A2:$C2,listNames)=0)*(COUNTIF($C2:C2,listNames)=0),),0)),"")
我将它复制到第一列,适用于此示例。要使其适合您的实际数据,请确保将其复制到多个列,这些列等于完整列表中的项目数。因为只有三个名字,我只需要将它复制到3列(D:F),但这表明它可以过去,那很好。它必须复制到最小数量的列,等于列A中的项目总数。我还复制了包含Sheet1中数据验证单元格的每一行。在我的示例工作簿中,我将其复制了15行,因此从第2行到第16行,看起来像这样:
请注意,因为在Sheet1的第2行中选择了Name2和Name3,所以公式仅在第2行返回Name1,因为它是唯一的剩余名称。对于第3行和第4行,因为只选择了Name1,所以只有Name2和Name3是为这些行显示的。
下一步是另一个动态命名范围公式。这个很棘手,因为我们希望它查看活动行而不是整个数据集。这是通过在行号上省略绝对参考符号$
来实现的。因此,在Lists
工作表上,选择单元格D2。 你必须为此选择D2 (技术上你可以选择任何单元格,但是复制/粘贴命名范围公式会失败,调整它以匹配你当前选择的任何行)并创建一个新的命名范围,我将此命名为listRemaining
,并使用以下公式定义:
=Lists!$D2:INDEX(Lists!$D2:$IV2,0,MAX(1,COLUMNS(Lists!$D2:$IV2)-COUNTBLANK(Lists!$D2:$IV2)))
最后是创建实际的数据验证单元格。选择要包含下拉列表的单元格,并将它们设置为数据验证列表,并将源设置为=listRemaining
瞧!您现在拥有了您正在寻找的动态下拉列表(如第一张图片所示)。
我希望这可以帮助您,并且您可以根据实际数据进行调整。
示例工作簿:https://drive.google.com/open?id=0Bz-nM5djZBWYNGotU3ZleEk1bk0