ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南

[求助] 右键树型菜单

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-11-25 17:23 | 显示全部楼层
zhaogang1960 发表于 2013-11-25 17:19
不会吧,我这是第一次写右键菜单,不过确实叫我苦思冥想了一番

没有听说过左键菜单,即使有生成菜单的 ...

额,我不懂所以叫法不对,反正差不多右键的那个效果,您懂的

TA的精华主题

TA的得分主题

发表于 2013-11-25 17:29 | 显示全部楼层
笑着...两年过去 发表于 2013-11-25 17:23
额,我不懂所以叫法不对,反正差不多右键的那个效果,您懂的

左键右键应该没有实际差别,还是先研究进一步提速吧:
  1. Dim d As Object '声明为模块级变量

  2. Sub CreatMe() '生成右键菜单
  3.     Dim i&, j&, k, k2, t, a, l&, arr, x As Object
  4.     If d Is Nothing Then Call 设置字典 '为了防止意外,判断一下字典是否存在,如果不存在则设置字典
  5.     k = d.keys '一级分类
  6.     With Application.CommandBars("cell")
  7.         For Each x In .Controls '删除所有菜单项
  8.             x.Delete
  9.         Next
  10.         For i = 0 To UBound(k)
  11.             With .Controls.Add(Type:=IIf(d(k(i)).Count, msoControlPopup, msoControlButton))
  12.                 .Caption = k(i)
  13.                 .OnAction = IIf(d(k(i)).Count, "", "'显示在活动单元格 """ & k(i) & """'")
  14.                 .BeginGroup = True '分组显示
  15.                 k2 = d(k(i)).keys '二级分类
  16.                 t = d(k(i)).items '三级分类,每个三级分类用逗号隔开
  17.                 For j = 0 To UBound(k2)
  18.                     a = Split(t(j), ",")
  19.                     With .Controls.Add(Type:=IIf(Len(t(j)) > UBound(a), msoControlPopup, msoControlButton))
  20.                         .Caption = k2(j)
  21.                         .OnAction = IIf(Len(t(j)) > UBound(a), "", "'显示在活动单元格 """ & k2(j) & """'")
  22.                         For l = 1 To UBound(a)
  23.                             If Len(a(l)) Then
  24.                                 With .Controls.Add(Type:=msoControlButton)
  25.                                     .Caption = a(l)
  26.                                     .OnAction = "'显示在活动单元格 """ & a(l) & """'"
  27.                                 End With
  28.                             End If
  29.                         Next
  30.                     End With
  31.                 Next
  32.             End With
  33.         Next
  34.     End With
  35. End Sub

  36. Sub 设置字典()
  37.     Set d = CreateObject("scripting.dictionary")
  38.     arr = Sheets("Sheet1").Range("A1").CurrentRegion
  39.     For i = 2 To UBound(arr)
  40.         If Not d.Exists(arr(i, 1)) Then Set d(arr(i, 1)) = CreateObject("scripting.dictionary")
  41.         If Len(arr(i, 2)) Then d(arr(i, 1))(arr(i, 2)) = d(arr(i, 1))(arr(i, 2)) & "," & arr(i, 3)
  42.     Next
  43. End Sub
复制代码
  1. Private Sub Worksheet_Activate() '激活Sheet2时设置字典
  2.     Call 设置字典
  3. End Sub
复制代码
  1. Private Sub Workbook_Activate() 'ThisWorkbook代码区,激活本工作簿,活动工作表是Sheet2则设置字典
  2.     If ActiveSheet.Name = "Sheet2" Then Call 设置字典
  3. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2013-11-25 17:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
请测试附件
临时文件(提前设置字典).rar (48.65 KB, 下载次数: 320)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2013-11-25 17:43 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 苍海拾贝 于 2013-11-25 17:47 编辑
苍海拾贝 发表于 2013-11-25 15:27
有误,重发,新建一个菜单

改了个左键的,请测试,原来的速度确实比赵版的慢很多,主要原因应该是每次点击都要创建菜单试试预先创建菜单,点击时执行showpopup,供参考



临时文件20131125.rar (48.77 KB, 下载次数: 109)


点评

写得不错,不过你忘记了OnAction  发表于 2013-11-25 18:01

TA的精华主题

TA的得分主题

发表于 2013-11-25 19:09 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
笑着...两年过去 发表于 2013-11-25 17:23
额,我不懂所以叫法不对,反正差不多右键的那个效果,您懂的

激活Sheet2时生成左键树型菜单,Sheet2出于非活动状态时删除它,当你单击F列的某一个单独的单元格时显示左键树型菜单,离开时不显示,速度很快:
  1. Sub CreatMe() '生成左键树型菜单
  2.     Dim d As Object, i&, j&, k, k2, t, a, l&, arr, x As Object
  3.     Set d = CreateObject("scripting.dictionary")
  4.     arr = Sheets("Sheet1").Range("A1").CurrentRegion
  5.     For i = 2 To UBound(arr)
  6.         If Not d.Exists(arr(i, 1)) Then Set d(arr(i, 1)) = CreateObject("scripting.dictionary")
  7.         If Len(arr(i, 2)) Then d(arr(i, 1))(arr(i, 2)) = d(arr(i, 1))(arr(i, 2)) & "," & arr(i, 3)
  8.     Next
  9.     k = d.keys '一级分类
  10.     On Error Resume Next
  11.     Application.CommandBars("树型菜单").Delete '删除可能存在的
  12.     With Application.CommandBars.Add("树型菜单", msoBarPopup)
  13.         For i = 0 To UBound(k)
  14.             With .Controls.Add(Type:=IIf(d(k(i)).Count, msoControlPopup, msoControlButton))
  15.                 .Caption = k(i)
  16.                 .OnAction = IIf(d(k(i)).Count, "", "'显示在活动单元格 """ & k(i) & """'")
  17.                 .BeginGroup = True '分组显示
  18.                 k2 = d(k(i)).keys '二级分类
  19.                 t = d(k(i)).items '三级分类,每个三级分类用逗号隔开
  20.                 For j = 0 To UBound(k2)
  21.                     a = Split(t(j), ",")
  22.                     With .Controls.Add(Type:=IIf(Len(t(j)) > UBound(a), msoControlPopup, msoControlButton))
  23.                         .Caption = k2(j)
  24.                         .OnAction = IIf(Len(t(j)) > UBound(a), "", "'显示在活动单元格 """ & k2(j) & """'")
  25.                         For l = 1 To UBound(a)
  26.                             If Len(a(l)) Then
  27.                                 With .Controls.Add(Type:=msoControlButton)
  28.                                     .Caption = a(l)
  29.                                     .OnAction = "'显示在活动单元格 """ & a(l) & """'"
  30.                                 End With
  31.                             End If
  32.                         Next
  33.                     End With
  34.                 Next
  35.             End With
  36.         Next
  37.     End With
  38. End Sub
复制代码
  1. Sub DeleteMycell() '删除左键菜单
  2.     On Error Resume Next
  3.     Application.CommandBars("树型菜单").Delete
  4. End Sub
复制代码
  1. Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  2.     If Target.Count > 1 Then Exit Sub
  3.     If Target.Column = 6 Then Application.CommandBars("树型菜单").ShowPopup
  4. End Sub

  5. Private Sub Worksheet_Activate() '激活Sheet2时生成左键树型菜单
  6.     Call CreatMe
  7. End Sub

  8. Private Sub Worksheet_Deactivate() '离开Sheet2时删除左键树型菜单,防止影响其他工作表
  9.     Call DeleteMycell
  10. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2013-11-25 19:11 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2013-11-25 22:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 name004 于 2013-11-25 22:39 编辑
zhaogang1960 发表于 2013-11-25 17:14
还有一个提速方法
激活Sheet2时把Sheet1数据写进字典,右键单击时只生成菜单,不用再计算一遍 ...


赵老师确实是师德高,技术高。
这个问题,如果这样解决,太麻烦了,让人望而却步。
我说说我前几年的解决方法:双击f列,双击事件激活sheet1并且选择在a列;a列双击则选择b列对应行。以此类推,连锁双击和选择。
比如:计算机配件销售,品种实在多得吓人,用右键如何涵盖几十个品种?而且,字体很小,选择中紧紧抓住鼠标且对应光标。很累!
临时文件的附件速度很快,确实很好。

TA的精华主题

TA的得分主题

发表于 2013-11-25 22:34 | 显示全部楼层
name004 发表于 2013-11-25 22:25
赵老师确实是师德高,技术高。
这个问题,如果这样解决,太麻烦了,让人望而却步。
我说说我前几年的解 ...

你说的倒也是个办法,可以避免因数据太多,字典存放不下

如果数据不是很多,楼主要求的这个方法还是可行的,可以免去两个工作表来回激活带来的麻烦

TA的精华主题

TA的得分主题

发表于 2013-12-5 13:37 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 zjisy 于 2013-12-5 13:40 编辑

赵老师强大,请问赵老师,临时文件(提前设置字典)四级分类显示最后两个单元格怎么做到呢?就是选到最后,显示出三级和四级单元格内的内容。

临时文件(提前设置字典)四级分类显示最后两个单元格怎么做到呢.zip

50.03 KB, 下载次数: 84

点评

亲!点击他本人所在的任意楼层下方的回复按钮,然后在里面填写内容他才能看得见,  发表于 2013-12-5 13:40

TA的精华主题

TA的得分主题

发表于 2013-12-5 13:38 | 显示全部楼层
zhaogang1960 发表于 2013-11-25 22:34
你说的倒也是个办法,可以避免因数据太多,字典存放不下

如果数据不是很多,楼主要求的这个方法还是可 ...

赵老师强大,请问赵老师,临时文件(提前设置字典)四级分类显示最后两个单元格怎么做到呢?
http://club.excelhome.net/thread-1074700-4-1.html
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 05:38 , Processed in 0.048463 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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