一、背景
需要在excel表里面搞一个动态的三级级联下拉菜单,但是通过 INDRECT函数对这个表后面要调整的话改动很大,这里找了一个通过公式来生成,参考 https://bbs.wps.cn/topic/28390
二、处理数据源
三级菜单的数据源需要每级内容依次排序,相同菜单的内容需要在一个连续的区域,如果菜单内容固定且一、二级已排序,可以省略此步骤,如果菜单内容需要动态添加修改并且顺序不固定,需要使用公式对菜单数据源排序,如下图所示。
=SORT(DROP(TAKE(A:C,COUNTA(A:A)),1),{1,2})
1、使用COUNTA函数获取A列数量。
2、使用TAKE函数,第1个参数引用A:C列,第2个参数根据COUNTA函数返回的数量截取前N行。
3、使用DROP函数将第1行标题行删除。
4、使用SORT函数依次对第1、第2列排序。
三、设置一级菜单
选中在设置一级菜单的单元格区域,I2:I24单元格区域,依次点击【数据】-【下拉列表】-【从单元格选择下拉列表】后输入公式。
2.1、如果第一步省略,可直接引用从A2开始到一个相对较大的单元格区域,如A2:A9999
=A2:A9999
2.2、如果第一步使用了公式,输入以下公式。
=TAKE($E$2#,,1)
三、设置二级菜单
选中在设置一级菜单的单元格区域,J2:J24单元格区域,依次点击【数据】-【下拉列表】-【从单元格选择下拉列表】后输入公式。
3.1、如果第一步省略,输入以下公式
=OFFSET($B$1,MATCH(I2,$A:$A,0)-1,,COUNTIFS($A:$A,I2))
3.2、如果第一步使用了公式,输入以下公式。
=OFFSET($F$1,MATCH(I2,$E:$E,0)-1,,COUNTIFS($E:$E,I2))
四、设置三级菜单
选中在设置一级菜单的单元格区域,K2:K24单元格区域,依次点击【数据】-【下拉列表】-【从单元格选择下拉列表】后输入公式。
需要注意的是,因BYROW函数涉及循环计算,所以不要引用整列,根据实际数据,设置一个相对较大的单元格区域即可。
4.1、如果第一步处理数据源没有使用公式
=OFFSET($C$1,MATCH(I2&J2,BYROW($A$1:$B$9999,CONCAT),0)-1,,COUNTIFS($A:$A,I2,$B:$B,J2))
4.2、如果第一步使用了公式,输入以下公式。
=OFFSET($G$1,MATCH(I2&J2,BYROW($E$1:$F$9999,CONCAT),0)-1,,COUNTIFS($E:$E,I2,$F:$F,J2))
三级菜单和二级菜单原理相同,只是在计算偏移量和数量的时候,从计算一级菜单一个条件变成需要计算一级、二级菜单两个条件。
需要注意的是,在下拉列表设置公式时,是不支持数组公式的,下面的公式是不支持的。
=OFFSET($G$1,MATCH(I2&J2,$E$1:$E$9999&$F$1:$F$9999,0)-1,,COUNTIFS($E:$E,I2,$F:$F,J2))
所以本示例使用BYROW函数将一级、二级菜单数据源两列拼接成一列后查找位置。
五、扩展内容
如果使用SORT对一、二级菜单数据源排序后,制作好的下拉菜单顺序不理想,可以通过修改第一步的公式来自定义排序后的顺序。
添加两列辅助列,依次设置一级、二级自定义顺序,然后修改第一步的公式,如下图所示。
=LET(x,SORT(DROP(TAKE(A:C,COUNTA(A:A)),1),{1,2}),SORTBY(x,MATCH(CHOOSECOLS(x,1),M:M,0),1,MATCH(CHOOSECOLS(x,2),N:N,0),1))
设置后的下拉菜单效果:
此情况只针对多项菜单中的少量几个选项排序,并且二级菜单内容不重复的前提下,如果需要全部自定义,或多级菜单的子项有重复的情况,此方法不使用,建议省略第一步的排序转换,直接手工处理菜单数据源顺序。
六、其他说明
在修改菜单数据源时,建议使用【清除内容】功能,如果使用删除或插入行列,需要在公式中使用INDIRECT函数,否则可能会导致下拉菜单中的公式出错,无法使用。
如将公式
=OFFSET($F$1,MATCH(I2,$B:$B,0)-1,,COUNTIFS($A:$A,I2))
修改为
=OFFSET(INDIRECT("F1"),MATCH(I2,INDIRECT("B:B"),0)-1,,COUNTIFS(INDIRECT("A:A"),I2))
需要注意的是,设置下拉菜单区域引用的一级、二级的单元格区域不要修改,如一级单元格的I2单元格,不要修改