Excel中的多个依赖下拉列表

所以我一直在研究这个问题一段时间,到现在还没有提出任何有效的解决scheme。 我正在尝试创build三个下拉列表。 一个为“ Dristrict ”,“ Block ”和“ Village ”。

这就是类别之间的相互关系:

  1. 有很多地区。
  2. 每个地区内有多个街区。
  3. 每个街区内有多个村庄。

这就是我目前的数据结构,我也乐于接受不同结构的build议。 目前,您可以看到每个地区,街区和村庄都有自己的合并(或单个)单元。 所有的村庄都会占用一个小区。

我的数据是如何构建的

下面是我考虑的另一个结构。 也许它会帮助,也许它不会? 如果我使用VBAmacros,它会帮助我,但是这些macros在下拉列表中似乎不起作用。

替代结构

所以这是我的思考过程,我无法转换成在下拉列表数据validation工作的Excel公式代码。

  1. 获取所有地区的列表。 (完成!) – 我只是创build一个单独的列表,并创build一个下拉列表。
  2. 获取所有单元格的范围(因为下拉列表需要以逗号分隔的列表或范围),当前单元格左侧的单元格与区域下拉列表中选定的单元格相同。
  3. 对村庄和街区名称重复步骤2。

我相信我可以通过使用INDIRECT()函数创builddistricts + blocks的命名列表数目来实现这一点。 但我不确定这是否是最好的方法。

所有解决scheme欢迎 应该在Excel 2003及更高版本中工作。 谢谢!

更新: 我想每行一个下拉列表(区,块,村)它是一个大数据inputexcel表我正在做。

谢谢!

编辑:其districts+blocksdistricts*blocks (感谢上帝)

鉴于这个问题中途改变了,这是另一个答案,build立在我的第一个问题上。

看看这个文件 。 它基于上述解决scheme,但具有一个以“CurrentRow”名称提供当前行号的微型macros。 我使用这个名字来检索当前行的分区/块,并基于此构build下拉列表。

我几乎可以通过在名称“CurrentRow”中提供公式=ROW(INDIRECT(CELL("address")))而无需使用macros,但是之后您需要手动按F9 (以更新计算)点击下拉菜单…

另一个版本使用Dynamic Named Ranges

像这样设置您的validation列表

在这里输入图像说明

添加命名范围如下

 Name Range DistrictList =Sheet4!$A:$A BlockList =Sheet4!$C:$C VillageList =Sheet4!$G:$G SelectedDistrict =Sheet4!$J$2 SelectedBlock =Sheet4!$K$2 SelectedVillage =Sheet4!$L$2 rDistrict =OFFSET(DistrictList,1,0,COUNTA(DistrictList)-1,1) rBlock =OFFSET(OFFSET(BlockList,0,1,1,1),MATCH(SelectedDistrict,BlockList,0)-1,0,COUNTIF(BlockList,SelectedDistrict)) rVillage =OFFSET(OFFSET(VillageList,0,1,1,1),MATCH(SelectedBlock,VillageList,0)-1,0,COUNTIF(VillageList,SelectedBlock)) 

有效数据input到单元格J2K2L2 :使用上面显示的公式应用Listvalidation。
下拉菜单现在将取决于以前的select。
请注意,数据input单元不必与validation列表位于同一张纸上

您需要使用命名区域进行数据validation。 以下是演示该方法的示例文件: https : //www.dropbox.com/s/4fy9b34txglmy4r/LinkedDropdowns.xlsx

命名的区域可以通过Formulas > Name Manager来设置。

您可以使用dynamic命名范围和一些高级公式逻辑来解决此问题。 这很难解释,这里是示例文件 。 您只需要将数据插入到AC列中,然后将公式以DJ列的forms复制到数据结束位置即可! 🙂

这是我的解释: 在这里输入图像描述

这个想法如下:
步骤1:对于每一组元素,您都有一个计数器(= ID),只有在属于所选的父母(s)并且是唯一的
步骤2:使用此ID的INDEX / MATCH来检索名称
步骤3:使用OFFSET和COUNT创build一个dynamic命名范围,为下拉菜单创build范围步骤4:将所选选项转换回带有MATCHfunction的ID,并将其作为步骤2的“孩子”

这意味着:

  • 源数据应该类似于你的结构,所以没什么好解释的
    1. 单元格D3 = 1 (这是起始ID)
      D4中的公式和以下内容:
        = IF(AND(A4 <> A3,A4 <> “”),D3 + 1,D3) 

      这将增加在列A中find的新的非空白项目的数量
      公式M5 =MAX(D:D) (这是地区的计数)。
      将公式复制到其他元素的N5和M5

    2. 在列G中准备连续ID的列表(我在G4中简单地使用=G3+1
      用这个公式填充列H:
        = IF($ G3 <= M $ 5 INDEX(A:A,MATCH($ G3,d:d,0)), “”) 

      (公式实际上适用于所有三列,所以只需直接填写HJ列)

    3. 插入新名称( 公式 – > 名称pipe理器 – > 插入 )。 将其命名为“区域”并提供以下公式: =OFFSET($H$2,1,0,$M$5,1) 。 这将创buildCountOfDistricts(= M5)x 1的大小范围,从H2下面的1行开始 – 即在本例中它将引用H3:H5。
      将数据validation应用于单元格M10,使用公式=Districts作为列表的来源。
      select一个地区进行testing
    4. 单元格M6: =MATCH(M10,Districts,0)
  • 块:
    1. 单元格E3 = 1
      E4和以下内容:
        = IF(D4 = $ M $ 6中,IF(AND(B4 <> B3,B4 <> “”),E3 + 1,E3),E3) 
    2. 已经在上面的第2步中完成了
    3. 名称Blocks=OFFSET($I$J,1,0,$N$5,1) ,select一个块
    4. G4: =MATCH(M11,Blocks,0)
  • 村:
    1. 单元格F3 = 1
      F4和以下内容:
        = IF(AND(D4 = $ M $ 6中,E4 = $ N $ 6),IF(AND(C4 <> C3,C4 <> “”),F3 + 1,F3),F3) 
    2. 已经在上面的第2步中完成了
    3. Village=OFFSET($J$2,1,0,$O$5,1)
    4. G4: =MATCH(M12,Villages,0)

完成! 🙂