VBProject:代码操作代码之常用语句

来源:互联网 发布:改装车软件 编辑:程序博客网 时间:2024/04/28 11:53
  1. --  VBProject:代码操作代码之常用语句
  2. 一、增加模块
  3. 1.增加一个模块,命名为“我的模块”
  4.   ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_StdModule).Name = "我的模块"
  5.   系统常量vbext_ct_StdModule=1
  6. 2.增加一个类模块,命名为“我的类”
  7.   ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_ClassModule).Name = "我的类"
  8.   vbext_ct_ClassModule=2
  9. 3.增加一个窗体,命名为“我的窗体”
  10.   ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm).Name = "我的窗体"
  11.   vbext_ct_MSForm=3
  12. 二、删除模块
  13. 1.删除“模块1”
  14.   ThisWorkbook.VBProject.VBComponents.Remove ThisWorkbook.VBProject.VBComponents("模块1")
  15. 2.删除窗体“UserForm1”
  16.   ThisWorkbook.VBProject.VBComponents.Remove ThisWorkbook.VBProject.VBComponents("UserForm1")
  17. 3.删除类模块“类1”
  18.   ThisWorkbook.VBProject.VBComponents.Remove ThisWorkbook.VBProject.VBComponents("类1")
  19. 4.删除所有的窗体
  20. Sub RmvForms()
  21.   Dim vbCmp As VBComponent
  22.   For Each vbCmp In ThisWorkbook.VBProject.VBComponents
  23.     If vbCmp.Type = vbext_ct_MSForm Then ThisWorkbook.VBProject.VBComponents.Remove vbCmp
  24.   Next vbCmp
  25. End Sub
  26.   相关:
  27.  工作表和ThisWorkbook的模块类型为vbext_ct_Document=100
  28. 三、增加代码
  29. 1.在“模块1”中插入代码
  30. 如果需要在“Sheet1”、“Thisworkbook”、或“Userform1”中操作,用只需将下面的“模块1”换成相应的名称即可。
  31. 方法1:
  32. 在模块的开始增加代码,增加的代码放在公共声明option,全局变量等后面。
  33. Sub AddCode1()
  34.  ThisWorkbook.VBProject.VBComponents("模块1").CodeModule.AddFromString _
  35.    "sub aTest()" & Chr(10) & _
  36.    "msgbox ""Hello""" & Chr(10) & _
  37.    "end sub"
  38. End Sub
  39. 方法2:
  40. 在模块指定行处增加代码,原代码后移。增加代码不理会和判断插入处代码的内容。当指定行大于最后一行行号时,在最后一行的后面插入。
  41. Sub AddCode2()
  42.   With ThisWorkbook.VBProject.VBComponents("模块1").CodeModule
  43.     .InsertLines 1, "sub aTest()"
  44.     .InsertLines 2, "msgbox ""Hello"""
  45.     .InsertLines 3, "end sub"
  46.   End With
  47. End Sub
  48. 相关语句:
  49. (1)“模块1”中代码总行数:
  50. ThisWorkbook.VBProject.VBComponents("模块1").CodeModule.CountOfLines
  51. (2)“模块1”中代码公共声明部分的行数:
  52. ThisWorkbook.VBProject.VBComponents("模块1").CodeModule.CountOfDeclarationLines
  53. (3)显示“模块1”中第1行起的3行代码内容:
  54. Sub ShowCodes()
  55.   Dim s$
  56.   s = ThisWorkbook.VBProject.VBComponents("模块1").CodeModule.Lines(1, 3)
  57.   Debug.Print s
  58. End Sub
  59. (4)过程aTest的起始行数:
  60. ThisWorkbook.VBProject.VBComponents("模块1").CodeModule.ProcBodyLine("aTest", vbext_pk_Proc)
  61. ThisWorkbook.VBProject.VBComponents("模块1").CodeModule.ProcStartLine("aTest", 0) 
  62. 系统常量vbext_pk_Proc=0
  63. 二者的区别是ProcBodyLine返回sub aTest或Function aTest所在的行号,如果sub前面有空行,ProcStartLine返回空行的行号。
  64. (5)过程aTest的总行数:
  65. ThisWorkbook.VBProject.VBComponents("模块1").CodeModule.ProcCountLines("aTest", vbext_pk_Proc)
  66. 2.建立事件过程
  67. 建立事件过程除了使用上面的代码如下面的AddEventsCode1外,还可以使用CreateEventProc方法,如AddEventsCode2所示。
  68. 一般方法:
  69. Sub AddEventsCode1()
  70.   ThisWorkbook.VBProject.VBComponents("ThisWorkbook").CodeModule.AddFromString _
  71.     "Private Sub Workbook_Open()" & Chr(13) & _
  72.     "MsgBox ""Hello""" & Chr(13) & _
  73.     "End Sub"
  74. End Sub
  75. CreateEventProc方法:
  76. Sub AddEventsCode2()
  77.   Dim i%
  78.   With ThisWorkbook.VBProject.VBComponents("Sheet1").CodeModule
  79.     i = .CreateEventProc("SelectionChange""Worksheet") + 1
  80.     .InsertLines i, "Msgbox ""Hello"""
  81.   End With
  82. End Sub
  83. 上面CreateEventProc的两个参数建立的事件过程为Worksheet_SelectionChange,分别是下划线两边的内容。
  84. 相关:
  85. 测试是否存在SelectionChange事件
  86. 下面函数测试模块modulname是否存在过程subname,如果存在,则返回起始行号,否则返回0。
  87. debug.print hassub("Worksheet_SelectionChange","Sheet1")
  88. Function HasSub(ByVal subname As String, ByVal modulname As String) As Long
  89.   On Error Resume Next
  90.   Dim i
  91.   i = ThisWorkbook.VBProject.VBComponents(modulname).CodeModule.ProcBodyLine(subname, 0)
  92.   If Err.Number = 35 Then
  93.     Err.Clear
  94.     HasSub = 0
  95.   Else
  96.     HasSub = i
  97.   End If
  98. End Function
  99. 如果存在,则返回起始行号,否则返回0。
  100. 四、删除代码
  101. 1.删除Sheet1中第2行起的三行代码:
  102. 如果只删除1行代码,第二个参数可省略。
  103. Sub DelCodes()
  104.  ThisWorkbook.VBProject.VBComponents("Sheet1").CodeModule.DeleteLines 2, 3
  105. End Sub
  106. 2.删除“模块1”的所有代码:
  107. Sub DelCodes()
  108.  With ThisWorkbook.VBProject.VBComponents("模块1").CodeModule
  109.    .DeleteLines 1, .CountOfLines
  110.  End With
  111. End Sub
  112. 3.删除过程aTest:
  113. Sub DelCodes()
  114.   With ThisWorkbook.VBProject.VBComponents("模块1").CodeModule
  115.    .DeleteLines .ProcStartLine("aTest", 0), .ProcCountLines("aTest", 0)
  116.   End With
  117. End Sub
  118. 4.将“模块1”的第5行代码替换为“x=3”
  119.  ThisWorkbook.VBProject.VBComponents("模块1").CodeModule.ReplaceLine 5, "x=3"
  120. 五、引用项目
  121. 1.增加引用
  122.   ThisWorkbook.VBProject.References.AddFromFile "C://Windows//System32//asctrls.ocx"
  123. 2.取消引用
  124.   ThisWorkbook.VBProject.References.Remove ThisWorkbook.VBProject.References("ASControls")
  125. 这里ASControls是引用的名字,即后面的rf.Name。
  126. 3.显示当前所有引用
  127. Sub ShowRefs()
  128.   Dim rf As VBIDE.Reference
  129.   For Each rf In ThisWorkbook.VBProject.References
  130.     Debug.Print rf.Name, rf.FullPath
  131.   Next
  132. End Sub
  133. 六、信任及密码
  134. 上面所有操作都基于这样的前题:
  135. (1)EXCEL已设置:
  136. 工具(T)-宏(M)-安全性(M)-可靠发行商(T)-勾选了“信任对于VB项目的访问(V)”
  137. (2)工程没有设置密码
  138. 如果不能满足它们中的任何一个,代码运行就会出错。因为微软不希望我们对VBProject进行操作,我们无从知道这种操作的直接方法被藏到了什么地方。幸运的是,微软在关起正门的同时,还是为我们留了一道门:SendKeys。借助于这道后门和“错误陷阱”,我们仍可以完成我们所要做的事。
  139. 下面给出绕开这两道门的示意代码,如果你要运行它们,请记得切回EXCEL主界面,而不是在VBE中直接运行。
  140. 1.信任对于VB项目的访问
  141. Sub SetAllowableVbe()
  142.   On Error Resume Next
  143.   Dim Chgset As Boolean
  144.   /'陷阱测试,VBProject.Protection在这儿并无实际的意义
  145.   Debug.Print ThisWorkbook.VBProject.Protection
  146.   If Err.Number = 1004 Then
  147.     Err.Clear
  148.     Application.SendKeys "%TMS%T%V{ENTER}"
  149.     Chgset = True
  150.     DoEvents
  151.   End If
  152.   /'要执行的操作....
  153.   /'.....
  154.   /'操作完成后还原操作前的状态
  155.   If Chgset Then Application.SendKeys "%TMS%T%V{ENTER}"
  156. End Sub
  157. 2.操作密码工程
  158. Sub AllowPass()
  159.   Dim pw$
  160.   pw = "Password"
  161.   If ThisWorkbook.VBProject.Protection = vbext_pp_locked Then
  162.     Application.VBE.CommandBars(1).Controls("工具(T)").Controls("VBAProject 属性(&E)...").Execute
  163.     Application.SendKeys pw & "{ENTER}{ENTER}"
  164.     DoEvents
  165.   End If
  166.   /'要执行的操作….
  167.   /'.....
  168. End Sub
  169. Protection属性返回工程的受保护状态,vbext_pp_locked(1)为受保护,vbext_pp_none(0)表示没有保护。

来自 http://club.excelhome.net/TopicOther.asp?t=5&BoardID=2&id=191823

原创粉丝点击