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

news2024/12/24 0:11:08

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

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.coloradmin.cn/o/982577.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

it监控系统可以电脑吗?有什么效果

IT业务监控已经成为公司不可或缺的一部分,以确保业务的正常运行,提高企业的竞争能力。本文将详细介绍IT业务监控的必要性、实施方法以及如何选择合适的监控工具。 IT业务监控的必要性 确保业务稳定运行  IT业务监控可以实时检测公司的工作流程&#x…

基于VueCli创建自定义项目

1.安装脚手架 (已安装) npm i vue/cli -g2.创建项目 vue create hm-exp-mobile选项 Vue CLI v5.0.8 ? Please pick a preset:Default ([Vue 3] babel, eslint)Default ([Vue 2] babel, eslint) > Manually select features 选自定义手动选择功能 选择vue的版本 3.x …

Bootloader概述和Uboot

Bootloader 基本概念 什么是Bootloader? Bootloader是硬件启动的引导程序,是运行操作系统的前提;在操作系统内核或用户应用程序运行之前运行的一小段代码。对软硬件进行相应的初始化和设定,为最终运行操作系统准备好环境;在嵌入…

【动态规划刷题 10】等差数列划分 最长湍流子数组

413. 等差数列划分 链接: 413. 等差数列划分 如果一个数列 至少有三个元素 ,并且任意两个相邻元素之差相同,则称该数列为等差数列。 例如,[1,3,5,7,9]、[7,7,7,7] 和 [3,-1,-5,-9] 都是等差数列。 给你一个整数数组 nums ,返回…

Multisim14.0仿真(九)反相放大器

一、仿真原理图: 二、运行效果:

【漏洞复现】E-office文件包含漏洞

漏洞描述 Weaver E-Office是中国泛微科技(Weaver)公司的一个协同办公系统。泛微 E-Office 是一款标准化的协同 OA 办公软件,实行通用化产品设计,充分贴合企业管理需求,本着简洁易用、高效智能的原则,为企业快速打造移动化、无纸化、数字化的办公平台。 该漏洞是由于存在…

CMD关闭占用端口

1. netstat -ano | findstr :xxxx 2. taskkill /pid xxxx 3. 强制关闭taskkill/F /pid xxxx

大基金三期再拨400亿美元 | 百能云芯

近日,知情人士透露,中国计划启动一个新的国家支持的投资基金,旨在为半导体行业筹集大约400亿美元。这将是中国集成电路产业投资基金(大基金)推出的第三只基金,也可能是规模最大的一只。计划筹集的资金目标为…

win11 系统 Internet Connection Sharing (ICS) 服务无法关闭-问题解决

问题出现在matebook ego ,出现一个问题就是一连上电源,运行ipconfig ,WLAN 2就会自动给配上一个192.168.137.1的ip,一断开电源这个ip就会小时,因为我要创建一个热点,如果这个ip有了那么热点会创建失败!于是开始排查&am…

假期摆烂之学习javaweb

Mybatis: 概念: 是一款优秀的持久层框架,用于简化 JDBC的开发:持久层也就是三层架构里面的dao层,JDBC是规范;框架就是一个半成品的软件,是一套可重复用,通用的,软件基础代码模型&a…

Python中的异常处理3-1

Python中的异常指的是语法上没有错误,但是代码执行时会导致错误的情况。 1 抛出异常 在图1所示的代码中,要求用户输入一个数字,该代码在语法上没有错误。 图1 出现异常的代码 但是运行该代码之后,如果用户输入的是数字&#xf…

反转字符串 反转字符串 || 反转字符串 |||

思想总结:首先将字符串转变为字符数组,再进行遍历并反转字符。 1.反转字符串 代码: class Solution {public void reverseString(char[] s) {reverse(s,0,s.length); //左闭右开}public static void reverse(char[] ch,int i,int j) { 翻转函…

易基因:MLL1/DNA低甲基化介导子宫肌层干细胞发育重编程的表观遗传机制|组学研究

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 子宫肌瘤(uterine fibroids,UF)是生殖系统最常见的良性肿瘤,也是子宫切除手术最常见的指征。尽管患病率很高,但子宫肌瘤的确切…

第6章 内核模块符号导出实验(iTOP-RK3568开发板驱动开发指南 )

在上一小节中,给大家讲解了驱动模块传参实验,使用insmod命令加载驱动时可以进行参数的传递,但是每一个内核模块之间是相互独立的,那模块间的符号传递要怎样进行呢,让我们带着疑问来进行本章节的学习吧! 6.…

安森美LM317全系列低压差线性稳压器(LDO)多种不同封装类型 高性能更可靠

低压差线性稳压器(LDO),是指一种具有恒定电流输出电压的装置,主要由输入变压器、整流器、输出变压器三部分构成,工业原理为将输入的交流电压经过整流、滤波后得到直流输出电压,再经过控制元件和开关器件将稳…

前端 JS 经典:上传文件

重点&#xff1a;multipart/form-data 后端识别上传类型必填 1. form 表单上传 <!-- enctype"multipart/form-data" 这个必填 --> <form action"http://127.0.0.1:8080/users/avatar" method"post" enctype"multipart/form-data…

Vue框架--Vue条件渲染

这里重点讲述Vue提供的两个指令:v-show和v-if(v-else-if/v-else)。

C 风格文件输入/输出 (std::fflush)(std::fwide)(std::setbuf)(std::setvbuf)

文件访问 将输出流与实际文件同步 std::fflush int fflush( std::FILE* stream ); 对于输出流&#xff08;和最近操作为输出的更新流&#xff09;&#xff0c;将来自 stream 缓冲区的未写入数据写入关联的输出设备。 对于输入流&#xff08;和最近操作为输入的更新流&…

实在智能牵手埃林哲,“TARS-RPA-Agent+云时通”双剑合璧共推企业数字化转型

近日&#xff0c;《数字中国建设整体布局规划》进一步明确了数字化发展的方向和节奏&#xff0c;对企业数字化建设提出了新要求。回看过去几十年&#xff0c;信息化建设如火如荼&#xff0c;各类IT系统如雨后春笋般涌现&#xff0c;系统的自动化操作及系统间数据交互共享等需求…

std::make_shared和new初始化智能指针的区别

先看代码&#xff1a; class Base {public:Base(int num):a(num) {std::cout << "Base() construct" << std::endl;}~Base() {std::cout << "Base() deconstruct" << std::endl;}int Get() {return a;}private:int a; };void tes…