Liste aller VBA-Module inklusive Prozeduren

.. das wohl mächtigste Werkzeug in Bill Gates' Büro-Sippe. Ob reine Formeln, PowerQuery oder VBA. Hier bleiben kaum Wünsche unerfüllt.
Benutzeravatar
thowe
Beiträge: 209
Registriert: 12. Sep 2022, 16:57
Hat sich bedankt: 79 Mal
Danksagung erhalten: 67 Mal
Kontaktdaten:

Liste aller VBA-Module inklusive Prozeduren

#1

Beitrag von thowe »

Hallo & Moin.

Mit tieferstehendem Codeschnippsel "lade" ich mir alle Module inklusvie Prozeduren in ein - bestimmtes - Sheet.

Es tritt ein Laufzeitfehler 35 auf und zwar nach dem die erste Klasse (hier: clsCore_CONST) in das Arbeistblatt übertragen wurde. Das bedeutet das mir im konkreten Fall 84 Einträge erzeugt werden, und dann - eben - nach erfolgreichem Eintrag des ersten Klassenmodul der Laufzeitfehler auftritt...

Code: Alles auswählen

 StartLine = StartLine + .ProcCountLines(.ProcOfLine(StartLine, vbext_pk_Proc), vbext_pk_Proc) <-hier tritt der Fehler auf
Es gibt offensichtich mit .ProcCountLines Probleme. Das Lokalfenster bring mir nichts. Wenn ich nur wüsste nach was genau ich Tante Google bei einem Kaffee (be)fragen soll". Ich mutmaße vbtext_pk_Proc ist die Ursache. Das ist jedoch nur geraten.

Code: Alles auswählen

Sub MODULES_ListMacrosToSheet()
'Source: https://www.mrexcel.com/board/threads/how-list-module-numbers-names-of-macros-in-ea-module.144151/
'You will need to create a reference to MS VBA Extensibilty 5.3
'(in VBE go to Tools>References) to work this code, it was set in this version.
'Standard module code, like: Module1.

Dim wksSheet As Worksheet 'the targeted Worksheet where to populate the data
Dim lngNumberComponents As Long 'Counter for all Components (Modules & Macros)
Dim objProjectModule As Object
Dim vbCodeModule As CodeModule
Dim arrProjectComponents()
Dim StartLine&, nRow&

'initialize
Set wksSheet = ThisWorkbook.Worksheets(SHEETHELPERS_GetSheetNameByCodeName("wksModules"))
nRow = 1
wksSheet.Range("A:B").ClearContents

'My list's column labels.
'Debug.Print ThisWorkbook.Worksheets("modules").Name
With wksSheet
        .Cells(nRow, 1) = "Module Name"
        .Cells(nRow, 2) = "Macro/Procedure/Function Name"
End With

'Get Modules.
For Each objProjectModule In Application.VBE.ActiveVBProject.VBComponents
    Set vbCodeModule = Application.ActiveWorkbook.VBProject.VBComponents(objProjectModule.name).CodeModule
    
    With vbCodeModule
        'Index the module's name!
        StartLine = .CountOfDeclarationLines + 1
        
        Do Until StartLine >= .CountOfLines
            'Increase Row for each listing!
            nRow = nRow + 1
            'Load cell with name!
            wksSheet.Cells(nRow, 1) = objProjectModule.name
            wksSheet.Cells(nRow, 2) = .ProcOfLine(StartLine, vbext_pk_Proc)
            
            StartLine = StartLine + .ProcCountLines(.ProcOfLine(StartLine, vbext_pk_Proc), vbext_pk_Proc) <-hier tritt der Fehler auf
            Loop
    End With
Next objProjectModule

'Some Styling issues
wksSheet.Range("A:B").Columns.AutoFit
End Sub

Hat jemand eine Idee, einen Hinweis?
Bitte, Danke...!

LG

Nachdem mir der Ton in einem anderen MS Office Forum aktuell überhautpt nicht gefällt, hoffe ich, dass hier geholfen werden kann...
Benutzeravatar
d'r Bastler
Beiträge: 683
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 177 Mal
Danksagung erhalten: 91 Mal

Re: Liste aller VBA-Module inklusive Prozeduren

#2

Beitrag von d'r Bastler »

Moin thowe,

leider irgend wohin versaubeutelt, hatte ich mich dem Thema vor längerer Zeit auch schon gewidmet und meine mich zu erinnern, dass man VBComponenten gezielt nach Typ numerisch ansprechen kann. Bei mir waren es nur Userforms und Allg. Module, Klassenmodule waren nicht dabei. Nur so als Anregung: Vielleicht fehlt Deinem Code der Hinweis auf den richtigen VBC-Typ.

