Excel任意多级联动菜单不再是个难题!

关于在Excel中实现下拉菜单,一级我们可以直接使用下拉列表功能,二级可以配合INDIRECT函数实现,都比较简单,如果这个你也不会,记得看文末推荐。
但是三级及以上菜单,对大部分同学来说都是一个无解的难题,虽然网上有很多3级菜单教程,但是数据源的配置非常的繁琐,直接劝退各种小白!所以小编最近一直在思考是否可以写一个通用的,任意多级菜单呢?
花了一些时间,终究还是实现了,而且总体来说特别简单!
我们先看一下效果(案例演示4级)
(案例素材来源:ExcelHome论坛)
下面我们来看看对应的处理代码:
下面来说说思路实现
1、思路其实非常简单,我们就是把多级内容,逐级写入,举例,比如A1>B1>C1>D1,四级。
>> 一二级处理:我们把A1作为字典的key,把B1作为item,如果后续还有我们就判断是否已存在,存在不管,不存在我们就拼接到item上,逗号分隔,方便我们作为下来列表的项
>> 3级以上菜单,思路一直,就是把前面级别的内容使用间隔符拼接起来作为key,下一级的内容作为item!
>> 在我们选择的时候,我们只需要判断当前单元格左侧的全部内容拼接起来作为key,去字典找查找,对应的item就是本次的菜单内容
我难道代码该如何使用?
> 如果使用别人写好的代码:番外篇-EXCEL如何使用宏(VBA)
> 粘贴到对应的工作表后,我们可以配置的地方有两个:
>> 一个是数据源的名称  Sheets("基础")  这里的基础修改为自己的数据表名称
>> Const col As Long = 4,这里的4就是配置几级的目前是4级,根据需要改写,目前不适用1级(没必要)
可以复制使用的源码:
Public d As Object
'功能:选择改变事件,实时动态建立多级菜单'公众号:Excel办公实战'日期:20210611'----------------------------------Private Sub Worksheet_SelectionChange(ByVal Target As Range) totalcol = getData If Target.CountLarge > 1 Then End Target.Offset(, 1).Resize(1, 10).Clear sc = Target.Column If sc > totalcol Then End If sc = 1 Then s = Filter(d.Keys, ">2", False) With Target.Validation .Delete .Add 3, 1, 1, Replace(Join(s, ","), ">1", "") End With Else skey = "" For n = sc - 1 To 1 Step -1 skey = skey & Target.Offset(, -n) & ">" & sc - n Next s = d(skey) leftRng = Cells(Target.Row, 1).Resize(1, sc - 1) If Application.CountA(leftRng) = sc - 1 Then With Target.Validation .Delete If Len(s) > 0 Then .Add 3, 1, 1, Mid(s, 2) End If End With Else Target.Validation.Delete End If End IfEnd Sub
'功能:数据多级装入字典'日期:20210611'----------------------------------Public Function getData() Set d = CreateObject("scripting.dictionary") Dim lRow As Long, arr Const col As Long = 4 With Sheets("基础") lRow = .Cells(Rows.Count, 1).End(3).Row arr = .Range("A1").Resize(lRow, col).Value End With For i = 2 To UBound(arr) skey = "" For j = 1 To UBound(arr, 2) - 1 skey = "" For n = 1 To j skey = skey & arr(i, n) & ">" & n Next If InStr(d(skey) & ",", "," & arr(i, j + 1) & ",") = 0 Then d(skey) = d(skey) & "," & arr(i, j + 1) End If Next Next getData = UBound(arr, 2)End Function

有朋友扫之前的码可能发现了,由于星球试运营没有达标,后期无法在加入新的伙伴。所以我们重新触发,用心付出!白嫖或许使你快乐,但是有伙伴一起交流、有问题能及时得到答疑解惑,可能让你的更有学习的动力、工作更加顺利!

如果公众号的文章你80%都可以自己搞定,那么也可以联系小编免费加入,做做学长学姐,未来还有小礼物送额!

【点我加入】附件下载、教程合集、答疑解惑
公众号全部文章合集,按需查找+一键直达+附件练习,你想要的这里都有
今日试运营+618年中,双喜送50张69抵现券,送完为止,终生仅此一次!
有需要的朋友赶紧上车,随着内容逐步丰富,价格只会涨不会跌!
观望的朋友,也可以扫描体验
(0)

相关推荐