【发布时间】:2018-09-22 14:59:54
【问题描述】:
大家好。
我有一系列命名范围,A_Colours、B_Colours 等。
这些代表颜色列表中已排序列的部分,按制造这些颜色的制造商的代码排序。这些是动态命名范围,由COUNTA 构造,用于表示有多少种颜色具有该 mfr 代码。根据我的计算,列表应该是连续的,因为该列是按代码排序的。
我知道我可以通过简单地将=A_Colours 设置为列表源(不带引号)来引用数据验证中的范围。在这种情况下,这确实有效。
但是,我有一个下拉列表来控制我想在子下拉列表中显示哪个 A-M 范围。 所以,例如A1 中的下拉菜单显示 A、B、C、D 作为选项。 B1 中的下拉菜单显示与 A1 中所选选项相关的下拉选项。
示例:
我从 A1 的列表中选择 A。
在单元格 B1 中,我希望我的下拉列表显示命名范围 A_Colours 中的所有值。
我尝试了各种方法将文本字符串 A_Colours 传递到 DV 列表源字段,但都失败了。公式中的错误,或者范围评估为错误,或者它允许我从下拉列表中仅选择 A_Colours。
示例 1: A1选A B1 DV盒:
=INDIRECT("$A$1")&"_Colours"
这会产生错误“列表源必须是分隔列表,或者是对单行或单列的引用。”
这可能是因为表格列表已排序吗?我不这么认为,因为上面的第一个例子有效。
示例 2: 在 C1 中使用辅助单元格创建文本字符串“A_Colours”,通过公式: =$A$1&"_Colours"
然后在单元格 B1 的 DV 框中:
=INDIRECT("$C$1")
请帮助我实现这一目标! 谢谢。
[编辑] 解决方案:
按照以下指示创建新工作表。 为每个制造商创建标题(单元格 A1 中的“A”)。 将公式输入A2(作为数组公式,Ctrl+Shift+Enter):
=INDEX(颜色, SMALL(IF((INDEX(颜色, , 1)=INDEX(MFR,MATCH(A$1,MFR[MFRName],0),2)), MATCH(ROW(颜色), ROW (颜色))、"")、行($B$1:B1))、列($A$1:$B1))
我稍微调整了一下,但这要归功于https://www.get-digital-help.com/2009/09/28/extract-all-rows-from-a-range-that-meet-criteria-in-one-column-in-excel/
将公式向下应用到最后加上一些以允许扩展。 将公式应用到最后一个标题。
现在您的列表肯定是连续的、单列且不是动态的,因此符合数据验证的严格标准。
为每个列表创建一个命名范围,使用确切的名称使其简单,但我选择在末尾添加“名称”,例如Mfr1颜色。
在 DV 源列表字段中引用它们(对于我们原始工作表中的单元格 B2),例如: =INDIRECT($B$2&"颜色")
这是做什么的: 在颜色表中查找: MFR 代码颜色代码
在制造商表“MFR”的原始工作表(“A”)的单元格 A1 中查找 MFR 代码的第一个匹配实例,该表具有以下列: MFR名称代码
通过 MATCH(ROW(Colours,Row(Colours),"") 拉出行。
通过最后的 ROWS 和 COLUMNS 检查您想要的行和列。
【问题讨论】:
标签: excel validation dynamic range formula