Grüße und viel Erfolg!
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Benutzeravatar
thowe
Beiträge: 209
Registriert: 12. Sep 2022, 16:57
Hat sich bedankt: 79 Mal
Danksagung erhalten: 67 Mal
Kontaktdaten:

Re: Liste aller VBA-Module inklusive Prozeduren

#3

Beitrag von thowe »

Hallo Heb danke für deine Antwort.

Ich habe jetzt testweise den Code in einer andren Arbeitsmappe probiert. Mit ein paar Dummies an Modulen und Klassen.
In der neuen Arbeitsmappe läuft der Code durch, also liegt das Problem wo anders.
Wenn gelöst melde ich mich.

lg
Benutzeravatar
thowe
Beiträge: 209
Registriert: 12. Sep 2022, 16:57
Hat sich bedankt: 79 Mal
Danksagung erhalten: 67 Mal
Kontaktdaten:

Liste aller VBA-Module inklusive Prozeduren

#4

Beitrag von thowe »

Hallöchen, ich konnte nun den "Fehler" ausbügeln.

Im Anschluss der gesamte Code.

WICHTIG(!):

Es gilt folgendes zu beachten.
Es dürfen - in dieser aktuellen Version - keine Leerzeilen zwischen den einzelnen Prozeduren vorhanden sein.
Es können weitere Parameter, Informationen "herausgezogen" werden. Am besten einfach vorhanden Type ProcedureInformations erweitern und die Funktion GetInfosFromModule ergänzen.

Man könnte auch die
Sub MODULES_ListMacrosToSheet als Funktion umwandeln, um zur Laufzeit gezielter einzelne Inforamtionen, Eigenschaften herauszuziehen.

Code: Alles auswählen

'-------------------------------------------------------------
'
' @purpose:         populate all Macros with extended Infor-
'                   mations like Type, Name, Scope etc. into a
'                   specific Worksheet
' @params:          -
' @author:          thowe
' @deprecated:      -
' @version:         0.0.1
' @source:          inspired by and Thanks to:
'                   Joe Was, Chip Pearson
'                   https://www.mrexcel.com/board/threads/how-list-module-numbers-names-of-macros-in-ea-module.144151/
'                   https://groups.google.com/g/microsoft.public.excel.programming/c/bOv1hiGj28M?pli=1
' @module:          modModules
' @ notes:          You will need to create a reference to
'                   MS VBA Extensibilty 5.3
'                   (in VBE go to Tools>References)
'                   to work this code
' @ATTENTION(!)     Please concatenate the individuale Pro-
'                   cedures in a Module. There should be no
'                   blankline between the Procuderes. If, then
'                   the Code runs into an Error.
' @date             18.03.2024
'
'-------------------------------------------------------------
'  _          _        ___     _ _
' | |__   ___| |__    ( _ )   | |_| |__   _____      _____
' | '_ \ / _ \ '_ \   / _ \/\ | __| '_ \ / _ \ \ /\ / / _ \
' | | | |  __/ |_) | | (_>  < | |_| | | | (_) \ V  V /  __/
' |_| |_|\___|_.__/   \___/\/  \__|_| |_|\___/ \_/\_/ \___|
'
'-------------------------------------------------------------
'
' feel free to visit: https:vbasteleien.de
'
'-------------------------------------------------------------

Sub MODULES_ListMacrosToSheet()


Dim wksSheet As Worksheet 'the targeted Worksheet where to populate the data
Dim objProjectModule As Object 'the VBA Project
Dim vbCodeModule As CodeModule 'CodeModules
Dim intCounter As Integer 'inernal Counter
Dim ProcKind As VBIDE.vbext_ProcKind
Dim lngStartLine As Long
Dim lngRow As Long
Dim strProcName As String
Dim strProcedureType As String
Dim typProcInfos As ProcedureInformations

'initialize
Set wksSheet = ThisWorkbook.Worksheets("Sheet1")
lngRow = 1
wksSheet.Range("A:C").ClearContents
intCounter = 0

'The List's Column Labels in the WorkSheet.
With wksSheet
        .Cells(lngRow, 1) = "Module Name"
        .Cells(lngRow, 2) = "Type of Procedure"
        .Cells(lngRow, 3) = "Macro/Procedure/Function Name"
End With

