在开发VBA程序中,我们可能会需要用代码处理VBA工程,包括启用VBA工程访问,启用所有宏,动态插入代码,动态删除代码,动态添加引用和自动创建模块等等,本次的分享内容便以这些为主。

启用VBA工程访问

Dim oWshell As Object
Set oWshell = CreateObject("WScript.Shell")
oWshell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application.Version & "\Excel\Security\AccessVBOM", , "REG_DWORD"
'将第二个参数改为0就是关闭

启用所有宏

Dim WScr As Object
Set WScr = CreateObject("WScript.Shell")
WScr.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Office\" & Application.Version & "\Excel\Security\VBAWarnings", "", "REG_DWORD"
'将第二个参数改为0就是关闭

在工作表插入按钮并写入单击事件

Dim sCode, objBtn
With ActiveSheet
 For Each obj In .OLEObjects
obj.Delete
Next obj
Set objBtn = .OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False, Left:=, Top:=, Width:=, Height:=)
End With
sCode = "' *** Code Added By VBA ***" & vbCrLf & "Private Sub " & objBtn.Name & "_Click()" & vbCrLf & " MsgBox ""Hello""" & vbCrLf & "End Sub" & vbCrLf
With ActiveWorkbook.VBProject.VBComponents("Sheet1").CodeModule
NextLine = .CountOfLines +
.InsertLines NextLine, sCode
End With

删除某个过程

Dim CodeInd As Long
Dim sNo, eNo, bFlag
Const PROC_NAME = "PRIVATE SUB WORKSHEET_CHANGE(BYVAL TARGET AS RANGE)"
bFlag = False
With ThisWorkbook.VBProject.VBComponents("Sheet1").CodeModule
For CodeInd = .CountOfDeclarationLines + To .CountOfLines
Select Case VBA.UCase$(Trim(.Lines(CodeInd, )))
Case PROC_NAME
bFlag = True
sNo = CodeInd
Case "END SUB"
If bFlag Then
eNo = CodeInd
Exit For
End If
End Select
Next CodeInd
' 逐行倒序删除
'For i = eNo To sNo Step -1
' .DeleteLines i
'Next
' 一次性删除整个过程代码
.DeleteLines sNo, eNo - sNo +
End With

输出VBA工程的所有引用

On Error Resume Next
For n = To ThisWorkbook.VBProject.References.Count
Cells(n, ) = ThisWorkbook.VBProject.References.Item(n).Name
Cells(n, ) = ThisWorkbook.VBProject.References.Item(n).Description
Cells(n, ) = ThisWorkbook.VBProject.References.Item(n).GUID
Cells(n, ) = ThisWorkbook.VBProject.References.Item(n).Major
Cells(n, ) = ThisWorkbook.VBProject.References.Item(n).Minor
Cells(n, ) = ThisWorkbook.VBProject.References.Item(n).fullpath
Next n

 删除VBA工程的所有引用

On Error Resume Next
Dim theRef As Variant
For I = ThisWorkbook.VBProject.References.Count To Step -
Set theRef = ThisWorkbook.VBProject.References.Item(I)
If theRef.isbroken = True Then
ThisWorkbook.VBProject.References.Remove theRef
End If
Next I

添加VBA工程引用

Dim RefItem(, ) As Variant

RefItem(, ) = "{000204EF-0000-0000-C000-000000000046}"
RefItem(, ) =
RefItem(, ) = RefItem(, ) = "{00020813-0000-0000-C000-000000000046}"
RefItem(, ) =
RefItem(, ) = RefItem(, ) = "{00020430-0000-0000-C000-000000000046}"
RefItem(, ) =
RefItem(, ) = RefItem(, ) = "{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}"
RefItem(, ) =
RefItem(, ) = RefItem(, ) = "{00000205-0000-0010-8000-00AA006D2EA4}"
RefItem(, ) =
RefItem(, ) = RefItem(, ) = "{0D452EE1-E08F-101A-852E-02608C4D0BB4}"
RefItem(, ) =
RefItem(, ) = On Error Resume Next
For I = To
ThisWorkbook.VBProject.References.AddFromGuid GUID:=RefItem(I, ), Major:=RefItem(I, ), Minor:=RefItem(I, )
Select Case Err.Number
Case Is =
'引用已经加载,无需做任何事情
Case Is = vbNullString
'成功加载
Case Else
'加载出现错误,保存错误信息
errmsg = errmsg & RefItem(I, ) & "出现错误错误"
End Select
Next I
If errmsg <> "" Then
MsgBox errmsg
End If

创建模块并写入过程

Application.ScreenUpdating = False
For i = To ThisWorkbook.VBProject.VBComponents.Count
If ThisWorkbook.VBProject.VBComponents(i).Name = "auto_code" Then
ThisWorkbook.VBProject.VBComponents.Remove ThisWorkbook.VBProject.VBComponents(i)
End If
Next
ThisWorkbook.VBProject.VBComponents.Add().Name = "auto_code"
ThisWorkbook.VBProject.VBComponents("auto_code").CodeModule.InsertLines , "Sub test()"
ThisWorkbook.VBProject.VBComponents("auto_code").CodeModule.InsertLines , "Msgbox""hello world!"""
ThisWorkbook.VBProject.VBComponents("auto_code").CodeModule.InsertLines , "end sub"
Application.OnTime Now + TimeValue("00:00:01"), "test"
Application.ScreenUpdating = True

