当前位置: 首页 > news >正文

Excel VSTO开发11-自定义菜单项

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

11 自定义菜单项

自定义菜单项可以在插件启动时候添加,即增加到ThisAddIn_Startup() 内。

下面以具体代码说明:

[代码7] 增加自定义菜单项

    '插件启动时候

    Private Sub ThisAddIn_Startup() Handles Me.Startup

        ……

        Call addMenu()

End Sub

    Private Sub addMenu()

        '单元格右键时候的弹出菜单

        Dim cMenuControl As Office.CommandBar = Globals.ThisAddIn.Application.CommandBars("Cell")

        '增加菜单项到菜单第一个

        Dim cButtonControl As Microsoft.Office.Core.CommandBarControl = cMenuControl.Controls.Add(Microsoft.Office.Core.MsoControlType.msoControlButton, Before:=1)

        '转换为CommandBarButton

        Dim cButton As Microsoft.Office.Core.CommandBarButton = CType(cButtonControl, Microsoft.Office.Core.CommandBarButton)

        cButton.Caption = "查看菜单"

        cButton.Tag = "这是自定义菜单项"

        cButton.FaceId = 22

        '增加菜单项按下事件

        AddHandler cButton.Click, AddressOf menu_click

End Sub

以上代码运行后会在单元格右键菜单上增加一个“查看菜单”菜单项,位置在第一个。如下图所示:

23 增加自定义菜单项

如果把代码中

Before:=1

修改为

Before:=5

那么菜单项将增加到第5个位置,如下图所示:

24 自定义菜单项位置改变后

在实际中,以上代码会存在一定问题,读者可以测试,当运行多次后会发现多出很多相同的菜单项,也就是菜单项重复被添加。

修改后的代码如下:

    Private Sub addMenu()

        '单元格右键时候的弹出菜单

        Dim cMenuControl As Office.CommandBar = Globals.ThisAddIn.Application.CommandBars("Cell")

        '列出当前菜单的所有菜单项

        For Each cControl As Microsoft.Office.Core.CommandBarControl In cMenuControl.Controls

            '下面一句代码可以输出当前所有菜单项

            'System.Diagnostics.Debug.WriteLine(cControl.Caption & "   " & cControl.Id)

            ' 如果已经存在我们自定义的菜单项

            If cControl.Caption = "查看菜单" Then

                '1、可以退出

                'Exit Sub

                '2、可以将之前已经存在的菜单项删除

                cControl.Delete()

            End If

        Next

        '增加菜单项到菜单第一个

        Dim cButtonControl As Microsoft.Office.Core.CommandBarControl = cMenuControl.Controls.Add(Microsoft.Office.Core.MsoControlType.msoControlButton, Before:=1)

        '转换为CommandBarButton

        Dim cButton As Microsoft.Office.Core.CommandBarButton = CType(cButtonControl, Microsoft.Office.Core.CommandBarButton)

        cButton.Caption = "查看菜单"

        cButton.Tag = "这是自定义菜单项"

        cButton.FaceId = 22

        '增加菜单项按下事件

        AddHandler cButton.Click, AddressOf menu_click

End Sub

顺便将自定义菜单项的事件增加如下:

    '菜单项按下事件:列出所有的命令栏ID和名称

    Public Sub menu_click(ByVal control As Office.CommandBarButton, ByRef cancelDefault As Boolean)

        'Excel里面随时记住从1开始,而非vb中的0开始

        Dim i As Integer = 1

        Dim Wbook As Excel.Workbook = Application.Workbooks(1)

        Dim Wsheet As Excel.Worksheet

        Wsheet = Wbook.Worksheets("sheet1")

        For Each cMenuControl As Office.CommandBar In Globals.ThisAddIn.Application.CommandBars

            Wsheet.Cells(i, 1).Value = cMenuControl.Id

            Wsheet.Cells(i, 2).Value = cMenuControl.Name

            Select Case cMenuControl.Type

                Case 0

                    Wsheet.Cells(i, 3).Value = "msoBarTypeNormal"

                Case 1

                    Wsheet.Cells(i, 3).Value = "msoBarTypeMenuBar"

                Case 2

                    Wsheet.Cells(i, 3).Value = "msoBarTypePopup"

                Case Else

            End Select

            i += 1

        Next

        MsgBox("ok")

End Sub

http://www.lryc.cn/news/157780.html

相关文章:

  • stm32之30.DMA
  • 【LeetCode75】第四十九题 数组中的第K个最大元素
  • 嵌入式面试笔试刷题(day14)
  • 好用免费的Chat GPT(亲测有用)
  • SpringBoot项目--电脑商城【上传头像】
  • 优化SOCKS5的方法
  • 使用 HelpLook Chatbot,让AI聊天机器人变成销售经理
  • MT9700 80mΩ,可调快速响应限流配电开关芯片
  • RabbitMQ之延迟队列
  • k8s部署手册-v06
  • Qt 5.15集成Crypto++ 8.7.0(MSVC 2019)笔记
  • LeetCode——贪心篇(一)
  • 2023高教社杯 国赛数学建模C题思路 - 蔬菜类商品的自动定价与补货决策
  • 【理解线性代数】(四)线性运算的推广与矩阵基础
  • C# 什么是继承和派生
  • 无涯教程-JavaScript - HEX2BIN函数
  • 前端面试0906
  • OceanBase社区版4.x核心技术解密
  • 快速安装k8s
  • [FFmpeg] 常用ffmpeg命令
  • 代码随想录训练营第五十七天|647. 回文子串、516.最长回文子序列
  • 对线程池设置做压测
  • 【网络通信 -- WebRTC】项目实战记录 -- mediasoup android 适配 webrtc m94
  • 【力扣周赛】第 357 场周赛(⭐反悔贪心)
  • css重置
  • tcpdump相关
  • MFC新建内部消息
  • linux查找目录
  • 机器学习:可解释学习
  • UE5- c++ websocket里实现调用player里的方法