設(shè)為首頁收藏本站Access中國

Office中國論壇/Access中國論壇

 找回密碼
 注冊

QQ登錄

只需一步,快速開始

返回列表 發(fā)新帖
樓主: tanhong
打印 上一主題 下一主題

VBA代碼編程方法詳解

[復(fù)制鏈接]
11#
 樓主| 發(fā)表于 2010-10-31 15:07:32 | 只看該作者
本帖最后由 tanhong 于 2010-10-31 15:56 編輯

6.11 代碼模塊中刪除代碼操作
6.11.1 刪除指定行代碼


  1. '過程功能:刪除指定行代碼
  2. '輸入?yún)?shù):VBCompName (String字符串變量) 指定模塊名
  3. '          StartLine  代碼起始行
  4. '          LinesNum 代碼行數(shù),默認(rèn)為一行
  5. Sub DelLinesCodes (VBCompName As String, StartLine As Long, _
  6.                 Optional LinesNum As Long = 1)   
  7. Dim VBProj      As VBProject
  8.     Dim VBComps    As VBComponents
  9.    
  10.    Set VBProj = VBE.ActiveVBProject
  11.    Set VBComps = VBProj.VBComponents
  12.    
  13.    VBComps(VBCompName).CodeModule.DeleteLines StartLine, LinesNum
  14. End Sub

  15. '******************************************************************
  16. '調(diào)用示例一:刪除"模塊1"中,第一行代碼
  17. Call DelLinesCodes("模塊1", 1)

  18. '******************************************************************
  19. '調(diào)用示例二:刪除"模塊1"中,從第一行到第十行代碼
  20. CAll DelLinesCodes("模塊1", 1, 10)
復(fù)制代碼



6.11.2 刪除指定過程所有代碼

  1. '刪除指定過程代碼
  2. Public Sub DelProcCodes(VBCompName As String, VBProcName As String)
  3.    Dim VBProj       As VBProject
  4.    Dim VBComps     As VBComponents
  5.    Dim ProcKind      As vbext_ProcKind
  6.    
  7.    Set VBProj = VBE.ActiveVBProject
  8.    Set VBComps = VBProj.VBComponents
  9.    
  10.    With VBComps (VBCompName).CodeModule
  11.       .DeleteLines .ProcStartLine (VBProcName, ProcKind), _
  12.       .ProcCountLines (VBProcName, ProcKind)
  13.    End With
  14. End Sub

  15. '******************************************************************
  16. '調(diào)用示例:刪除“模塊1”中,“我的過程”所有代碼
  17. Call  DelProcCodes ("模塊1", "我的過程")
復(fù)制代碼

6.11.3 刪除部件或模塊中所有代碼

  1. '刪除指定模塊中所有代碼
  2. Public Sub DelVBCompCodes (ByVal VBCompName As String)
  3.    Dim VBProj    As VBProject
  4.    Dim VBComps  As VBComponents
  5.    
  6. '實例對象
  7.    Set VBProj = VBE.ActiveVBProject
  8.    Set VBComps = VBProj.VBComponents

  9.    '從代碼模塊中第一行到最后一行執(zhí)行刪除
  10.    VBComps(VBCompName).CodeModule.DeleteLines 1, _
  11.    VBComps(VBCompName).CodeModule.CountOfLines
  12. End Sub

  13. '******************************************************************
  14. '調(diào)用示例:刪除“模塊1”中所有代碼
  15. Call  DelVBCompCodes ("模塊1")
復(fù)制代碼


6.12 添加事件過程代碼操作
6.12.1 向指定部件對象添加事件

  1. '過程功能:創(chuàng)建一個事件過程
  2. '輸入?yún)?shù):VBCompNameOrIndex(Variant)部件名或索引
  3. '          strEventProc(String)事件程序
  4. '          strEventObj(String)事件對象
  5. '          strInsertCode(String)事件中欲插入代碼,默認(rèn)為空
  6. Sub CreateEventProcCode (VBCompNameOrIndex As Variant, _
  7.                   strEventProc As String, _
  8.                   strEventObj As String, _
  9.                   Optional strInsertCode As String = "")
  10.    Dim VBProj     As VBProject
  11.    Dim VBComp    As VBComponent
  12.    Dim CodeMod    As CodeModule
  13.    Dim LineNum    As Long
  14.    
  15.    '實例化對象
  16.    Set VBProj = VBE.ActiveVBProject
  17.    Set VBComp = VBProj.VBComponents (VBCompNameOrIndex)
  18.    Set CodeMod = VBComp.CodeModule
  19.    
  20.    With CodeMod
  21.       LineNum = .CreateEventProc (strEventProc, strEventObj)
  22.       
  23. '是否為事件添了代碼,如未添加則退出
  24.       If strInsertCode = vbNullString Then Exit Sub
  25.         '從事件代碼之后插入新代碼
  26.          LineNum = LineNum + 1
  27.         .InsertLines LineNum, strInsertCode
  28.    End With
  29. End Sub


  30. '************************************************
  31. '調(diào)用示例一:在窗體1中創(chuàng)建窗體加載事件,并加入代碼
  32. Dim strProcCode  As String
  33. strProcCode = Space(4) & "Msgbox " & Chr(34) & "這是創(chuàng)建事件代碼演示!"
  34. Call CreateEventProcCode("Form_窗體1", "Load", "Form", strProcCode)

  35. '************************************************
  36. '調(diào)用示例二:在窗體1中創(chuàng)建窗體打開事件,但不加入代碼
  37. Call CreateEventProcCode("Form_窗體1", "Open", "Form")
