ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 998|回复: 6

[求助] 怎么修改代码定位需要的位置!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-12-20 08:04 | 显示全部楼层 |阅读模式
本帖最后由 苏钊丶 于 2019-12-20 08:58 编辑
  1. Sub main() '根据数据表初始化弹出菜单
  2.     Dim mybar As CommandBar, arr, i&, d
  3.     On Error Resume Next
  4.     Application.CommandBars("myCell").Delete '重设菜单前删除原菜单
  5.     Set mybar = Application.CommandBars.Add(Name:="myCell", Position:=msoBarPopup) '创建弹出式菜单
  6.     arr = Range("Data!A1").CurrentRegion.Value '定位数据区,源数据放入数组arr
  7.     Set d = CreateObject("Scripting.Dictionary")
  8.     For i = 2 To UBound(arr)  '遍历数据源行,从第2行开始
  9.         Call 菜单(arr, i, 1, d, mybar)
  10.     Next
  11.     Set d = Nothing
  12.     Set mybar = Nothing
  13. End Sub


  14. Sub 菜单(arr, i, n, ByVal d, ByVal myb)
  15. '参数 arr-源数据数组,i-,n-,d-字典,myB-菜单
  16.     Dim x, y
  17.     x = arr(i, n) '源数组第i行第N列
  18.     y = WorksheetFunction.CountA(Application.Index(arr, i)) '当前行的元素个数
  19.     If Not d.Exists(x) Then '如果字典中关键字x不存在,即当前关键字未添加进菜单
  20.         If n = y Then '如果当前列数n等于arr源数组的最大列数,即到达最后一级
  21.             d.Add x, i '在字典d中以x为key,存为值i
  22.             'd(x) = i
  23.             With myb.Controls.Add(Type:=msoControlButton) '菜单加入触发按钮
  24.                 .Caption = x '菜单按钮名称为x
  25.                 .OnAction = "输入(" & i & "," & n & ")" '最后一级选择触发事件,完成输入
  26. '                Debug.Print x; "输入(" & i & "," & n & ")"
  27.             End With
  28.         Else '如果不是最后一级菜单,则继续添加字典及菜单
  29.             Set d(x) = CreateObject("Scripting.Dictionary")
  30.             Set myb = myb.Controls.Add(Type:=msoControlPopup) '加入下级弹出菜单
  31.             myb.Caption = x '菜单按钮名称为x
  32.         End If
  33.     Else '如果字典key已存在,菜单即引用本级内x关键字菜单
  34.         Set myb = myb.Controls.Item(x)
  35.     End If
  36.    
  37.     If n < y Then '如果当前列未到达源数据最大列
  38.         Call 菜单(arr, i, n + 1, d(x), myb) '递归调用本过程继续生成菜单
  39.     End If
  40. End Sub


  41. Sub 输入(i, m)
  42.     Dim arr
  43.     arr = Worksheets("Data").Range("A" & i).Resize(1, m).Value
  44.     'ActiveCell.EntireRow.Range("A1").Resize(1, 4).ClearContents
  45.     ActiveCell.EntireRow.Range("A1").Resize(1, m) = arr
  46. End Sub


  47. Public Sub SubPopBar(keys() As Variant)
  48. '根据参数数组返回子菜单,并复制到单独的弹出菜单
  49.     Dim intI As Integer, subB
  50.     Dim mybar As CommandBar
  51.     Set subB = CommandBars("myCell")
  52.     On Error Resume Next
  53.     For intI = 0 To UBound(keys) '获得参数列表的子菜单
  54.         If keys(intI) <> "" Then
  55.             Set subB = subB.Controls(keys(intI))
  56.         Else
  57.             Application.CommandBars("myCell").ShowPopup '如果前面几列输入的数据为空则直接弹出顶级菜单
  58.             Exit Sub
  59.         End If
  60.     Next intI
  61.     On Error Resume Next
  62.     Application.CommandBars("myCellx").Delete '重设菜单前删除原菜单
  63.     Set mybar = Application.CommandBars.Add(Name:="myCellx", Position:=msoBarPopup) '创建弹出式菜单
  64.    
  65.     For intI = 1 To subB.Controls.Count
  66.         subB.Controls(intI).Copy Bar:=mybar '从顶级菜单中摘出需要的子菜单
  67.     Next
  68.     Set subB = Nothing
  69.     Set mybar = Nothing
  70.     Application.CommandBars("myCellx").ShowPopup
  71. End Sub
复制代码


多级菜单.rar

25.13 KB, 下载次数: 5

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-20 08:05 | 显示全部楼层
一直搞不懂,比如我想要菜单从第5行开始,而不是第2行开始,要修改哪里!!

TA的精华主题

TA的得分主题

发表于 2019-12-20 08:39 | 显示全部楼层
  1. 8.    For i = 2 To UBound(arr)  '遍历数据源行,从第2行开始

  2. 9.        Call 菜单(arr, i, 1, d, mybar)

  3. 10.    Next
  4. 没附件, 看代码, 这里不是写着第二行开始吗? 要从第五行, 就 i = 5 咯
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-20 08:59 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-20 09:52 | 显示全部楼层
附件已经上传,大佬看一下!

TA的精华主题

TA的得分主题

发表于 2019-12-20 11:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
在事件里改,而不需要在模块中改!除非你不是在A列开始输入 需要在模块中修改一下。。顺带一提 你这个应该是 excel880老师的案例。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-12-20 12:34 | 显示全部楼层
Q155133209 发表于 2019-12-20 11:33
在事件里改,而不需要在模块中改!除非你不是在A列开始输入 需要在模块中修改一下。。顺带一提 你这个应该 ...

嗯,在论坛大佬那扒拉出来的东西,先感谢原作者的辛苦。

另外,我想从A5开始,事件VBA不懂,只能扒人家的代码,然后对照,下载了好多案例,没有明显的语句表示,这个就十分尴尬~
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-26 22:27 , Processed in 0.039729 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表