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

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

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

有了前面的功能分析基础,使用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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
看完即可上手 MyBatis-Plus
MyBatis 是当前 Java 项目中使用非常常用的持久层框架,而 MyBatis-Plus 是 MyBatis 非常好的伴侣。MyBatis-Plus 的官网是 https://mp.baomidou.com/ 。其官网对于 MyBatis-Plus 的简介如下:
码农UP2U
2021/09/23
1.2K0
mybatis-plus超详细讲解[通俗易懂]
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
全栈程序员站长
2022/08/22
1.3K0
mybatis-plus超详细讲解[通俗易懂]
Mybatis-Plus使用案例(包括初始化以及常用插件)
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高
ha_lydms
2023/08/09
1.3K0
Mybatis-Plus使用案例(包括初始化以及常用插件)
进阶!MyBatis-Plus(基于 Springboot 演示)
这一篇从一个入门的基本体验介绍,再到对于 CRUD 的一个详细介绍,在介绍过程中将涉及到的一些问题,例如逐渐策略,自动填充,乐观锁等内容说了一下,只选了一些重要的内容,还有一些没提及到,具体可以参考官网,简单的看完,其实会发现,如果遇到单表的 CRUD ,直接用 MP 肯定舒服,如果写多表,还是用 Mybatis 多点,毕竟直接写 SQL 会直观一点,MP 给我的感觉,就是方法封装了很多,还有一些算比较是用的插件,但是可读性会稍微差一点,不过个人有个人的看法哇
BWH_Steven
2020/10/10
7250
​MyBatis-plus 从入门到入土
MyBatis-plus 是一款 Mybatis 增强工具,用于简化开发,提高效率。下文使用缩写 mp 来简化表示 MyBatis-plus,本文主要介绍 mp 搭配 Spring Boot 的使用。
Java旅途
2021/06/08
1.8K0
SpringBoot整合MyBatis-Plus实现分页,代码生成,锁等实例
Mybatis-Plus是一款专门针对于传统MyBatis开发中sql需要手动进行映射配置繁琐缺点的一款框架技术,这款框架技术提供了十分丰富的api供开发者们使用,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
用户7353950
2022/06/23
1.9K0
SpringBoot整合MyBatis-Plus实现分页,代码生成,锁等实例
MyBatis-Plus
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
小简
2023/01/30
2.1K0
mybatis逻辑删除[通俗易懂]
github地址https://github.com/heng1234/mybatis_plus
全栈程序员站长
2022/09/05
1K0
MyBatisPlus一文通关
话不多说,我们先来看一张简单的思维导图,了解一下 MP 的主要核心功能,脑图在手,思路我有,开干🤔!
程序员Leo
2023/09/09
6770
MyBatisPlus一文通关
【为高效开发而生】MyBatisPlus破冰行动
  然后我们需要在application.properties中配置数据源的相关信息
用户4919348
2022/05/10
6580
【为高效开发而生】MyBatisPlus破冰行动
认识MyBatis的好兄弟 MyBatis - Plus
我们先通过一个简单的Demo 来认识一下 MyBatis - Plus 的搭建和用法:
cxuan
2019/09/17
9080
MyBatis-Plus(实用篇)
创建MyMetaObjectHandler配置类,实现MetaObjectHandler接口
Java微观世界
2025/01/21
8730
MyBatis-Plus(实用篇)
MyBatis-Plus之BaseMapper
我们先来查看下 BaseMapper 接口中方法有哪些?(大家也可以查看自己调用的mapper里面方法是一样的 我贴出来是为了方便大家查看)
默 语
2024/11/20
1770
MyBatis-Plus之BaseMapper
学习了MyBatis-Plus你还会用MyBatis嘛
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
陶然同学
2023/02/27
5910
学习了MyBatis-Plus你还会用MyBatis嘛
MyBatis-Plus的使用
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。这是官方给的定义,关于mybatis-plus的更多介绍及特性,可以参考mybatis-plus官网。那么它是怎么增强的呢?其实就是它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行,就类似于JPA。
后端码匠
2020/11/06
6830
MyBatis-Plus的使用
MyBatis-Plus 之分页查询
@MapperScan(basePackages = "com.kaven.mybatisplus.dao")这个一定要加上。
全栈程序员站长
2022/09/05
1.4K0
MyBatis-Plus 之分页查询
MyBatis Plus 讲解
如果你每天还在重复写CRUD的SQL,如果你对这些SQL已经不耐烦了,那么你何不花费一些时间来阅读这篇文章,然后对已有的老项目进行改造,必有收获!
jwangkun
2021/12/23
1.2K0
MyBatis Plus 讲解
Mybatis-plus初体验
创建一个新项目,总会有引入依赖的问题,特此记录最新mybatis_plus的常用用法,以便以后快速创建项目。
猫老师的叶同学
2023/03/01
3570
Mybatis-plus初体验
MybatisPlus
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 官网: https://mybatis.plus/ 或 https://mp.baomidou.com/
JokerDJ
2023/11/27
7120
MybatisPlus
【Spring】SpringBoot整合MybatisPlus的基本应用
想要更多的了解MybatisPlus,可以到官网去看一下 MyBatis-Plus (baomidou.com)
哈__
2024/04/08
1K0
【Spring】SpringBoot整合MybatisPlus的基本应用
相关推荐
看完即可上手 MyBatis-Plus
更多 >
交个朋友
加入HAI高性能应用服务器交流群
探索HAI应用新境界 共享实践心得
加入[游戏服务器] 腾讯云官方交流站
游戏服运维小技巧 常见问题齐排查
加入架构与运维学习入门群
系统架构设计入门 运维体系构建指南
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验