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

启用VBA工程访问

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

启用所有宏

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

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

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

删除某个过程

  1. Dim CodeInd As Long
  2. Dim sNo, eNo, bFlag
  3. Const PROC_NAME = "PRIVATE SUB WORKSHEET_CHANGE(BYVAL TARGET AS RANGE)"
  4. bFlag = False
  5. With ThisWorkbook.VBProject.VBComponents("Sheet1").CodeModule
  6. For CodeInd = .CountOfDeclarationLines + To .CountOfLines
  7. Select Case VBA.UCase$(Trim(.Lines(CodeInd, )))
  8. Case PROC_NAME
  9. bFlag = True
  10. sNo = CodeInd
  11. Case "END SUB"
  12. If bFlag Then
  13. eNo = CodeInd
  14. Exit For
  15. End If
  16. End Select
  17. Next CodeInd
  18. ' 逐行倒序删除
  19. 'For i = eNo To sNo Step -1
  20. ' .DeleteLines i
  21. 'Next
  22. ' 一次性删除整个过程代码
  23. .DeleteLines sNo, eNo - sNo +
  24. End With

输出VBA工程的所有引用

  1. On Error Resume Next
  2. For n = To ThisWorkbook.VBProject.References.Count
  3. Cells(n, ) = ThisWorkbook.VBProject.References.Item(n).Name
  4. Cells(n, ) = ThisWorkbook.VBProject.References.Item(n).Description
  5. Cells(n, ) = ThisWorkbook.VBProject.References.Item(n).GUID
  6. Cells(n, ) = ThisWorkbook.VBProject.References.Item(n).Major
  7. Cells(n, ) = ThisWorkbook.VBProject.References.Item(n).Minor
  8. Cells(n, ) = ThisWorkbook.VBProject.References.Item(n).fullpath
  9. Next n

 删除VBA工程的所有引用

  1. On Error Resume Next
  2. Dim theRef As Variant
  3. For I = ThisWorkbook.VBProject.References.Count To Step -
  4. Set theRef = ThisWorkbook.VBProject.References.Item(I)
  5. If theRef.isbroken = True Then
  6. ThisWorkbook.VBProject.References.Remove theRef
  7. End If
  8. Next I

添加VBA工程引用

  1. Dim RefItem(, ) As Variant
  2.  
  3. RefItem(, ) = "{000204EF-0000-0000-C000-000000000046}"
  4. RefItem(, ) =
  5. RefItem(, ) =
  6.  
  7. RefItem(, ) = "{00020813-0000-0000-C000-000000000046}"
  8. RefItem(, ) =
  9. RefItem(, ) =
  10.  
  11. RefItem(, ) = "{00020430-0000-0000-C000-000000000046}"
  12. RefItem(, ) =
  13. RefItem(, ) =
  14.  
  15. RefItem(, ) = "{2DF8D04C-5BFA-101B-BDE5-00AA0044DE52}"
  16. RefItem(, ) =
  17. RefItem(, ) =
  18.  
  19. RefItem(, ) = "{00000205-0000-0010-8000-00AA006D2EA4}"
  20. RefItem(, ) =
  21. RefItem(, ) =
  22.  
  23. RefItem(, ) = "{0D452EE1-E08F-101A-852E-02608C4D0BB4}"
  24. RefItem(, ) =
  25. RefItem(, ) =
  26.  
  27. On Error Resume Next
  28. For I = To
  29. ThisWorkbook.VBProject.References.AddFromGuid GUID:=RefItem(I, ), Major:=RefItem(I, ), Minor:=RefItem(I, )
  30. Select Case Err.Number
  31. Case Is =
  32. '引用已经加载,无需做任何事情
  33. Case Is = vbNullString
  34. '成功加载
  35. Case Else
  36. '加载出现错误,保存错误信息
  37. errmsg = errmsg & RefItem(I, ) & "出现错误错误"
  38. End Select
  39. Next I
  40. If errmsg <> "" Then
  41. MsgBox errmsg
  42. End If

创建模块并写入过程

  1. Application.ScreenUpdating = False
  2. For i = To ThisWorkbook.VBProject.VBComponents.Count
  3. If ThisWorkbook.VBProject.VBComponents(i).Name = "auto_code" Then
  4. ThisWorkbook.VBProject.VBComponents.Remove ThisWorkbook.VBProject.VBComponents(i)
  5. End If
  6. Next
  7. ThisWorkbook.VBProject.VBComponents.Add().Name = "auto_code"
  8. ThisWorkbook.VBProject.VBComponents("auto_code").CodeModule.InsertLines , "Sub test()"
  9. ThisWorkbook.VBProject.VBComponents("auto_code").CodeModule.InsertLines , "Msgbox""hello world!"""
  10. ThisWorkbook.VBProject.VBComponents("auto_code").CodeModule.InsertLines , "end sub"
  11. Application.OnTime Now + TimeValue("00:00:01"), "test"
  12. 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. SQLyog Enterprise Trial 试用期问题

    SQLyog Enterprise Trial 是 SQLyog的试用版,有效期30天:试用期过后提示购买之后才能使用:解决办法:修改注册表(过期就得改比较麻烦,但暂时可以用,等有时间了再找其他办法) ...

  2. Linux嵌入式学习过程(转载)

    嵌入式专业是一门实践性非常强的学科,只有多动手,多实践,多编程,多调试,多看书,多思考才能真正掌握好嵌入式开发技术.那么,如何从零开始学习嵌入式开发技术, 进入嵌入式开发大门呢,笔者根据自己的嵌入式学 ...

  3. Eclipse添加Android library 错误的原因

    这两天把项目从本地转移到GIT上,本来我的Workspace是在D盘,现在因为感觉D盘不够用,就把GIT到的项目放到E盘了 按照以往的用法,GIT下来以后再往属性里添加依赖库就OK了,但是这次怎么也无 ...

  4. Qt编写自定义控件30-颜色多态按钮

    一.前言 这个控件一开始打算用样式表来实现,经过初步的探索,后面发现还是不够智能以及不能完全满足需求,比如要在此控件设置多个角标,这个用QSS就很难实现,后面才慢慢研究用QPainter来绘制,我记得 ...

  5. 使用Android Studio时你应该知道的一切配置和使用Genymotion模拟器运行程序

    参考博客: 配置Android Studio: http://www.cnblogs.com/wi100sh/p/5653427.html Android Studio打包APK: http://bl ...

  6. iframe高度自适应方法

    <iframe width="100%" id="tbbrecommend" name="tbbrecommend" src=&quo ...

  7. 解决Python-OpenCV中cv2.rectangle报错

    在PyTorch中测试DataLoader读取后的图像,对图像画框cv2.rectangle时报错: TypeError: Layout of the output array img is inco ...

  8. 神经网络(NN)实现多分类-----Keras实现

    IRIS数据集介绍   IRIS数据集(鸢尾花数据集),是一个经典的机器学习数据集,适合作为多分类问题的测试数据,它的下载地址为:http://archive.ics.uci.edu/ml/machi ...

  9. HDU 1087 最大递增子序列

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  10. SNIPER-MXNet中出现ValueError: could not broadcast input array from shape (XXX,5) into shape (100,5)

    这是关于标签数量的问题,搜索"100," ,其中与读标签框有关,或者与标签匹配有关的,全部改到大于“图片中最多有的标签数量”即可.