Excel中的多个依赖下拉列表
所以我一直在研究这个问题一段时间,到现在还没有提出任何有效的解决scheme。 我正在尝试创build三个下拉列表。 一个为“ Dristrict ”,“ Block ”和“ Village ”。
这就是类别之间的相互关系:
- 有很多地区。
- 每个地区内有多个街区。
- 每个街区内有多个村庄。
这就是我目前的数据结构,我也乐于接受不同结构的build议。 目前,您可以看到每个地区,街区和村庄都有自己的合并(或单个)单元。 所有的村庄都会占用一个小区。
下面是我考虑的另一个结构。 也许它会帮助,也许它不会? 如果我使用VBAmacros,它会帮助我,但是这些macros在下拉列表中似乎不起作用。
所以这是我的思考过程,我无法转换成在下拉列表数据validation工作的Excel公式代码。
- 获取所有地区的列表。 (完成!) – 我只是创build一个单独的列表,并创build一个下拉列表。
- 获取所有单元格的范围(因为下拉列表需要以逗号分隔的列表或范围),当前单元格左侧的单元格与区域下拉列表中选定的单元格相同。
- 对村庄和街区名称重复步骤2。
我相信我可以通过使用INDIRECT()
函数创builddistricts + blocks
的命名列表数目来实现这一点。 但我不确定这是否是最好的方法。
所有解决scheme欢迎 应该在Excel 2003及更高版本中工作。 谢谢!
更新: 我想每行一个下拉列表(区,块,村)它是一个大数据inputexcel表我正在做。
谢谢!
编辑:其districts+blocks
不districts*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到单元格J2
, K2
, L2
:使用上面显示的公式应用List
validation。
下拉菜单现在将取决于以前的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的“孩子”
这意味着:
- 源数据应该类似于你的结构,所以没什么好解释的
- 区
- 单元格D3 =
1
(这是起始ID)
D4中的公式和以下内容:= IF(AND(A4 <> A3,A4 <> “”),D3 + 1,D3)
这将增加在列A中find的新的非空白项目的数量
公式M5=MAX(D:D)
(这是地区的计数)。
将公式复制到其他元素的N5和M5 - 在列G中准备连续ID的列表(我在G4中简单地使用
=G3+1
)
用这个公式填充列H:= IF($ G3 <= M $ 5 INDEX(A:A,MATCH($ G3,d:d,0)), “”)
(公式实际上适用于所有三列,所以只需直接填写HJ列)
- 插入新名称( 公式 – > 名称pipe理器 – > 插入 )。 将其命名为“区域”并提供以下公式:
=OFFSET($H$2,1,0,$M$5,1)
。 这将创buildCountOfDistricts(= M5)x 1的大小范围,从H2下面的1行开始 – 即在本例中它将引用H3:H5。
将数据validation应用于单元格M10,使用公式=Districts
作为列表的来源。
select一个地区进行testing - 单元格M6:
=MATCH(M10,Districts,0)
- 单元格D3 =
- 块:
- 单元格E3 =
1
E4和以下内容:= IF(D4 = $ M $ 6中,IF(AND(B4 <> B3,B4 <> “”),E3 + 1,E3),E3)
- 已经在上面的第2步中完成了
- 名称
Blocks
:=OFFSET($I$J,1,0,$N$5,1)
,select一个块 - G4:
=MATCH(M11,Blocks,0)
- 单元格E3 =
- 村:
- 单元格F3 =
1
F4和以下内容:= IF(AND(D4 = $ M $ 6中,E4 = $ N $ 6),IF(AND(C4 <> C3,C4 <> “”),F3 + 1,F3),F3)
- 已经在上面的第2步中完成了
- 名
Village
:=OFFSET($J$2,1,0,$O$5,1)
- G4:
=MATCH(M12,Villages,0)
- 单元格F3 =
完成! 🙂