首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MyVBA加载宏——添加自定义菜单04——功能实现

MyVBA加载宏——添加自定义菜单04——功能实现

作者头像
xyj
发布于 2020-07-28 06:30:23
发布于 2020-07-28 06:30:23
1.6K00
代码可运行
举报
文章被收录于专栏:VBA 学习VBA 学习
运行总次数:0
代码可运行

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

功能实现

01

类模块功能

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

  • 根据单击的按钮的名称,读取对应名称的txt文件
  • 将读取到的文本插入到VBE中

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

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

在这里使用FSO来读取。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 = Nothing
End Function

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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_code
End Function

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Public WithEvents cmdbe As VBIDE.CommandBarEvents

Private 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.Description
End Sub

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

02

添加菜单的功能

添加菜单和按钮的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

'记录所有需要执行单击事件的菜单按钮
Private cbars As Collection

Private Type CommandBarInfo
    mso As Long     '菜单类型
    Caption As String  '名称
    FaceId As Long  '图标
    Flag As Long    '记录是否是弹出式菜单
End Type

Sub AddCommanBar()
    If Not CheckVbproject Then
        Exit Sub
    End If
    
    Set cbars = New Collection
    add_bar
End Sub

Function 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 = Nothing
End Function

Function 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 If
End Function

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

03

自动更新

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Private Sub Workbook_Open()
    Call AddCommanBar
