Board logo

標題: [發問] Macro List [打印本頁]

作者: PJChen    時間: 2020-4-16 23:24     標題: Macro List

大大好,

隨著使用VBA的量增加後,有時要找程式的所在,要花好一會兒功夫,
且同一個Module會有多個Sub 名稱
想請問能否將模組中的所有Module & Sub 名稱
依序將Module1.Sub 名稱
Module2.Sub 名稱 ....
把它全部List 在TXT or excel中 ? 方便查找程式?
作者: quickfixer    時間: 2020-4-17 06:24

回復 1# PJChen

隨便google就有一堆現成的解答了,這個列出活頁薄中所有的macro name
http://www.vbaexpress.com/kb/getarticle.php?kb_id=398
excel 2016可正常執行
作者: quickfixer    時間: 2020-4-17 06:47

回復 1# PJChen

這個列出其它檔案的 macro name 含 module name
https://superuser.com/questions/1365898/macro-vba-code-to-list-and-print-names-and-code-of-all-macros-in-a-workbook
要userform、commandbutton、listbox
其中 objXLABC.Close 要改成objXLABC.Close False,不然程式會卡住
excel 2016可正常執行
作者: 准提部林    時間: 2020-4-17 09:59

[attach]31921[/attach]
作者: PJChen    時間: 2020-4-17 22:38

回復 4# 准提部林
回復 3# quickfixer
二位好,
我把程式抓下來想測試,但卡住了,可以幫我看看嗎?
[attach]31927[/attach]
  1. Sub Command1_Click()
  2.     ' Declare variables to access the Excel workbook.
  3.     Dim objXLApp As Excel.Application
  4.     Dim objXLWorkbooks As Excel.Workbooks
  5.     Dim objXLABC As Excel.Workbook

  6.     ' Declare variables to access the macros in the workbook.
  7.     Dim objProject As VBIDE.VBProject
  8.     Dim objComponent As VBIDE.VBComponent
  9.     Dim objCode As VBIDE.CodeModule

  10.     ' Declare other miscellaneous variables.
  11.     Dim iLine As Integer
  12.     Dim sProcName As String
  13.     Dim pk As vbext_ProcKind

  14.     ' Open Excel, and open the workbook.
  15.     Set objXLApp = New Excel.Application
  16.     Set objXLWorkbooks = objXLApp.Workbooks   
  17.     Set objXLABC = objXLWorkbooks.Open("C:\ABC.XLS")

  18.     ' Empty the list box.
  19.     List1.Clear

  20.     ' Get the project details in the workbook.
  21.     Set objProject = objXLABC.VBProject

  22.     ' Iterate through each component in the project.
  23.     For Each objComponent In objProject.VBComponents

  24.         ' Find the code module for the project.
  25.         Set objCode = objComponent.CodeModule

  26.         ' Scan through the code module, looking for procedures.
  27.         iLine = 1
  28.         Do While iLine < objCode.CountOfLines
  29.             sProcName = objCode.ProcOfLine(iLine, pk)
  30.             If sProcName <> "" Then
  31.                 ' Found a procedure. Display its details, and then skip
  32.                 ' to the end of the procedure.
  33.                 List1.AddItem objComponent.Name & vbTab & sProcName
  34.                 iLine = iLine + objCode.ProcCountLines(sProcName, pk)
  35.             Else
  36.                 ' This line has no procedure, so go to the next line.
  37.                 iLine = iLine + 1
  38.             End If
  39.         Loop
  40.         Set objCode = Nothing
  41.         Set objComponent = Nothing
  42.     Next

  43.     Set objProject = Nothing

  44.     ' Clean up and exit.
  45.     objXLABC.Close
  46.     objXLApp.Quit
  47. End Sub
複製代碼

作者: quickfixer    時間: 2020-4-18 00:06

本帖最後由 quickfixer 於 2020-4-18 00:14 編輯

回復 5# PJChen


網址內的microsoft連結不是有說明?需先設定引用項目
Microsoft Visual Basic for Applications Extensibility 5.3
打勾
   
[attach]31929[/attach]



第一個code 裡面也有說明要引用
[attach]31928[/attach]

不然把第一個code裡面的這2行
On Error Resume Next
    ThisWorkbook.VBProject.References.AddFromGuid _
    "{0002E157-0000-0000-C000-000000000046}", 5, 3
加到第二個code裡面最前面,可以改成用程式碼自動引用
作者: n7822123    時間: 2020-5-18 20:58

本帖最後由 n7822123 於 2020-5-18 21:02 編輯

回復 1# PJChen


了解VBE架構就不難寫........基本上你應該只想要用而已

所以我不多做解釋,想了解請按 "F1"
  1. Sub 找巨集名稱()

  2. Application.DisplayAlerts = False

  3. [A1] = "活頁簿名稱"
  4. [B1] = "模組名稱"
  5. [C1] = "程序名稱"

  6. R = 2
  7. For Each wb In Workbooks
  8.   For Each VBC In wb.VBProject.VBComponents
  9.     Select Case VBC.Type
  10.       Case 1  '1=一般模組
  11.         LS = VBC.CodeModule.CountOfLines
  12.         'Debug.Print LS
  13.         LineStr = VBC.CodeModule.Lines(1, LS)
  14.         Lines = Split(LineStr, vbCrLf)
  15.         For Each Line In Lines
  16.             If Line Like "Sub*" Then
  17.               Cells(R, 1) = wb.Name
  18.               Cells(R, 2) = VBC.Name
  19.               Cells(R, 3) = Line
  20.               R = R + 1
  21.             End If
  22.         Next 'Line
  23.       Case Else
  24.     End Select
  25.   Next  'VBC
  26. Next 'wb

  27. Columns.AutoFit

  28. End Sub
複製代碼
[attach]32046[/attach]




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)