5

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

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

我有一份孩子名单:约翰、凯伦、莱昂纳尔、迈克等。

然后,我有一个简单的表格,列出了每个孩子喜欢的食物:在 John 的列下,苹果、香蕉和鱼会有一个“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)的单元格内下拉列表(这很容易 - 我可以做到这一点!)

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

如何为单元格 B2 创建下拉验证列表?(我宁愿在不诉诸VBA的情况下这样做)

4

4 回答 4

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 更适合数据验证列表。

于 2013-11-01T18:05:52.513 回答
1

第一次发帖提醒!!

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

它基于三个步骤。

第 1 步:它使用一系列 5 个表格将 x 的食物/孩子喜欢的表格打成更有用的表格,列出每个孩子的第 1、2、3 等喜欢,然后为任何“未使用”之类的职位。第五个表包含数据验证信息 - 它只是从该表中选择正确的列和正确的行数的问题。

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

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

我已经根据 Lina 的方法审查了解决方案,发现它们并没有什么不同。在这两种解决方案中,步骤 1 实现了相同的目标(除了 Lina 使用“-”字符代替我的 #N/A 来表示未使用的选项)。然后,两者都从步骤 1 的结果中挑选出相关位,并将其应用于数据验证规则。它们之间的区别在于方法:一个冗长和嵌套的公式(如此紧凑但需要努力理解)与更广泛地使用工作表来记录另一个过程中的详细步骤(不太紧凑但需要更少的努力来理解)。

于 2013-11-01T18:30:22.303 回答
0

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

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

接下来,您需要插入一个组合框(Active X 控件)。右键单击该框并选择“属性”。在“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 范围中选择第一行。 在此处输入图像描述 在此处输入图像描述

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

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

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

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

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

于 2013-11-01T17:39:44.973 回答
0

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

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

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

在每一个下面,在 B1:D6 中输入他们喜欢的食物,每个单元格一个。您可以按照上面的示例留下空白,或者将它们全部向上推,这样一些孩子的列表就会更短。

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

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

然后创建一个 4 行高 2 列宽的查找表:John|JohnsChoices Karl|KarlsChoices Lina|LinasChoices Mary|MarysChoices

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

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

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

最后,在名称单元格旁边,创建一个下拉验证列表并在范围内放置:=INDIRECT(VLOOKUP(Name,ChoiceLookup,2,FALSE))

这将识别首先选择的名称,然后查找用于数据验证下拉列表的选择列表。像往常一样,INDIRECT 将文本字符串解释为一个范围。

您最多可以嵌套其中的 20 个 - 如果您有耐心的话,但本质上它们是级联的选择,甚至会在您找到它们之前更新后续选项。我经常使用它,它非常有用,并且避免弄乱 MATCH、INDEX、OFFSET 等

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

于 2015-12-13T06:24:30.303 回答