復(fù)制代碼
12#
 樓主| 發(fā)表于 2010-10-31 15:08:02 | 只看該作者
本帖最后由 tanhong 于 2010-10-31 15:08 編輯

6.13 查找代碼獲取相關(guān)信息
6.13.1查找代碼文本獲取起止行列與是否存在信息

  1. '查找代碼文本信息定義數(shù)據(jù)類型
  2. Public Type FindCodeInfo
  3. SLine As Long '起始行
  4. ELine As Long '結(jié)束行
  5. SCol As Long '起始列
  6. ECol As Long '結(jié)束列
  7. BooFound As Boolean '是否找到
  8. End Type

  9. '函數(shù)功能:搜索模塊中代碼文本自定義函數(shù)
  10. Function SearchCodeModule (ByVal VBCompNameOrIndex As Variant, _
  11. ByVal strFindCode As String) As FindCodeInfo
  12. Dim VBProj As VBProject
  13. Dim VBComp As VBComponent
  14. Dim CodeMod As CodeModule
  15. Dim Findcode As FindCodeInfo '自定義數(shù)據(jù)類型
  16. Dim SL As Long '起始行
  17. Dim SC As Long '起始列
  18. Dim EL As Long '結(jié)束行
  19. Dim EC As Long '結(jié)束列
  20. Dim Found As Boolean '查找是否存在

  21. '實例對象
  22. Set VBProj = VBE.ActiveVBProject
  23. Set VBComp = VBProj.VBComponents (VBCompNameOrIndex)
  24. Set CodeMod = VBComp.CodeModule

  25. With CodeMod
  26. '初始起始行列值
  27. SL = 1: SC = 1
  28. '初始結(jié)束行列值
  29. EL = .CountOfLines: EC = 255
  30. '開始查找
  31. Found = .Find (strFindCode, SL, SC, EL, EC, True, False, False)
  32. '如未找到繼續(xù)查找
  33. Do Until Found = False
  34. With Findcode
  35. .SLine = SL: .SCol = SC
  36. .ELine = EL: .ECol = EC
  37. .BooFound = Found
  38. End With
  39. EL = .CountOfLines: SC = EC + 1: EC = 255
  40. Found = .Find (strFindCode, SL, SC, EL, EC, True, False, False)
  41. Loop
  42. End With
  43. '賦值輸出
  44. SearchCodeModule = Findcode
  45. End Function


  46. '***************************************************
  47. '調(diào)用示例:查找模塊"bas_ProcInfo"中"程序申明行"文本,并獲取相關(guān)信息
  48. Dim FindInfo As FindCodeInfo '申明自定義數(shù)據(jù)類型
  49. '查找并賦值給自定義數(shù)據(jù)類型變量
  50. FindInfo = SearchCodeModule("bas_ProcInfo", "程序申明行")
  51. MsgBox "查找文件:" & FindInfo.BooFound & vbLf & _
  52. "起始行:" & FindInfo.SLine & vbLf & _
  53. "起始列:" & FindInfo.SCol & vbLf & _
  54. "結(jié)束行:" & FindInfo.ELine & vbLf & _
  55. "結(jié)束列:" & FindInfo.Ecol

復(fù)制代碼



以上為本人研究關(guān)于VBA擴(kuò)展類庫在二次開發(fā)中的一點心得,現(xiàn)將其匯集成文與大家分享。上述文字中的代碼并不能算最優(yōu)化,也未囊括VBA擴(kuò)展類庫中對象所有屬性、方法,但對于解決二次開發(fā)中可能遇到的大多數(shù)問題還是很有幫助的。
因為,成文較倉促,再則部分代碼并未經(jīng)過細(xì)致測試,不免有錯漏之處,還請各位看文者幫助斧正,并告知本人,在此謝過。
因篇幅考慮,部分代碼并未收入文中,大家可參看實例,文中“代碼實例可在本人專欄或Access Home論壇下載。

點擊這里給我發(fā)消息

13#
發(fā)表于 2010-10-31 15:40:17 | 只看該作者
已經(jīng)很久沒寫addin了, 一看到老兄的代碼,又勾起了興趣.
14#
 樓主| 發(fā)表于 2010-10-31 15:54:34 | 只看該作者
很期待老大的新作。
15#
發(fā)表于 2010-10-31 18:48:04 | 只看該作者
強(qiáng)貼,頂起。
跟著版主學(xué)習(xí)。
16#
發(fā)表于 2010-10-31 19:15:40 | 只看該作者
很不錯的教程,謝謝江主!

點擊這里給我發(fā)消息

17#
發(fā)表于 2010-11-2 21:35:59 | 只看該作者
好貼子!
18#
發(fā)表于 2010-11-8 20:05:48 | 只看該作者
好貼子
19#
發(fā)表于 2010-12-14 23:19:31 | 只看該作者
高手,謝謝
20#
發(fā)表于 2011-7-19 21:02:59 | 只看該作者
謝謝樓主提供學(xué)習(xí)資料
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則

QQ|站長郵箱|小黑屋|手機(jī)版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2025-7-13 08:10 , Processed in 0.114826 second(s), 33 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表