生成过滤的动态下拉列表

时间:2013-12-31 01:05:51

标签: excel dynamic excel-2007 validation named-ranges

我需要两个动态下拉列表来进行数据验证。一个包含可供选择的唯一大陆列表,然后是第二个列表,它是基于所选大陆的动态生成的国家子集。数据没有任何特定顺序:

     A          B
---+--------------------
1  | Continent  Country
2  | Africa     Algeria
3  | Asia       China
4  | Africa     Ethiopia
5  | Europe     France
6  | Europe     Germany
7  | Asia       India
8  | Europe     Italy
9  | Asia       Japan
10 | Europe     Poland
11 | Africa     South Africa
12 | Europe     Spain

我已成功创建了第一个下拉列表,方法是使用隐藏列生成唯一的大陆列表,然后将它们关联为命名范围。然而,那部分已经完成了

如何根据第一个列表中选择的Continent关联创建第二个动态生成的过滤列表(最好在列表中没有任何空白)?

我正在消化的实际数据是数千个数据点,所以性能是一个问题,如果可能的话我宁愿不使用VBA。

修改:通过更多搜索,我找到了helpful的链接,它为我提供了以下公式:     IFERROR(INDEX($ A $ 2:$ A $ 100中,SMALL(IF($ B $ 2:$ B $ 100 = “是”,ROW($ A $ 2:$ A $ 100)-ROW($ A $ 2)+1),ROWS ($ A $ 2:$ A2))), “”)

它更接近,但它不起作用,因为我需要将这些放在我的工作表中的单独列中,我需要动态下拉列表的每一行,而且我不确定过滤列表的大小是。

有没有办法直接在命名范围内执行此操作?

4 个答案:

答案 0 :(得分:2)

如果您准备应用一系列命名范围(在示例中,B:G的占用部分),则允许:列表和来源:=INDIRECT(INDEX($1:$1,MATCH(I2,A$1:A$7,0)))的数据验证可能适合J列中的条目:

SO20850122 example

尝试澄清:

通常从内向外更容易理解公式,所以从=MATCH开始:这看起来在A1:A7列表中找到确切(即,0)值的位置进入I2。对于S.AMERICA - 不错的选择! :-) - 碰巧是最后一次(第7次)。然后将此结果作为参数提供给=INDEX部分,以确定哪个列号是相关的(对于按国家/地区的验证)。对于Excel ColumnG是第七个。

由于没有使用具有多个行/列的数组,我对公式并不完全是传统的 - 部分为了约定,Validation和Lookup列表通常垂直排列而不是水平排列(例如VLOOKUP)应用程序比HLOOKUP更频繁,部分原因是因为我们更习惯于查看列的标签而不是行的标签等。 - 实际上是因为电子表格通常允许比它们更宽(例如16,384列)但是1,048,576行),部分是为了我答案中的图像宽高比。

替代布局虽然在实践中可能稍微不方便(例如,用于设置命名范围)但可能有助于我尝试解释:

左下图:将国家/地区数据转换为vlookup的更常规布局(也可以删除Continents行),验证公式为:

=INDIRECT(INDEX(A$1:A$6,MATCH(A8,A$1:A$6,0)))  

(我必须移动'触发单元'I2等,因为其他数据现在需要该单元格 - 我选择了A8等。)

右下图:离开左侧图像的“触发单元格”并取消Continents,验证公式为:

=INDIRECT(INDEX(C$1:H$1,MATCH(A8,C$1:H$1,0)))

SO20850122 second example

答案 1 :(得分:2)

如果按大陆升序排序列表,那么您可以构建一个没有任何辅助单元格的动态范围名称,其公式为

=INDEX(Sheet1!$B:$B,MATCH(Sheet1!$E$2,Sheet1!$A:$A,0)):INDEX(Sheet1!$B:$B,MATCH(Sheet1!$E$2,Sheet1!$A:$A,1))

其中,单元格E2具有所选的大陆。这是一个相同场景的屏幕截图。将类别替换为Continent并将SubCategory替换为Country。

enter image description here

答案 2 :(得分:0)

确定。然后从创建动态第二个列表开始,您可以通过一些额外的字段和列轻松实现:

E1 中,我从选定的大陆开始。这必须参考第一个下拉列表或E1可以在以下公式中替换。

C2 中,您可以使用公式=IF(A2=$E$1;MAX($C$1:C1)+1;"")启动帮助列,然后将其拖到国家/地区列表的末尾。

如果您将=MAX(C:C)放在 E2 中以保留此大陆的国家/地区数量,则不是必须但更容易理解。

D8 开始写下一些数字(1,2,...),直到D50,然后我在 E8 中写=IF(D6<=$E$2;INDEX(B:B;MATCH(D6;C:C;0));"")并拖动它降至E50。

最后看起来对我来说是这样的,其中F8到F50的范围被命名为“countryDropdown”,它可以在数据验证中与=INDIRECT("countryDropdown")一起使用。

     A          B              C     D          E
---+------------------------------------------------------------
1  | Continent  Country              Selected   Africa    
2  | Africa     Algeria        1     Max Number 3
3  | Asia       China         
4  | Africa     Ethiopia       2     
5  | Europe     France               
6  | Europe     Germany              
7  | Asia       India                
8  | Europe     Italy                1          Algeria
9  | Asia       Japan                2          Ethiopia
10 | Europe     Poland               3          South Africa
11 | Africa     South Africa   3     4
12 | Europe     Spain                5

答案 3 :(得分:0)

请检查我的方法:

  1. 无需对数据进行排序
  2. 支持多对多关系
  3. 没有VBA
  4. 没有命名范围
  5. 不需要事先知道独特的物品名称或金额
  6. 在新标签中打开图像以便更好地看待:

    在Sheet1(数据表)中: enter image description here
    作为公式: enter image description here

    在Sheet2(帮助表)中: enter image description here
    作为公式:
    enter image description here

    在Sheet3(结果表)中: enter image description here