由于实现的是工作表的事件,我们的代码是写在了Worksheet_SelectionChange的工作表事件中。 看下面的代码: Private Sub Worksheet_SelectionChange(ByVal Target As Range) '第48讲 利用字典与数组建立二级下拉菜单 On Error Resume Next '要实现自在C列和D列的点击效果 If Target.Count <> 1 Then Exit Sub If Target.Column <> 4 And Target.Column <> 3 Then Exit Sub myarr = Range("a2:b" & [b65536].End(xlUp).Row) '将菜单装入数组 If UBound(myarr) < 3 Then Exit Sub Set myDic = CreateObject("Scripting.Dictionary") '建立一级菜单字典 Set mytwoDic = CreateObject("Scripting.Dictionary") '建立二级菜单字典 If Target.Column = 3 Then For i = 1 To UBound(myarr) If myarr(i, 1) <> "" Then myDic(myarr(i, 1)) = "" '将菜单值写入字典的键 Next '一级菜单实现 With Target.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:=Join(myDic.keys, ",") End With Target.Offset(0, 1) = "" ElseIf Target.Column = 4 And Target.Offset(0, -1) <> "" Then For i = 1 To UBound(myarr) T = myarr(i, 1) If T <> "" Then T1 = T If T = "" Then T = T1 If T = Target.Offset(0, -1) Then mytwoDic(myarr(i, 2)) = myarr(i, 2) '将菜单值写入键 End If Next '二级菜单实现 With Target.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:=Join(mytwoDic.keys, ",") End With End If Set myDic = Nothing Set mytwoDic = NothingEnd Sub 代码截图: 代码解析:1) 上述代码实现了在C,D列点击鼠标时,下拉菜单的动态响应,其中在C列点击响应的是一级菜单,在D列点击实现的是二级菜单。2) '要实现自在C列和D列的点击效果If Target.Count <> 1 Then Exit SubIf Target.Column <> 4 And Target.Column <> 3 Then Exit Submyarr = Range("a2:b" & [b65536].End(xlUp).Row) '将菜单装入数组If UBound(myarr) < 3 Then Exit Sub上述代码给出了三个屏蔽的条件,其一是在选择区域的单元格不是1的时候,其二是行数和列数不等于4和3的时候,其三是给出的UBound(myarr)小于3的时候,都是好理解的,我们不再过多的解释。3) Set myDic = CreateObject("Scripting.Dictionary") '建立一级菜单字典Set mytwoDic = CreateObject("Scripting.Dictionary") '建立二级菜单字典上述代码用两个字典分别用作两个菜单的装载工具,这里用的键。4) If Target.Column = 3 Then For i = 1 To UBound(myarr) If myarr(i, 1) <> "" Then myDic(myarr(i, 1)) = "" '将菜单值写入字典的键 Next '一级菜单实现 With Target.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:=Join(myDic.keys, ",") End With Target.Offset(0, 1) = ""上述代码完成了一级菜单的加载,首先我们在数组中将菜单值写入字典中的键,然后在通过Target.Validation的属性加载键。5) ElseIf Target.Column = 4 And Target.Offset(0, -1) <> "" Then For i = 1 To UBound(myarr) T = myarr(i, 1) If T <> "" Then T1 = T If T = "" Then T = T1 If T = Target.Offset(0, -1) Then mytwoDic(myarr(i, 2)) = myarr(i, 2) '将菜单值写入键 End If Next '二级菜单实现 With Target.Validation .Delete .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _ Operator:=xlBetween, Formula1:=Join(mytwoDic.keys, ",") End With上述代码中我们要先判断是否要实现二级菜单,如果要实现,那么将菜单值写入键中,然后实现。 下面看代码的运行: 一级菜单的实现: 二级菜单的实现: 今日内容回向:1 两级菜单是如何利用数组来实现的?2 在代码中已经屏蔽了很多条件,为什么在开始还要有On Error Resume Next 我多年的VBA实践经验,全部浓缩在以下十套教程中,可以联络我V信VBA6337取得教程,成为我的学员: 【分享成果,随喜正能量】不须计较与安排,领取而今现在。抖落岁月的尘埃,以一颗无尘的心,还原生命的本真,一往无前,未来可期。。