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

标签 excel validation dynamic

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

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

我有一个 child 名单:John、Karen、Lional、Mike 等。

然后,我有一个简单的表格,列出了每个 child 喜欢的食物:在约翰的栏下,有一个“x”表示苹果、香蕉和鱼,而其他的则为空白。

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

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

Name  Food
A2    B2

单元格 A2 将包含数据验证,提供包含所有 child 姓名(J、K、L、M)的单元格内下拉列表(这很简单 - 我可以做到这一点!)

单元格 B2 需要包含动态生成的所选 child 喜欢的食物列表。因此,如果我在 A2 中选择 John,则 B2 列表将为 {a, b, f}。如果我选择 Lionel,B2 列表将为 {a, b, c, e}。显然,随着我 child 的品味发生变化,我只需通过添加/删除“x”来更新我的“喜欢”表,B2 中的下拉菜单就会自动更新。

如何为单元格 B2 创建下拉验证列表? (我希望在不使用 VBA 的情况下完成此操作)

最佳答案

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

第 1 步:为每个 child 创建一个选择列表

为每个 child 创建一个列表,列出他们的所有偏好(在列表末尾我添加了“-”作为占位符)。在 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)))

还将 child 的名字放在数据列上方 (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));"-"))

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

<小时/>

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

关于Excel:如何根据数据表创建动态数据验证列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19730067/

相关文章:

Airflow DAG 中跳过动态任务

dynamic - 你如何实现 C#4 的 IDynamicObject 接口(interface)?

excel - ObjWorkbook.Worksheets.Count 不起作用

asp.net - 如何在文本框上使用 RegularExpressionValidator

spring - Spring 中的条件验证

linux - 通过文件扩展名验证脚本的参数?

c# - 动态方法创建

excel - 将 xls 读取为数据库时确定 Excel 文件的第一个工作表名称

excel - 是否有类似于 vba 中的 toString() 函数的实现函数?

vba - 为什么我不能使用单个 "Cells"引用作为 "Range"参数