'Get Modules.
For Each objProjectModule In Application.VBE.ActiveVBProject.VBComponents

    Set vbCodeModule = Application.ActiveWorkbook.VBProject.VBComponents(objProjectModule.Name).CodeModule
    
    With vbCodeModule
        'Index the module's name!
        lngStartLine = .CountOfDeclarationLines + 1
        
        Do Until lngStartLine >= .CountOfLines
            'Increase Row for each listing!
            lngRow = lngRow + 1
            'get the Declarationinformations belonging to:
            ' Type like Sub, Function, Property, unknown
            'Scope etc.
            typProcInfos = MODULES_GetInfosFromModule(vbCodeModule, lngStartLine)
            'populate the data into the Cells
                'the Modulname
                wksSheet.Cells(lngRow, 1) = objProjectModule.Name
                wksSheet.Cells(lngRow, 2) = typProcInfos.ProcedureType
                 wksSheet.Cells(lngRow, 3) = typProcInfos.ProcedureName
            'Call the SubFunction as a trial
'            lngStartLine = lngStartLine + .ProcCountLines(.ProcOfLine(lngStartLine, ProcKind), ProcKind)
            lngStartLine = lngStartLine + .ProcCountLines(.ProcOfLine(lngStartLine, typProcInfos.ProcedureKind), typProcInfos.ProcedureKind)
        Loop
    End With
Next objProjectModule

'Some Styling issues
wksSheet.Range("A:B").Columns.AutoFit
End Sub
Sub TestSomethingByVal(ByVal wks As Worksheet)

End Sub
Function MODULES_GetInfosFromModule(modModule As VBIDE.CodeModule, lngLineNumber As Long) As ProcedureInformations
    
    'Declarations
    Dim strProcedureHeader As String
    Dim strTempHeader() As String
    Dim typProcInfos As ProcedureInformations
    Const strDefault As String = "default"
    
    With modModule
        strProcedureHeader = .Lines(lngLineNumber, 1)
        'typProcInfos.ProcedureName = .ProcOfLine(lngLineNumber, vbext_pk_Proc)
        typProcInfos.ProcedureName = .ProcOfLine(lngLineNumber, typProcInfos.ProcedureKind)
        'later maybe further Declarations, Inforamtions
    End With
    
    strTempHeader = Split(strProcedureHeader, Space(1))
    'Quick & dirty Exit if  last Procudure in Module
    On Error Resume Next
    Select Case typProcInfos.ProcedureKind
        Case VBIDE.vbext_pk_Get
            Select Case LCase(strTempHeader(0))
                Case "public", "private"
                    typProcInfos.ProcedureType = strTempHeader(0)
                Case Else
                    typProcInfos.ProcedureType = strDefault
            End Select
        
        Case VBIDE.vbext_pk_Let
            typProcInfos.ProcedureType = "Property Let"
            Select Case LCase(strTempHeader(0))
                Case "public", "private", "friend"
                    typProcInfos.ProcedureScope = strTempHeader(0)
                Case Else
                    typProcInfos.ProcedureScope = strDefault
            End Select
            
        Case VBIDE.vbext_pk_Set
            typProcInfos.ProcedureType = "Property Set"
            Select Case LCase(strTempHeader(0))
                Case "public", "private", "friend"
                    typProcInfos.ProcedureScope = strTempHeader(0)
                Case Else
                    typProcInfos.ProcedureScope = strDefault
            End Select
        
        'Sub
        Case VBIDE.vbext_pk_Proc
            Select Case LCase(strTempHeader(0))
                Case "public", "private", "friend"
                    typProcInfos.ProcedureScope = strTempHeader(0)
                    typProcInfos.ProcedureType = strTempHeader(1)
                Case Else
                    typProcInfos.ProcedureScope = strDefault
                    typProcInfos.ProcedureType = strTempHeader(0)
            End Select
    End Select
    
    MODULES_GetInfosFromModule = typProcInfos
End Function
Public Type ProcedureInformations
    ProcedureName As String 'Name of the Proceudre
    ProcedureType As String 'Sub, Function, Property, Class and so on
    ProcedureScope As String 'Public, Private
    ProcedureKind As VBIDE.vbext_ProcKind
End Type
Folgende Benutzer bedankten sich beim Autor thowe für den Beitrag (Insgesamt 2):
d'r Bastler, BitDoctor
Benutzeravatar
d'r Bastler
Beiträge: 683
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 177 Mal
Danksagung erhalten: 91 Mal

Re: Liste aller VBA-Module inklusive Prozeduren

#5

Beitrag von d'r Bastler »

Moin allerseits!