VBA精彩代码分享-3的更多相关文章

  1. VBA精彩代码分享-1

    今天下班前分享一下之前在网上搜到的两段好用的VBA代码,貌似都来自国外,觉得挺好,模仿不来. 第一段的功能是修改VBA控件中的文本框控件,使其右键可以选择粘贴.复制.剪切等: Option Expli ...

  2. VBA精彩代码分享-4

    VBA设置/取消工作簿共享是很常用的一个功能,那么如何用代码实现呢? 设置共享 Then MsgBox "文件没有保存" Exit Sub End If Application.D ...

  3. VBA精彩代码分享-2

    VBA开发中经常需要提示消息框,如果不关闭程序就会暂时中断,这里分享下VBA如何实现消息框的自动关闭,总共有三种方法: 第一种方法 Public Declare Function MsgBoxTime ...

  4. JAVA基础代码分享--求圆面积

    问题描述 用户输入圆的半径,计算并显示圆的面积 代码分享 /** * @author hpu-gs * 2015/11/25 */ public class Circle { public stati ...

  5. JAVA基础代码分享--DVD管理

    问题描述 为某音像店开发一个迷你DVD管理器,最多可存6张DVD,实现碟片的管理. 管理器具备的功能主要有: 1.查看DVD信息. 菜单选择查看功能,展示DVD的信息. 2.新增DVD信息 选择新增功 ...

  6. JAVA基础代码分享--学生成绩管理

    问题描述: 从键盘读入学生成绩,找出最高分,并输出学生成绩等级. 成绩>=最高分-10  等级为’A’   成绩>=最高分-20  等级为’B’ 成绩>=最高分-30  等级为’C’ ...

  7. jQuery插件库代码分享 - 进阶者系列 - 学习者系列文章

    这些天将原来在网上找的jQuery插件进行了下整理,特此将代码分享出来给大家. 见下图结构. 对目录结构进行了分类.这里是插件列表. 这里总共收集了20来个插件.还有下面未进行划分的. 下面是DEMO ...

  8. .net之工作流工程展示及代码分享(四)主控制类

    现在应该讲主控制类了,为了不把系统弄得太复杂,所以就用一个类作为主要控制类(服务类),作为前端.后端.业务逻辑的控制类. WorkflowService类的类图如下: 该类的构造函数: public ...

  9. .net之工作流工程展示及代码分享(三)数据存储引擎

    数据存储引擎是本项目里比较有特色的模块. 特色一,使用接口来对应不同的数据库.数据库可以是Oracle.Sqlserver.MogoDB.甚至是XML文件.采用接口进行对应: public inter ...

随机推荐

  1. ArcGIS超级工具SPTOOLS-影像的批量裁剪和批量合并

    1.1  影像批量裁剪 操作视频: https://weibo.com/tv/v/Hw25XqOL4?fid=1034:4376345233306897 影像批量裁剪:一个影像(可以多波段,也可以单波 ...

  2. Async and Await (Stephen Cleary)

    https://blog.stephencleary.com/2012/02/async-and-await.html Most people have already heard about the ...

  3. C#问答题与附解收集(三)

    post.get的区别 答: GET把参数包含在URL中,POST通过request body传递参数.GET请求在URL中传送的参数是有长度限制的,而POST没有.使用post提交的页面在点击[刷新 ...

  4. spring data jpa实现多条件查询(分页和不分页)

    目前的spring data jpa已经帮我们干了CRUD的大部分活了,但如果有些活它干不了(CrudRepository接口中没定义),那么只能由我们自己干了.这里要说的就是在它的框架里,如何实现自 ...

  5. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_18-CMS前端页面查询开发-页面原型-创建页面和定义路由

    module下创建cms目录,里面存cms模块相关的页面 在cms下创建api和components目录,components下放的就是组件. 这个组件刚才介绍的base的下的组件不一样.base下的 ...

  6. yum命令配置及使用说明和常见问题处理

    一. 重装yum 1. 执行如下命令,卸载yum命令程序 rpm -qa |grep yum |xargs rpm -e --nodeps 2. 依次执行如下命令,下载yum.yum-plugin-f ...

  7. iOS实现TextField光标居中

    // // MyTextField.m // DriverEpoch // // Created by 思 彭 on 2017/10/12. // Copyright © 2017年 http://h ...

  8. 读写Session

    读写Session Session是保存在服务端的字典 Session与Cookie有些类似,都是通过字典管理key-value对,只不过Cookie是保存在客户端的字典,而Session是保存在服务 ...

  9. jenkins容器内修改root密码--ubuntu系统

    http://www.voidcn.com/article/p-yvnoogkc-ng.html 由于jenkins官方镜像是ubuntu系统,所有啥的都用 sudo 换到root账号,然后登陆har ...

  10. jQuery.fn.extend与jQuery.extend的区别

    jquery 本身并不提供 jQuery.color() 这个方法,如果我们需要对jQuery本身提供的方法进行扩展,则我们就需要是用jQuery.fn.extend: jQuery.fn.exten ...