End Sub

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 VBA 学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MyVBA加载宏——添加自定义菜单03——功能分析
要自动更新是比较简单的,只要在加载宏打开的时候,执行一次添加菜单的功能即可,所以,需要在加载宏的Thisworkbook模块添加代码:
xyj
2020/07/28
1.1K0
MyVBA加载宏——添加自定义菜单03——功能分析
MyVBA加载宏——添加自定义菜单01
前面创建的MyVBA加载宏,设置成了启动就打开的加载宏,只有一个打开宏文件的功能:
xyj
2020/07/28
1.6K0
MyVBA加载宏——添加自定义菜单01
VBA通用代码:自定义右键菜单
在《VBA通用代码:在Excel中创建弹出菜单》中,我们给出了一段在工作表中创建弹出菜单的代码,将给代码指定快捷键,这样通过按快捷键可以在工作表调用弹出菜单,从而执行其中的命令。
fanjy
2022/11/16
1.8K0
VBA通用代码:自定义右键菜单
创建MyVBA加载宏
MyVBA加载宏主要功能是设置为自动加载,作为打开其他宏文件的一个程序,做好后大概是这么一个东西:
xyj
2020/07/28
1.2K0
创建MyVBA加载宏
EXCEL 自定义菜单
Dim XXX As CommandBarPopup Dim scrap As CommandBarPopup Dim about As CommandBarControl
Tony老师
2020/03/05
5640
在Excel中自定义上下文菜单(上)
上下文菜单(也称为快捷菜单)是在一些随用户交互之后出现的菜单,通常是鼠标右键单击操作。在Microsoft Office中,上下文菜单提供了一组在应用程序的当前状态或上下文中可用的有限选项。通常,可用的选择是与选定对象(如单元格或列)相关的操作。
fanjy
2022/11/16
3.2K0
在Excel中自定义上下文菜单(上)
MyVBA加载宏——添加自定义菜单02——给按钮添加单击事件
在2003版本之前的Excel里使用过VBA的话,应该接触过在Excel里添加自定义菜单,使用方法和前面说的在VBE里添加菜单是类似的。
xyj
2020/07/28
3.2K0
MyVBA加载宏——添加自定义菜单02——给按钮添加单击事件
VBA解压缩ZIP文件03——解压准备工作
要解压缩ZIP文件,所以肯定需要读写文件的功能,为了方便,把VBA中对文件的读写功能进行一个简单的封装,方便使用。
xyj
2020/07/28
1.5K0
VBA解压缩ZIP文件03——解压准备工作
一起学Excel专业开发17:Excel工时报表与分析系统开发(2)——创建特定应用加载宏
在《一起学Excel专业开发16:使用表驱动的方法管理工作表用户接口》中,我们已经创建了表驱动的用于接口工作簿的工作表。
fanjy
2019/10/22
1.1K0
一起学Excel专业开发17:Excel工时报表与分析系统开发(2)——创建特定应用加载宏
VBA专题10-23:使用VBA操控Excel界面之添加动态菜单
在本系列后面的示例程序中,你将会看到如何使用项目和带图像的库控件通过getItemLabel和getItemImage回调属性引用的VBA过程在运行时动态地填充下拉控件。另一个允许动态填充其内容的控件是组合框控件。
fanjy
2021/03/26
6.9K0
VBA专题10-23:使用VBA操控Excel界面之添加动态菜单
一起学Excel专业开发21:Excel工时报表与分析系统开发(3)——自定义用户界面
一起学Excel专业开发20:Excel工时报表与分析系统开发(3)——自定义用户界面
fanjy
2019/11/07
2.2K0
一起学Excel专业开发21:Excel工时报表与分析系统开发(3)——自定义用户界面
VBA与数据库——合并表格
在Excel里,如果需要把多个工作表或者工作簿的数据合并到一起,用VBA来做一个程序还是比较容易的,在多个工作簿合并到一个工作簿和多个工作表合并到一个工作表里有过介绍,代码不算很复杂。
xyj
2021/09/10
5.2K2
VBA与数据库——合并表格
VBA汇总多个Excel文件数据
将某个文件夹下,所有Excel文件及子文件夹下的Excel文件内容,复制到一张汇总表。
xyj
2020/07/28
2.9K0
VBA汇总多个Excel文件数据
在Excel中自定义上下文菜单(下)
在本文开头的VBA示例中,你看到了如何通过使用工作簿的Activate和Deactivate事件调用宏来创建和删除菜单控件,从而来更改单元格上下文菜单。
fanjy
2022/11/16
3.1K0
VBE菜单——CommandBars对象
这些在VBA里也提供了相应的对象让我们去操作,这个就是CommandBars对象。
xyj
2020/07/28
2.4K0
VBE菜单——CommandBars对象
VBA通用代码:在Excel中创建弹出菜单
弹出菜单(有时也称为上下文菜单或快捷菜单)是用户界面(UI)中的菜单,提供了一组命令选项,通过某些用户操作(如鼠标右键单击)在应用程序的当前状态或上下文中可用。
fanjy
2022/06/04
4.3K0
VBA通用代码:在Excel中创建弹出菜单
VBA专题10-9:使用VBA操控Excel界面之在功能区中添加自定义按钮控件
下面的一系列文章将重点讲解如何在功能区中添加不同类型的自定义控件,它们与最底层的自定义命令相关。这里的自定义命令是指程序员自已编写的VBA过程。
fanjy
2021/01/20
5.9K0
VBA专题10-9:使用VBA操控Excel界面之在功能区中添加自定义按钮控件
自定义功能区示例:创建用于工作表导航的下拉列表
我们可以自定义功能区,在上面设置我们想要的功能,从而方便我们对工作表或工作簿的操作。本文的示例如下图1所示,在功能区中添加一个自定义的选项卡,然后再该选项卡中添加带有下拉列表的一个自定义组,用于从下拉列表中选择工作表,从而快速导航到该工作表,这对于工作簿中有大量工作表且要快速找到相应的工作表的用户来说,非常有用。
fanjy
2023/10/31
6740
自定义功能区示例:创建用于工作表导航的下拉列表
VBA代码:不同的工作表显示不同的弹出菜单
如果想要对每个工作表显示不同的菜单,或者仅在某些工作表中显示菜单,可以使用相应的代码来实现。
fanjy
2022/11/16
1.1K0
VBA实战技巧30:创建自定义的进度条1
使用VBA宏,可以自动执行重复、单调且有时非常无聊的任务。在某些情况下,这有可能将数小时的工作减少到几分钟或几秒钟。
fanjy
2021/08/31
3.9K0
VBA实战技巧30:创建自定义的进度条1
推荐阅读
相关推荐
MyVBA加载宏——添加自定义菜单03——功能分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档