Excel:如何基于数据表创建动态数据验证列表

时间:2013-11-01 15:38:18

标签: excel validation dynamic

想象一下,我正在为我的孩子在Excel中编写一个菜单规划器(比我的实际问题更容易描述)......

我有一份可用的食物清单:苹果,香蕉,胡萝卜,红枣,鸡蛋,鱼等。

我有一个孩子名单:John,Karen,Lional,Mike等。

然后,我有一个简单的表格列出了每个孩子喜欢的食物:在约翰的专栏下,对苹果,香蕉和鱼有一个'x',但对其他人则是空白。

     J  K  L  M
---------------
a    x  x  x
b    x     x
c       x  x  x
d       x
e          x  x
f    x

现在,在我的菜单规划器的主要部分,我想要一些带有数据验证的单元格,允许我为每个孩子选择食物,使用上面的“赞”表:

Name  Food
A2    B2

单元格A2将包含数据验证,其中包含所有孩子名称(J,K,L,M)的单元格下拉列表(这很简单 - 我可以做到这一点!)

Cell B2需要包含动态生成的所选孩子喜欢的食物列表。所以,如果我在A2中选择John,那么B2列表将是{a,b,f}。如果我选择莱昂内尔,B2列表将是{a,b,c,e}。显然,随着我孩子的口味变化,我可以通过添加/删除'x'来更新我的'赞'表,B2中的下拉菜单会自动更新。

如何为单元格B2创建下拉列表验证列表? (我更愿意这样做而不诉诸VBA)

4 个答案:

答案 0 :(得分:2)

我假设您的数据表在A1:E7范围内。

步骤1.为每个孩子创建一个选项列表

为每个孩子创建一个列出所有首选项的列表(在列表的末尾我添加了“ - ”作为占位符)。在G2中输入此公式并拖动到范围G2:J7:

=IF(G1="-";"-";IF(ISNA(OFFSET($A$1;IFERROR(MATCH(G1;$A$2:$A$7;0);0)+
MATCH("x";OFFSET(B$2;IFERROR(MATCH(G1;$A$2:$A$7;0);0);0;7;1);0);0;1;1));
"-";OFFSET($A$1;IFERROR(MATCH(G1;$A$2:$A$7;0);0)+MATCH("x";OFFSET(B$2;
IFERROR(MATCH(G1;$A$2:$A$7;0);0);0;7;1);0);0;1;1)))

还将儿童姓名放在数据栏上方(G1:J1)。

步骤2.创建条件数据验证

鉴于您的第一个数据验证列表(名称)位于单元格L2中并且您已执行步骤1,请使用此公式进行食品数据验证:

=OFFSET(F$2;0;MATCH(L2;$G$1:$J$1;0);6-COUNTIF(OFFSET(F$2:F$7;0;
MATCH(L2;$G$1:$J$1;0));"-"))

此公式既排除了列表中的所有空选项(“ - ”),又根据孩子的名字给出了正确的列表。


<强>更新。使用INDEX / MATCH的替代解决方案

OFFSET是一个易变的公式(即Excel会在您的工作簿发生任何变化时重新计算它),因此您可能希望使用INDEX执行此操作。以下是我上面第1步的公式:

=IF(G1="-";"-";IFERROR(INDEX($A$2:$A$7;IFERROR(MATCH(G1;$A$2:$A$7;0);0)+
MATCH("x";INDEX(B$2:B$7;IFERROR(MATCH(G1;$A$2:$A$7;0)+1;1);1):B$7;0);1);"-"))

对于第二步,似乎只有在选择单元格时才会重新计算数据验证的公式,因此OFFSET在数据验证列表中没有波动性。由于INDEX无法返回范围且Excel不允许INDEX(..):INDEX(..)范围进行数据验证,OFFSET更适合数据验证列表。

答案 1 :(得分:1)

首先发布警告!!

这是我的方法 http://www.mediafire.com/download/sqm41koonqjdz99/DynamicLists.xlsx

它基于三个步骤。

步骤1:它使用一系列5个表来将食物/孩子喜欢的x表格打成更有用的东西,列出每个孩子,他们的第1,第2,第3等喜欢其次#N / A&#39;对于任何&#34;未使用的&#34;喜欢的职位。第五个表包含数据验证信息 - 它只是从该表中选择正确的列和正确的行数的问题。

步骤2:单元格D2和E2分别识别列和行数。

步骤3:动态定义名为ValidFood的命名范围,并使用= OFFSET()函数从第五个表中选择正确的列和行。这是一个聪明的位 - 您可以在名称管理器中使用函数,以及这里所做的事情。单元格B2的数据验证规则仅引用此命名范围。或者,可以使用自定义选项

直接在数据验证规则中使用= OFFSET()公式

我已经根据丽娜的观点对这个解决方案进行了回顾,结果发现它们没有什么不同。在这两个解决方案中,步骤1都实现了相同的目标(除了Lina使用&#39; - &#39;字符代替我的#N / A用于未使用的选项)。然后两者都选择步骤1的结果的相关位并将其应用于数据验证规则。它们之间的区别在于方法:冗长和嵌套的公式合二为一(如此紧凑但需要努力去理解)与更广泛地使用工作表来记录另一方面的详细步骤(不太紧凑但需要较少的理解力)。

答案 2 :(得分:0)

如果没有VBA,你绝对可以做到这一点。如果尚未将开发人员选项卡添加到Excel,请立即执行此操作。 http://msdn.microsoft.com/en-us/library/vstudio/bb608625.aspx

对于每个列表,您都需要创建一个命名范围。所以为“名字”制作一个,然后为每个人最喜欢的食物制作一个。例如:AJ_Likes,RJ_Likes。

接下来,您将要插入一个组合框(Active X Control)。右键单击该框,然后选择“属性”。在“ListFillRange”下,键入“名称”范围。这将在您的第一个方框中填写您的家庭成员的姓名。然后,您希望将列表链接到单元格,因此每个选择都将使用该值填充单元格。您可以将下拉列表直接放在链接的单元格上,这样就不会出现(为了美观)。

“LinkedCell”也位于组合框的属性框中。然后,您要创建第二个组合框。此框将具有填充范围=您将创建的新动态范围。动态范围将根据第一个框的选择而改变。

在动态范围内,使用条件公式,例如:
= IF($ F $ 3 =“aj”,INDEX(aj_likes,1),IF($ F $ 3 =“rj”,INDEX(rj_likes,1),“”))

它基本上表示如果F3 = AJ,则从AJ_Likes范围中选择第一行,否则,如果它是=到RJ,则从RJ_Likes范围中选择第一行。 enter image description here enter image description here

我似乎无法显示我的图片,所以这里有一些指向我创建的屏幕截图的链接。希望这有帮助 - 很高兴提供额外的帮助。

http://hostmypicture.com/images/1ici.jpg

http://hostmypicture.com/images/2aga.jpg

抱歉 - 注意到您特别要求进行数据验证。与上面的步骤相同,但是不添加第二个组合框,只需添加数据验证,LIST作为选项,并选择动态列表作为范围。

http://hostmypicture.com/images/3olo.jpg

答案 3 :(得分:0)

如果您准备重新排列初始表,那么您可以更轻松地创建条件单元格下拉列表验证列表,如下所示:

您需要设置两个表,一个用于数据,一个用于查找。

在单元格A1:D1中输入孩子的名字。

在每一个中,在B1:D6中输入他们喜欢的食物,每个细胞一个。你可以根据上面的例子留下空白,或者把它们全部推开,这样一些孩子就会有更短的名单。

然后为每个孩子的选择创建一个命名范围 - 例如JohnsChoices,仅包括他们的选择,而不是他们的名字。

这些是单独的下拉列表。使它们大小相同,以便以后添加。

然后创建一个4行高,2列宽的查找表: 约翰| JohnsChoices 卡尔| KarlsChoices 丽娜| LinasChoices 玛丽| MarysChoices

然后将此4x2表命名为ChoiceLookup。

然后,为要选择名称的单元命名,例如名称。

在同一个单元格中,只为名称创建一个下拉列表验证列表,即使用刚刚创建的表格的左栏。

最后,在Name单元格旁边,创建一个下拉列表验证列表,其范围为put:= INDIRECT(VLOOKUP(Name,ChoiceLookup,2,FALSE))

这将标识首先选择的名称,然后查找要用于数据验证下拉列表的选项列表。按照惯例,INDIRECT将文本字符串解释为范围。

如果你有耐心,你可以嵌套最多20个 - 但实质上它们是级联选择,在你到达它们之前更新后续选项。我经常使用它,它非常有用,避免弄乱MATCH,INDEX,OFFSET等等。

BTW:几乎所有需要范围的对话框都可以用公式填充,只要它解析成一个范围,因此是间接的。