精华内容
下载资源
问答
  • 功能分析要实现的这个添加代码的菜单,需要具备以下几...01自动更新要自动更新是比较简单的,只要在加载宏打开的时候,执行一次添加菜单的功能即可,所以,需要在加载宏的Thisworkbook模块添加代码:Private Sub Wor...

    42e2bdcc45a1533c94a1eb2410e7b994.png

    功能分析

    要实现的这个添加代码的菜单,需要具备以下几个特点:

    • 要添加的项目肯定会不停的改变,所以必须要能够方便添加代码和自动更新。

    • 即能添加单个的按钮,也能在菜单上继续添加下拉式的菜单,这样方便一些同类型的功能放在一起。

    01自动更新

    要自动更新是比较简单的,只要在加载宏打开的时候,执行一次添加菜单的功能即可,所以,需要在加载宏的Thisworkbook模块添加代码:

    Private Sub Workbook_Open()    Call AddCommanBarEnd Sub

    这样加载宏打开的时候,每次都去重新创建一次菜单,只要把创建菜单的代码逻辑规划好就可以。

    02分类自动添加

    因为需要分类(单独按钮和新的弹出式)创建,所以必须有个地方能够让我们知道要创建的是什么类型的,个人做法是:

    毕竟这个不是非常复杂的程序,所以在一个单独的文件夹专门存放代码,然后手动创建一个目录,平时只要去维护这个目录即可。

    目录的信息主要有:

    msoControl  添加控件类型(单独按钮和新的弹出式)caption    控件的显示名称faceID    控件的图标endflag    这个是标记弹出式控件结束的

    按如下格式创建一个CommandBarDir.txt文件:

    msoControl,caption,faceID,endflag1,vba_main,538,1,i_row,73,10,Object,361,1,dic,2,1,ado,50,1,fso,53,1,json,203,1,Clipboard,19,1

    每增加一个代码文件的时候,都要在目录中添加一行信息。这种常用的片段代码个人认为不会特别多,所以手动维护一个这样的目录应该不难。

    前面的1和10对应的分别是msoControlButtonmsoControlPopup,这个数字可以在立即窗口这样输入查看:

    ?msoControlButton

    这个就是VBA内置定义好了的枚举类型:

    1719b7bb6067e544842d3953e8e46e46.png

    caption对应的名称就是保存代码的txt文件:

    227d361d0db88f18ef0402d02cba8540.png

    这里不使用遍历获取文件的目的是,菜单的顺序用习惯了还是不喜欢变动的,如果遍历获取文件,默认是按照字母排序的,可能在更新的时候有变动。

    faceID是控件前面的小图标,这个其实无所谓,有兴趣可以写个简单的代码,在菜单上添加控件,设置不同的faceID看看:

    Sub TestExcelCMDB()    Dim cmdb As CommandBarButton        Application.CommandBars("Worksheet Menu Bar").Reset       Dim i As Long    For i = 1 To 200        Set cmdb = Application.CommandBars("Worksheet Menu Bar").Controls.Add(msoControlButton, Temporary:=True)        cmdb.FaceId = i    NextEnd Sub

    c117a7fe9bb2a44835c389c08b32c2b2.png

    endflag就是为了标识msoControlPopup的结束。

    基本上前期的一些基础就这些了,这里主要做的就是维护好CommandBarDir.txt文件。

    3eb8277f2ee449787636a6a2813284b0.png

    展开全文
  • 有了前面的功能分析基础,使用VBA代码实现这个功能就不是很难了,逐行读取CommandBarDir.txt里面的信息,然后创建弹出式菜单或者按钮,最终实现的效果如下:功能实现01类模块功能类模块CCommandBar就是为了响应单击...

    9fc853b0bb31dab576520648e2c1c8cd.png

    有了前面的功能分析基础,使用VBA代码实现这个功能就不是很难了,逐行读取CommandBarDir.txt里面的信息,然后创建弹出式菜单或者按钮,最终实现的效果如下:

    2acb49bba07778d9bca920507a51a822.gif

    功能实现

    01类模块功能

    类模块CCommandBar就是为了响应单击按钮的功能:

    • 根据单击的按钮的名称,读取对应名称的txt文件

    • 将读取到的文本插入到VBE中

    所以,分别先实现2个函数,读取txt文件的内容在前面有过介绍:

    • VBA调用外部对象02:FileSystemObject——操作文本文件

    • 文件操作——读取

    在这里使用FSO来读取。

    Private Function FsoReadTxt(file_name As String) As String    Dim fso As Object, sr As Object        Set fso = CreateObject("Scripting.FileSystemObject")    Set sr = fso.OpenTextFile(file_name, 1) 'ForReading=1    FsoReadTxt = sr.ReadAll()        Set fso = Nothing    Set sr = NothingEnd Function

    在VBE中插入代码,就是操作VBE对象相关的属性和方法

    Private Function InsertCode(str_code As String)    Dim i_row As Long    '获取鼠标定位所在的行号    Application.VBE.ActiveCodePane.GetSelection i_row, 0, 0, 0    '从获取的行号开始处插入代码    Application.VBE.SelectedVBComponent.CodeModule.InsertLines i_row, str_codeEnd Function

    这2个函数都放在类模块CCommandBar中。

    然后是实现类模块响应按钮的单击事件:

    Public WithEvents cmdbe As VBIDE.CommandBarEventsPrivate Sub cmdbe_Click(ByVal CommandBarControl As Object, handled As Boolean, CancelDefault As Boolean)    On Error GoTo ErrHandle        Dim str_code As String    Const VBE_DIR As String = "\vbaCodes\"        str_code = FsoReadTxt(ThisWorkbook.Path & VBE_DIR & CommandBarControl.Caption & ".txt")    InsertCode str_code    Exit Sub    ErrHandle:    MsgBox Err.DescriptionEnd Sub

    VBE_DIR的路径名称可以自己设置,但建议放在MyVBA.xlam同一路径下。

    02添加菜单的功能

    添加菜单和按钮的代码:

    '记录所有需要执行单击事件的菜单按钮Private cbars As CollectionPrivate Type CommandBarInfo    mso As Long     '菜单类型    Caption As String  '名称    FaceId As Long  '图标    Flag As Long    '记录是否是弹出式菜单End TypeSub AddCommanBar()    If Not CheckVbproject Then        Exit Sub    End If        Set cbars = New Collection    add_barEnd SubFunction add_bar() As Long    Dim bar_btn As CommandBarControl    Dim bar_info As CommandBarInfo    Dim num_file As Integer    Dim tmp_bar As CommandBarPopup    Dim my_bar As CommandBarPopup    Dim cbar As CCommandBar        Const sBAR_NAME As String = "插入代码(&C)"    Const VBACodes As String = "\vbaCodes\CommandBarDir.txt"            On Error Resume Next    Application.VBE.CommandBars(1).Controls(sBAR_NAME).Delete    On Error GoTo 0        '添加菜单    Set my_bar = Application.VBE.CommandBars(1).Controls.Add(msoControlPopup)    my_bar.Caption = sBAR_NAME    Set tmp_bar = my_bar        '打开目录    num_file = VBA.FreeFile    Open ThisWorkbook.Path & VBACodes For Input As #num_file     '跳过标题行    Line Input #num_file, bar_info.Caption    Do Until VBA.EOF(num_file)        Input #num_file, bar_info.mso, bar_info.Caption, bar_info.FaceId, bar_info.Flag        If bar_info.Caption <> "" Then            If bar_info.mso = msoControlPopup Then                '弹出式菜单                Set tmp_bar = my_bar.Controls.Add(msoControlPopup)                tmp_bar.Caption = bar_info.Caption            Else                Set bar_btn = tmp_bar.Controls.Add(bar_info.mso)                bar_btn.Caption = bar_info.Caption                bar_btn.FaceId = bar_info.FaceId                bar_btn.BeginGroup = True                                Set cbar = New CCommandBar                Set cbar.cmdbe = Application.VBE.Events.CommandBarEvents(bar_btn)                '添加到集合中                cbars.Add cbar                                'flag=1 表示1个popup的结束                If bar_info.Flag = 1 Then Set tmp_bar = my_bar            End If        End If    Loop        Close #num_file    Set bar_btn = NothingEnd FunctionFunction CheckVbproject() As Boolean    Dim obj As Object        On Error Resume Next    Set obj = Application.VBE.ActiveVBProject    If Err.Number <> 0 Then        MsgBox "请勾选 信任对VBA工程对象模型的访问"        CheckVbproject = False    Else        CheckVbproject = True    End IfEnd Function

    因为要操作VBE,所以先使用CheckVbproject检查是否勾选了信任对VBA工程对象模型的访问,如何设置请参考VBA操作VBA——VBA工程对象

    03自动更新

    使用过程中增加了代码后,只要重新打开加载宏就会自动进行更新,在ThisWorkbook模块添加代码:

    Private Sub Workbook_Open()    Call AddCommanBarEnd Sub

    后面需要做的就是维护好CommandBarDir.txt即可。

    1caf332b74dfdf21a09bc65e1d419057.png

    展开全文
  • 在2003版本之前的Excel里使用过VBA的话,应该接触过在Excel里添加自定义菜单,使用方法和前面说的在VBE里添加菜单是类似的。虽然现在已经有了Ribbon菜单,已经不大建议使用下拉式的菜单了,但是这个功能还是被保留了...

    63a8e4a23e86e314b9f88f96c3737b05.png

    在2003版本之前的Excel里使用过VBA的话,应该接触过在Excel里添加自定义菜单,使用方法和前面说的在VBE里添加菜单是类似的。

    虽然现在已经有了Ribbon菜单,已经不大建议使用下拉式的菜单了,但是这个功能还是被保留了的,测试一下:

    Sub TestExcelCMDB()    Dim cmdb As CommandBarControl        Application.CommandBars("Worksheet Menu Bar").Reset       Set cmdb = Application.CommandBars("Worksheet Menu Bar").Controls.Add(msoControlPopup, Temporary:=True)    cmdb.Caption = "测试Excel下拉菜单"        Dim btn As CommandBarButton        Set btn = cmdb.Controls.Add(msoControlButton)    btn.Caption = "测试"    btn.OnAction = "TestOnAction"End SubSub TestOnAction()    MsgBox "TestOnAction"End Sub

    d6b231eecb53247b5725eb7c025ebf9e.png

    点击“测试”,执行TestOnAction

    同样的方法,我们在VBE里使用:

    Sub TestAdd()    Dim cmd As CommandBarControl        Application.VBE.CommandBars(1).Reset    Set cmd = Application.VBE.CommandBars(1).Controls.Add(msoControlPopup)    cmd.Caption = "测试"        Dim btn As CommandBarButton    Set btn = cmd.Controls.Add    btn.Caption = "测试按钮"    btn.OnAction = "TestOnAction"End SubSub TestOnAction()    MsgBox "TestOnAction"End Sub

    很可惜,没有反应!

    至于为什么,我也不知道原因,后来在网上查了相关资料后,都是要使用一个类模块进行转换,创建1个类模块,命名CCommandBar:

    Public WithEvents cmdbe As VBIDE.CommandBarEventsPrivate Sub cmdbe_Click(ByVal CommandBarControl As Object, handled As Boolean, CancelDefault As Boolean)    MsgBox 123End Sub

    在模块顶部声明:

    Private cbar As CCommandBar

    修改代码:

    Sub TestAdd()    Dim cmd As CommandBarControl        Application.VBE.CommandBars(1).Reset    Set cmd = Application.VBE.CommandBars(1).Controls.Add(msoControlPopup)    cmd.Caption = "测试"        Dim btn As CommandBarButton    Set btn = cmd.Controls.Add    btn.Caption = "测试按钮"        Set cbar = New CCommandBar    Set cbar.cmdbe = Application.VBE.Events.CommandBarEvents(btn)End Sub

    运行后再点击按钮,能够响应单击事件。

    d3e044f469b85757da4e62c8b1f2a70e.png

    展开全文
  • 我写了一个VBA宏,用来在系统菜单中,增加一个自定义菜单。我还设置了acad2004.lsp文件,用来自动加载这个。这样,每次我启动ACAD,都会出现自定义菜单,能够方便地通过菜单调用我的其它,而无须到原来的窗口中...
    我写了一个VBA宏,用来在系统菜单中,增加一个自定义菜单。我还设置了acad2004.lsp文件,用来自动加载这个宏。这样,每次我启动ACAD,都会出现自定义菜单,能够方便地通过菜单调用我的其它宏,而无须到原来的窗口中去点。
    但是,这样做了之后,“批量打印”(batchplt)程序工作不正常。打印的时候,先是没有反应,等一会儿之后,提示说“ACAD程序忙,没有反应”。我把自动加载菜单取消,又能够正常打印了。
    请教江湖各路高人,这是什么原因? 
    展开全文
  • 加载宏

    千次阅读 2014-07-28 14:58:06
    Office VBA Addin加载宏是一种使用VBA编写的程序,它通过加载设置,可以随Office程序启动而自动加载运行,是制作Excel自定义函数、Office菜单和功能区按钮、添加常用辅助功能的常用载体。 在Excel、PPT中都可以编制...
  • 加载宏(Addin)使用方法

    千次阅读 2013-05-06 10:18:53
    Office VBA Addin加载宏是一种使用VBA编写的程序,它通过加载设置,可以随Office程序启动而自动加载运行,是制作Excel自定义函数、Office菜单和功能区按钮、添加常用辅助功能的常用载体。 在Excel、PPT中都可以编制...
  • Office VBA Addin加载宏是一种使用VBA编写的程序,它通过加载设置,可以随Office程序启动而自动加载运行,是制作Excel自定义函数、Office菜单和功能区按钮、添加常用辅助功能的常用载体。 在Excel、PPT中都可以编制...
  • AutoCAD VBA

    2013-03-15 21:30:28
    本文介绍了在AutoCAD二次开发过程中,制作完整安装文件的原理...以及利用InstallShield实现用户自定义菜单加载、支持文件和路径自动安装的设计思路和流 程,为技术人员开发专业AutoCAD系统后制作安装软件提供参考和帮助
  • VBA经典入门教材锦集

    2012-04-26 16:04:19
    第二讲 录制宏 修改宏 保存宏 指定宏 自定义按钮 加载宏 3 第三讲 VBA的语法基础 7 第四讲 Range对象 8 第五讲 VBA语句(一) 12 第六讲 VBA语句(二) 15 第七讲 错误处理和代码调试 17 第八讲 工作表和工作薄对象 19 ...
  • VBA常用技巧

    2014-12-21 16:39:28
    72-3 设置工作簿作为加载宏运行 12 第6章 使用对话框 12 技巧73 使用Msgbox函数 12 73-1 显示简单的提示信息 12 73-2 定制个性化的消息框 12 73-3 获得消息框的返回值 12 73-4 在消息框中排版 12 73-5 对齐消息框中...
  • Excel VBA开发技术大全-伍远高 高清PDF

    热门讨论 2012-09-17 09:46:32
    分别介绍了Excel 2007开发平台概述、使用、Excel VBA的开发环境、VBA基础、程序控制结构、使用数组、使用过程、管理模块、处理字符串和日期、Excel对象概述、使用Application对象、使用Workbook对象、使用...
  • VBA编程技巧大全

    2013-08-05 09:03:19
    72-3 设置工作簿作为加载宏运行 165 第6章 使用对话框 167 技巧73 使用Msgbox函数 167 73-1 显示简单的提示信息 167 73-2 定制个性化的消息框 168 73-3 获得消息框的返回值 169 73-4 在消息框中排版 171 73-5 对齐...
  • 分别介绍了Excel 2007开发平台概述、使用、Excel VBA的开发环境、VBA基础、程序控制结构、使用数组、使用过程、管理模块、处理字符串和日期、Excel对象概述、使用Application对象、使用Workbook对象、使用...
  • 中文版Excel.2007高级VBA编程宝典 1/2

    热门讨论 2012-04-06 16:00:16
     10.10 使用加载宏存储自定义的函数  10.11 使用Windows API  10.11.1 Windows API示例  10.11.2 确定Windows目录  10.11.3 检测Shift键  10.11.4 了解更多有关API 函数的信息  第11章 VBA编程示例和技巧  ...
  • 中文版Excel.2007高级VBA编程宝典 2/2

    热门讨论 2012-04-06 16:41:38
     10.10 使用加载宏存储自定义的函数  10.11 使用Windows API  10.11.1 Windows API示例  10.11.2 确定Windows目录  10.11.3 检测Shift键  10.11.4 了解更多有关API 函数的信息  第11章 VBA编程示例和技巧  ...
  • 同时还搭配窗体与控件、正则表达式、字典、FileSystemObject、API、类模块、脚本语言的应用,以及开发功能区、开发加载宏、封装代码等高级应用,力求完整地展示了VBA的功能与魅力。通读本书,您不仅能学到如何开发...
  • Excel VBA实用技巧大全 附书源码

    热门讨论 2010-10-08 18:59:24
    02026将工作簿设定为加载宏工作簿或解除加载宏 02027设定工作簿的文档属性信息 02028通过指定文件名打开工作簿 02029通过指定索引打开工作簿 02030通过对话框打开工作簿(之一) 02031通过对话框打开工作簿(之二) ...
  • 第十七步:把MyCustomUI.xlsm工作薄另存为加载宏工作薄,保存类型选择“Excel 加载宏(*.xlam),保存在“EXCEL2010选项卡安装与卸载”文夹里,文件名不变 第十八步:新建一个新的工作薄,保存在“EXCEL2010选项卡安装...
  • EXCEL实现聚光灯效果

    2020-10-19 20:54:20
    vba的方式需要熟悉excel,包括调出开发工具、打开编辑框、复制效果代码、制作加载宏、实验效果。 一、excel调出开发工具(所有步骤均可百度) 菜单--文件--选项--自定义功能区--勾选开发工具--菜单栏已经调出 二...
  • ArcGIS与VB的联合开发

    2011-11-30 13:05:46
    1. ArcMap的定制与开发 A、 单击Tools—>Customizes…命令,打开定制对话框后,可以对ARCMAP 中的工具条,菜单项,进行定制,可以加载用户自定义VBA程序、 DLL命令等。 ......
  • 《CAD地形图常用实用工具...由 MyCADPopWin.exe 程序的Win状态栏菜单“在CAD中增加或更新自定义按钮”功能进行加载。 注:工具栏按钮运行时,MyCADPopWin.exe /T 必须在状态栏运行,不能关闭,否则工具条不能使用。
  • 《CAD地形图常用实用工具...由 MyCADPopWin.exe 程序的Win状态栏菜单“在CAD中增加或更新自定义按钮”功能进行加载。 注:工具栏按钮运行时,MyCADPopWin.exe /T 必须在状态栏运行,不能关闭,否则工具条不能使用。
  • Excel百宝箱V7.1安装版

    2010-01-11 13:55:47
    Excel百宝箱 V7.1 安装版_包括61个菜单功能和25个自定义函数[table][tr][td]Excel百宝箱7.0是利用VBA(Visual Basic for Applications)语言编写的增强型插件。它包括61个菜单功能和25个自定义函数,集86个工具于一...
  • 18、用VBA自定义菜单中如何仿EXCEL的菜单做白色横线? 30 19、如何去掉单元格中间两个以上的空格? 30 20、打印表头? 31 七、Excel鲜为人知的35招秘技 31 1、建立分类下拉列表填充项 31 2、建立“常用文档”新...
  • Excel百宝箱9.0

    2011-11-04 15:46:25
     对于无法安装的朋友请注意以下5点 : 一:必须是完整版OFFICE,不能是绿色版、精简版,它们不支持COM加载宏 二:必须关闭Excel状态下安装或者删除工具,安装后重启Excel即可 三:如果是VISTA或WIN 7,必须以管理...
  • 一:必须是完整版OFFICE,不能是绿色版、精简版,它们不支持COM加载宏. 二:必须关闭Excel状态下安装或者删除工具,安装后重启Excel即可. 三:如果是VISTA或WIN 7,必须以管理员用户安装,且从控制面板中关掉...
  • 上网查过发现用xml可以解决,但那东西没用过,不太清楚,决定用vba解决,几经试验,终于成功了,成功的添加了一个工具栏按钮,位置在加载项-自定义工具栏中。这时把那两个文件删掉,安全性调高,启动很快,而且还...

空空如也

空空如也

1 2 3 4 5
收藏数 83
精华内容 33
关键字:

vba自定义菜单加载宏