Aus aktuellem Anlass hier ein Snippet, das zwar keine Prozeduren, aber alle VBcomponents eines Projekts auflistet. Es sind zwei Abläufe: den ersten habe ich hier auskommentiert, weil er nichts anderes macht, als die vorhandenen vbc.types aufzulisten. Der zweite Teil liefert alle vbc mit Namen und Typ als Text.

Hier lassen sich natürlich beliebige Filter bauen, die in den Select Case integriert werden können: If ... and ... then

Der Code gehört in ein allgemeines Modul und kann -so er in ein leeres/unproduktives Sheet schreiben darf- problemlos in vorhandenen Projekten getestet werden.

Code: Alles auswählen

Sub ListVBcomponents()
Dim vbc As Object, i As Integer

i = 1: Cells.Clear

With ActiveWorkbook.VBProject

''Welche vbc sind denn vorhanden?
'For Each vbc In .VBComponents
'    Cells(i, 1) = vbc.Type
'    i = i + 1
'Next

For Each vbc In .VBComponents
    Select Case vbc.Type
        Case 1                          'Module
            Cells(i, 1) = vbc.Name
            Cells(i, 2) = "Module"
            i = i + 1
        Case 2                          'Class Module
            Cells(i, 1) = vbc.Name
            Cells(i, 2) = "Class Module"
            i = i + 1
        Case 3                          'UserForm
            Cells(i, 1) = vbc.Name
            Cells(i, 2) = "UserForm"
            i = i + 1
        Case 100                        'Sheet
            Cells(i, 1) = vbc.Name
            Cells(i, 2) = "Sheet"
            i = i + 1
        End Select
Next
End With
MsgBox "Done!"
End Sub
Viel Spaß damit!
Folgende Benutzer bedankten sich beim Autor d'r Bastler für den Beitrag (Insgesamt 2):
thowe, BitDoctor
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Benutzeravatar
d'r Bastler
Beiträge: 683
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 177 Mal
Danksagung erhalten: 91 Mal

Re: Liste aller VBA-Module inklusive Prozeduren

#6

Beitrag von d'r Bastler »

Moin allerseits,

was sich nicht so alles im eigenen Archiv findet ... :oops: Das folgende Snippet geht durch alle Componenten, UserForms, Controls und Module und zeigt deren Namen, Typ und Prozeduren ...

Code: Alles auswählen

Sub ListComponents()
Dim oCmp As Object
Dim i As Integer

Cells.Clear
i = 1

For Each oCmp In ActiveWorkbook.VBProject.VBComponents
'    If oCmp.Type <> 100 Then  'lässt die Arbeitsmappe und -blätter aus
        Cells(i, 1) = oCmp.Name
        i = i + 1
'    End If
Next
'MsgBox i - 1
End Sub

Sub ListControls()
Dim oCmp As VBIDE.VBComponent, oUsf As Object, ctr As Object
Dim i As Integer, j As Integer
Dim sCmp

Cells.Clear
i = 1
j = 2

For Each oCmp In Application.VBE.ActiveVBProject.VBComponents
    If oCmp.Type = 3 Then
        Cells(i, 1) = oCmp.Name
        Set oUsf = oCmp
        For Each ctr In oUsf.Controls
            Cells(i, j) = ctr.Name
            j = j + 1
        Next
        i = i + 1


    End If
Next
MsgBox i - 1
End Sub

Public Sub ListProcedures()
Dim oMod As Object
Dim i As Integer, iStart As Integer

Cells.Clear
i = 1

For Each oMod In ActiveWorkbook.VBProject.VBComponents
    With oMod.CodeModule
        iStart = .CountOfDeclarationLines + 1
        Do Until iStart >= .CountOfLines
            Cells(i, 1) = .ProcOfLine(iStart, 0)
            Cells(i, 2) = oMod.Type
            Cells(i, 3) = oMod.Name
            iStart = iStart + .ProcCountLines(.ProcOfLine(iStart, 0), 0)
            i = i + 1
        Loop
    End With
Next
'MsgBox i - 1
End Sub
In dieser Fassung nur aus einem anderen Projekt herauskopiert, also nicht getestet - aber vielleicht eine Grundlage für mehr ...

Viel Spaß damit!
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Benutzeravatar
thowe
Beiträge: 209
Registriert: 12. Sep 2022, 16:57
Hat sich bedankt: 79 Mal
Danksagung erhalten: 67 Mal
Kontaktdaten:

Re: Liste aller VBA-Module inklusive Prozeduren

#7

Beitrag von thowe »

Hallöchen,

hier gibt es auch eine interessante VBAstelei zu Modules, nämoch zum Thema Import und Export von Modulen

Viel Spaß damit & Danke an BD (BitDoktor), LG thowe
Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste