Excel:如何基于数据表创builddynamic数据validation列表

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

我有一个可用的食物列表:苹果,香蕉,胡萝卜,date,鸡蛋,鱼等

我有一个孩子的名单:约翰,凯伦,Lional,麦克等

然后,我有一个简单的表格,列出每个孩子喜欢的食物:在约翰的专栏里,会有一个对苹果,香蕉和鱼类的“X”,但是对其他人是空的。

JKLM --------------- axxx bxx cxxx dx exx fx 

现在,在我的菜单计划的主要部分,我想要有一些数据validation的单元格,允许我使用上面的“喜欢”表为每个孩子select食物:

 Name Food A2 B2 

单元格A2将包含数据validation,使单元格下拉列表中包含所有孩子的名字(J,K,L,M)(这很容易 – 我可以做那个!)

单元格B2需要包含一个dynamic生成的所选小孩喜欢的食物列表。 所以,如果我在A2中selectJohn,那么B2列表就是{a,b,f}。 如果我select莱昂内尔,B2列表将是{a,b,c,e}。 显然,随着孩子口味的变化,我可以通过添加/删除“x”来更新我的'喜欢'表,并且B2中的下拉菜单将自动更新。

如何创build单元格B2的下拉validation列表? (我宁愿这样做,而不诉诸VBA请)

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

第1步。为每个孩子创build一个选项列表

为每个孩子创build一个列表,列出他们的所有喜好(在列表的末尾添加“ – ”作为占位符)。 在G2中input该公式并拖动到范围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步。创build条件数据validation

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

 =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));"-")) 

这个公式既排除列表中的所有空选项(“ – ”),并根据孩子的名字给出正确的列表。


UPDATE。 INDEX / MATCH的替代解决scheme

OFFSET是一个易变的公式(即,Excel会在工作簿中有任何更改时重新计算),所以您可能需要使用INDEX来执行此操作。 以下是我上面第一步的公式:

 =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);"-")) 

至于第二步,似乎数据validation公式只有在select单元格时才会被重新计算,所以OFFSET在数据validation列表中没有波动性。 由于INDEX无法返回范围,Excel不允许使用INDEX(..):INDEX(..)范围进行数据validation,所以OFFSET更适合数据validation列表。

首先发布提醒!

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

它基于三个步骤。

步骤1:使用一系列5张桌子将食物/小孩的x的表格打成更有用的表格,列出每个小孩,他们的第一,第二,第三等喜欢,其次是#N / A的任何“未使用“的位置。 第五个表包含数据validation信息 – 它只是从这个表中select正确的列和正确的行数的问题。

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

步骤3:一个名为ValidFood的命名范围是dynamic定义的,并使用= OFFSET()函数从第五个表中挑选出正确的列和行。 这是聪明的一点 – 你可以在名称pipe理器中使用函数,这就是在这里完成的。 单元格B2的数据validation规则只是引用这个命名范围。 或者,可以使用“自定义”选项直接在数据validation规则中使用= OFFSET()公式

我已经回顾了Lina的解决scheme,发现他们没有什么不同。 在这两种解决scheme中,第1步的实现都是一样的(除了Lina使用“ – ”字符代替我的#N / A作为未使用的选项)。 然后挑出步骤1结果的相关位并将其应用于数据validation规则。 它们之间的区别在于:在一个(很紧凑但需要努力去理解)中的冗长和嵌套的公式与对工作表的更广泛的使用来logging在另一个中的详细步骤(较不紧凑但需要较less的努力来理解)。

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

对于每个列表,您都需要创build一个命名范围。 因此,为“名”做一个,然后为每个人最喜欢的食物一个。 例如:AJ_Likes,RJ_Likes。

接下来,您需要插入一个combobox(Active X控件)。 右键单击该框并select属性。 在“ListFillRange”下,input“name”范围。 这将填写您的第一个箱子与您的家庭成员的名字。 然后你想链接到一个单元格的列表,所以每个select将填充该单元格的值。 您可以将下拉列表直接放置在链接的单元格上,这样它就不会出现(为了美观)。

“LinkedCell”也在combobox的属性框中。 然后,你想创build第二个combobox。 这个盒子将会有一个fillrange =你将要创build的一个新的dynamic范围。 dynamic范围将根据第一个盒子的select而改变。

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

它基本上说,如果F3 = AJ,从AJ_Likes范围select第一行,否则,如果是= RJ,请从RJ_Likes范围中select第一行。 在这里输入图像描述在这里输入图像描述

我似乎无法让我的图像出现,所以这里有一些链接到我创build的屏幕截图。 希望这有助于 – 很高兴提供额外的帮助。

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

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

对不起 – 注意你特别要求数据validation。 与上面的步骤相同,但是不添加第二个combobox,只需添加数据validation,LIST作为选项,然后selectdynamic列表作为您的范围。

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

如果您准备重新排列初始表格,则可以更轻松地创build有条件的单元格内下拉validation列表,如下所示:

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

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

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

然后为每个孩子的select创build一个命名范围 – 例如JohnsChoices,只包括他们的select,而不是他们的名字。

这些是单独的下拉列表。 让他们都相同的大小,以允许稍后添加。

然后创build一个查找表,这是4行高,2列宽:约翰|约翰select卡尔|卡尔斯select莉娜| LinasChoices玛丽| MarysChoices

然后命名这个4×2表ChoiceLookup。

然后,命名您要select名称的单元格,例如名称。

在同一个单元格中,为名称创build下拉validation列表,即使用刚创build的表格的左列。

最后,在Name单元旁边,创build一个下拉validation列表,并在范围内input:= INDIRECT(VLOOKUP(Name,ChoiceLookup,2,FALSE))

这将识别首先select的名称,然后查找哪个select列表用于数据validation下拉列表。 按照惯例,INDIRECT将文本string解释为一个范围。

如果你有足够的耐心,你可以嵌套其中的20个,但实质上它们是级联的select,在你接触到它们之前更新后续选项。 我经常使用它,这是非常有用的,并避免与MATCH,INDEX,OFFSET等混乱

顺便说一句:几乎任何需要范围的对话框都可以用公式填充,只要它parsing为一个范围,因此是间接的。