admin
发布于 2024-11-07 / 30 阅读
0
0

Excel通过公式建立多级级联下拉菜单

一、背景

需要在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单元格,不要修改


评论