Jim*_*ite 5 validation excel dynamic
想象一下,我正在为我的孩子在Excel中编写一个菜单规划器(比我的实际问题更容易描述)......
我有一份可用的食物清单:苹果,香蕉,胡萝卜,红枣,鸡蛋,鱼等.
我有一份孩子名单:John,Karen,Lional,Mike等.
然后,我有一个简单的表格,列出了每个孩子喜欢的食物:在John的专栏下,对苹果,香蕉和鱼有一个'x',但对其他人则是空白.
J K L M
---------------
a x x x
b x x
c x x x
d x
e x x
f x
Run Code Online (Sandbox Code Playgroud)
现在,在我的菜单规划器的主要部分中,我想要一些带有数据验证的单元格,允许我为每个孩子选择食物,使用上面的"赞"表:
Name Food
A2 B2
Run Code Online (Sandbox Code Playgroud)
单元格A2将包含数据验证,其中包含所有孩子名称(J,K,L,M)的单元格下拉(这很容易 - 我可以做到这一点!)
单元格B2需要包含动态生成的所选孩子喜欢的食物列表.所以,如果我在A2中选择John,那么B2列表将是{a,b,f}.如果我选择莱昂内尔,B2列表将是{a,b,c,e}.很明显,随着我孩子的口味改变,我可以通过添加/删除'x'来更新我的'喜欢'表,B2中的下拉菜单会自动更新.
如何为单元格B2创建下拉列表验证列表?(我更愿意这样做而不诉诸VBA)
我假设您的数据表位于 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)))
Run Code Online (Sandbox Code Playgroud)
还将孩子的名字放在数据列上方 (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));"-"))
Run Code Online (Sandbox Code Playgroud)
此公式既排除列表中的所有空选项(“-”),又根据孩子的姓名给出正确的列表。
更新。使用 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);"-"))
Run Code Online (Sandbox Code Playgroud)
至于第二步,似乎仅当您选择单元格时才会重新计算数据验证公式,因此 OFFSET 在数据验证列表中不会有波动。由于 INDEX 无法返回范围,并且 Excel 不允许使用 INDEX(..):INDEX(..) 范围进行数据验证,因此 OFFSET 更适合数据验证列表。
| 归档时间: |
|
| 查看次数: |
40420 次 |
| 最近记录: |