Excel 动态下拉列表-返回值

Excel 动态下拉列表-返回值,excel,Excel,我有一个三栏的电子表格。这些是姓名、年龄、价值 我想根据“名称”列中的唯一值创建一个incell下拉列表。例如,“name”列中可能有两个单元格,其中包含“John”。i、 e.副本 当在下拉列表中选择“John”时,我想创建另一个动态创建的下拉列表,只显示条目的年龄。例如,如果名称列中有两行带有“John”,则另一个下拉列表应仅显示其中每一行的年龄值。基于这两个选择,我想显示值列中的任何内容 你认为我需要使用宏来实现这一点吗 复杂的情况下,列表中的行的数量可能随着时间而改变,因此需要删除空白名

我有一个三栏的电子表格。这些是姓名、年龄、价值

我想根据“名称”列中的唯一值创建一个incell下拉列表。例如,“name”列中可能有两个单元格,其中包含“John”。i、 e.副本

当在下拉列表中选择“John”时,我想创建另一个动态创建的下拉列表,只显示条目的年龄。例如,如果名称列中有两行带有“John”,则另一个下拉列表应仅显示其中每一行的年龄值。基于这两个选择,我想显示值列中的任何内容

你认为我需要使用宏来实现这一点吗

复杂的情况下,列表中的行的数量可能随着时间而改变,因此需要删除空白名称。创建incell下拉列表时的“忽略空格”不起任何作用,它们仍然显示在列表中


任何建议都将不胜感激。

根据您的描述,我认为您正在创建列表验证下拉单元格。列表可以是初始数据库的子集。此类数据库的示例可能如下所示:

使用已验证的下拉列表,如:

这可以通过几个步骤实现

1)在helper列中创建所有唯一名称的子集,我将在J中这样做

=IFERROR(IF(NOT(INDEX($A$2:$A$20,MATCH(0,INDEX(COUNTIF($J$1:J1,$A$2:$A$20),0,0),0))=""),INDEX($A$2:$A$20,MATCH(0,INDEX(COUNTIF($J$1:J1,$A$2:$A$20),0,0),0)),NA()),"")
我为uniques测试的范围仅扩展到A20,但您可以随意选择

2)由于您使用的是用户必须选择的验证列表,因此您可能应该按字母顺序排列它们。我在下一个专栏中通过K来做这件事

=IFERROR(INDEX(INDIRECT("J1:J"&SUMPRODUCT(--(LEN(J:J)>0))+1),MATCH(ROWS($J$2:J2),COUNTIF(INDIRECT("J1:J"&SUMPRODUCT(--(LEN(J:J)>0))+1),"<="&INDIRECT("J1:J"&SUMPRODUCT(--(LEN(J:J)>0))+1)),0)),"")
请注意,这是假设我的uniques在第J列中。如果您将它们放在其他位置,则需要修改它

3)此时,我们可以进行第一次验证下拉列表。我使用的是excel 2016,所以我选择要下拉列表的单元格(在我的例子中是E2),然后转到数据->验证。在下面,我选择允许:列表;资料来源:我输入以下内容:

="K2:K"&SUMPRODUCT(--(LEN(J:J)>0))+1
=INDIRECT($K$1)
=IFERROR(SUM(LARGE(IF(($A$2:$A$20=$E$2)*ROW($A$2:$A$20),$B$2:$B$20,""),COUNTIF($A$2:$A$20,"="&$E$2)-ROW()+ROW($M$2))),"")
因为K1是我跟踪有用的和按字母顺序排列的unique范围的单元格。例如:

现在回到主页上,我在E2中有一个下拉列表。接下来,让我们构建有用年龄的子集

4)在新的辅助对象范围内(对于我是“M2:M10”)输入以下内容:

="K2:K"&SUMPRODUCT(--(LEN(J:J)>0))+1
=INDIRECT($K$1)
=IFERROR(SUM(LARGE(IF(($A$2:$A$20=$E$2)*ROW($A$2:$A$20),$B$2:$B$20,""),COUNTIF($A$2:$A$20,"="&$E$2)-ROW()+ROW($M$2))),"")
这是另一个数组公式,必须使用ctrl+shift+enter提交,但与另一个数组公式不同的是,您必须一次在整个范围内输入此公式,我只选择了少量单元格,因为我知道我不会有超过几年的时间。如果你怀疑你会有更多的钱,那么把这个范围扩大

以与姓名相同的方式,我们可以在附近的一个单元格中跟踪有用年龄的范围(我选择了N1)

5)进行下一个已验证的下拉列表。选择一个单元格(我选择F2),然后再次选择数据->验证,选择一个列表,现在使用年龄来源:

=INDIRECT($N$1)
6)现在很容易获得与该年龄段的个人对应的值。在enter上方的下一个单元格中:

=SUM(IF((A2:A20=E2)*(B2:B20=F2),C2:C20))
给你。下面是我完成的工作表的示例:

还有最后一件事要提。执行此操作并切换到新名称时,不会自动重置“年龄”下拉列表。因此,要使其显示为重置,可以使用一些巧妙的条件格式。我使用以下规则格式化了F2和G2,并将字体颜色设置为白色:

因此,当更改具有更高优先级的下拉列表时,每个单元格中的值都不会重置,但它似乎会空白,迫使用户从该下拉列表中选择新的年龄


祝你好运

你能详细说明一下吗?“如果名称列中有两行带有“John”,那么另一个下拉列表应该只显示其中每一行的年龄值。”在“名称”列中,可能有两个单元格(行)具有重复的条目。在帖子中,我举了一个“约翰”的例子。仍然不明白。这里有3列。第一列长度未知,可能包含重复项。我需要创建一个包含所有唯一值的单元格内下拉列表。然后,当选择其中一个值时,我需要在单元格中创建第二个下拉列表。该列表的值需要取自第二列。这有帮助吗?我同样有点困惑。澄清一下,您的意思是如果您的列表显示:姓名年龄Val John-14-4 Bill-34-2 Sue-21-3 John-16-5,并且在第一个下拉列表中选择了“John”,那么第二个下拉列表将同时显示14和16?如果是这样,我相信我有一个解决办法。请澄清。非常感谢。出于某种奇怪的原因,第一列的uniques很好用,但第二列却没用。刚结束了一个静态下拉列表,一个helper列,vlookup和条件格式,如果没有找到值。这段代码非常慢。有没有办法加快速度?我想很乐意使用宏