在开发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. 使用 pip wheel 实现 Python 依赖包的离线安装

    pip python 依赖 安装 有时候, 需要部署 Python 应用的服务器没有网络连接, 这时候, 你就要把整个 Python 应用做成离线安装包. 借助 wheel, 很容易就可以实现. 首先 ...

  2. VGG Net学习笔记

    一.简介 VGG Net由牛津大学的视觉几何组(Visual Geometry Group)和 Google DeepMind公司的研究员一起研发的的深度卷积神经网络,在 ILSVRC 2014 上取 ...

  3. JAVA的main方法

    在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方 法有很大的不同,比如方法的名字必须是main,方法必须 ...

  4. Sql中truncate,delete以及drop的比较

    相同点: 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 2.drop.truncate都是DDL语句(数据定义语言),执行后会自动提交. 不同点: 1. t ...

  5. 移动端—— 兼容PC端,移动端的点击事件

    移动设备上不支持鼠标事件,好在webkit内核的移动浏览器支持 touch 事件,所以触摸事件是移动应用中所必须的.touchstart.touchmove.touchend事件可以类比于moused ...

  6. CameraLink标准学习

     CameraLink标准学习

  7. go协程理解

    一.Golang 线程和协程的区别 备注:需要区分进程.线程(内核级线程).协程(用户级线程)三个概念. 进程.线程 和 协程 之间概念的区别 对于 进程.线程,都是有内核进行调度,有 CPU 时间片 ...

  8. SpringBoot学习之一 Unable to find a single main class from the following candidates

    在启动SpringBoot项目是报错 Unable to find a single main class from the following candidates [boot.myboot.Sam ...

  9. 怎样获取java新IO的Path文件大小

    import org.junit.Test; import java.io.IOException; import java.nio.file.Files; import java.nio.file. ...

  10. centos7 vim环境优化

    centos7默认是使用vi,而不是使用vim,所以,我们需要修改一下vi的别名,并且,我们使用neovim,vi毕竟还是有很多功能比较原始 所以 yum install neovim -ycat & ...