ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 自定义的右键菜单只能执行一次

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-6-20 22:36 | 显示全部楼层 |阅读模式
本帖最后由 394286425 于 2017-6-21 21:39 编辑
  1.    private void ThisAddIn_Startup(object sender, System.EventArgs e)
  2.         {
  3.             AddContextMenuStrip();

  4.         }

  5.         private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
  6.         {
  7.         }

  8.         private void AddContextMenuStrip()
  9.         {
  10.             CommandBar mzBar = Globals.ThisAddIn.Application.CommandBars["cell"];    //excel文档已有的右键菜单cell
  11.             if (mzBar == null) { return; }

  12.             foreach (CommandBarControl temp_contrl in mzBar.Controls)
  13.             {
  14.                 temp_contrl.Delete(false);
  15.             }

  16.             //长度自动合并
  17.             CommandBarButton btnAutoMerge = (CommandBarButton)mzBar.Controls.Add(MsoControlType.msoControlButton, missing, missing, missing, true);
  18.             btnAutoMerge.Tag = "btn_AutoMerge";
  19.             btnAutoMerge.Caption = "长度自动合并";
  20.             btnAutoMerge.Style = MsoButtonStyle.msoButtonIconAndCaption;
  21.             btnAutoMerge.FaceId = 3277;
  22.             btnAutoMerge.Click += new _CommandBarButtonEvents_ClickEventHandler(btnAutoMerge_Click);
  23.         }

  24.         //长度自动合并
  25.         private void btnAutoMerge_Click(CommandBarButton Ctrl, ref bool CancelDefault)
  26.         {
  27.             
  28.             MessageBox.Show("长度自动合并");
  29.             LengthAutoMerge();
  30.             
  31.         }

  32.         //长度自动合并
  33.         public void LengthAutoMerge()
  34.         {
  35.             Excel.Application xls = Globals.ThisAddIn.Application;
  36.             xls.ScreenUpdating = false;

  37.             Excel.Workbook wb = xls.ActiveWorkbook;
  38.             Excel.Worksheet ws = (Excel.Worksheet)wb.ActiveSheet;
  39.             Range rng = (Range)xls.ActiveWindow.Selection;
  40.             int topRow = rng.Row;
  41.             int endRow = rng.Row + rng.Rows.Count - 1;
  42.             int leftCol = rng.Column;
  43.             int rightCol = rng.Column + rng.Columns.Count - 1;
  44.             Dictionary<int, int> dict = new Dictionary<int, int>();
  45.             List<int[]> lsList = new List<int[]>() { };
  46.             for (int i = topRow; i <= endRow; i++)
  47.             {
  48.                 Range rngLenth = (Range)ws.Cells[i, leftCol];
  49.                 int length = Convert.ToInt32(rngLenth.Text);
  50.                 Range rngNum = (Range)ws.Cells[i, rightCol];
  51.                 int num = Convert.ToInt32(rngNum.Text);
  52.                 if (dict.ContainsKey(length))//长度已有则数量相加
  53.                 {
  54.                     dict[length] = dict[length] + num;
  55.                 }
  56.                 else//没有则添加
  57.                 {
  58.                     dict.Add(length, num);
  59.                 }
  60.             }
  61.             var dicSort = from objDic in dict orderby objDic.Key descending select objDic;
  62.             foreach (KeyValuePair<int, int> kvp in dicSort)
  63.             {
  64.                 lsList.Add(new int[] { kvp.Key, kvp.Value });
  65.             }

  66.             for (int j = 0; j < lsList.Count; j++)
  67.             {
  68.                 ((Range)ws.Cells[topRow + j, 16]).Value = lsList[j][1];
  69.                 ((Range)ws.Cells[topRow + j, 17]).Value = lsList[j][0];
  70.             }

  71.             xls.ScreenUpdating = true;

  72.         }
复制代码
·自定义的右键菜单点击一次后能运行,继续点击就没反应了。求解救!

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-6-21 21:38 | 显示全部楼层
以解决;添加对右键点击事件的判断。每次右键点击就重新加载一次自定义菜单
  1. private void ThisAddIn_Startup(object sender, System.EventArgs e)
  2.         {
  3.             Excel.Application xls = Globals.ThisAddIn.Application;
  4.             xls.SheetBeforeRightClick += new AppEvents_SheetBeforeRightClickEventHandler(SheetBeforeRight_Click);
  5.         }

  6.         private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
  7.         {
  8.         }

  9.         private void SheetBeforeRight_Click(object Sh, Microsoft.Office.Interop.Excel.Range Target, ref bool Cancel)
  10.         {
  11.             AddContextMenuStrip();
  12.         }

  13.         private void AddContextMenuStrip()
  14.         {
  15.             CommandBar mzBar = Globals.ThisAddIn.Application.CommandBars["cell"];    //excel文档已有的右键菜单cell
  16.             if (mzBar == null) { return; }

  17.             foreach (CommandBarControl tmp_contrl in mzBar.Controls)
  18.             {
  19.                 tmp_contrl.Delete();
  20.             }

  21.             //长度自动合并
  22.             CommandBarButton btnAutoMerge = (CommandBarButton)mzBar.Controls.Add(MsoControlType.msoControlButton, missing, missing, missing, true);
  23.             btnAutoMerge.Tag = "AutoMerge";
  24.             btnAutoMerge.Caption = "长度自动合并";
  25.             btnAutoMerge.Style = MsoButtonStyle.msoButtonCaption;
  26.            
  27.             btnAutoMerge.Click += new _CommandBarButtonEvents_ClickEventHandler(btnAutoMerge_Click);
  28.         }

  29.         //长度自动合并
  30.         private void btnAutoMerge_Click(CommandBarButton Ctrl, ref bool CancelDefault)
  31.         {
  32.             //MessageBox.Show("长度自动合并");
  33.             LengthAutoMerge();
  34.         }
复制代码

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-21 21:48 , Processed in 0.026064 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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