VBA Funktionen auflisten

Hi Community,

ich moechte alle meine subs und funktionen
auflisten. allerdings nur fuer das jedweilige
modul. am besten in einem array drinne…

gibts da schon fertige funktionen ?
bzw. wie funktioniert das mit VBA ?

ich brauchs in excel.

grusz

PixelKoenig

Ich möchte gerade mal anzweifeln, dass das überhaupt geht.

-nik

geht nicht? wirklich ?

Ich möchte gerade mal anzweifeln, dass das überhaupt geht.

das waer aber bescheiden :frowning:

in PHP habe ich es mir angewoehnt, waehrend der entwicklungsphase
klassen und einzelne funktionen zu testen und zu diesem zwecke in einer weboberflaeche klickbar/auswaehlbar darzustellen…

das wollte ich hier in excel auch machen.
da das programm recht umfangreich wird, wollte ich einzelne
teile immer mal wieder testen. und da bietet es sich an, die
funktionen automatisch anzeigen zu lassen.

Ich möchte gerade mal anzweifeln, dass das überhaupt geht.

das waer aber bescheiden :frowning:

Hi Pixelkönig,

klar kannst du mit Excel-Vba den Code aller Prozeduren in all deinen Modulen einer Excel-Datei auflisten lassen, bzw. gezielt nur für ein Modul oder wie auch immer.

Das mit dem Array mußt du dir selbst stricken oder frag hier nochmal genauer nach wie du das meinst, nur die Prozedurnamen, allen Code, oder oder?

Nach dem Code zum Auflisten allen Codes krame ich nachher wenn ich zuhause bin.

Gruß
Reinhard

klar kannst du mit Excel-Vba den Code aller Prozeduren in all
deinen Modulen einer Excel-Datei auflisten lassen, bzw.
gezielt nur für ein Modul oder wie auch immer.

*uff*
ich dachte schon… :smile:

Das mit dem Array mußt du dir selbst stricken oder frag hier
nochmal genauer nach wie du das meinst, nur die Prozedurnamen,
allen Code, oder oder?

ja. das mit dem array… das mach ich dann schon.
ich moechte alle prozedur,funktions,subsnamen in einem array auflisten.
so dass ich nachher in der lage bin, diese automatisiert auszugeben und via klick aufzurufen :smile:

Nach dem Code zum Auflisten allen Codes krame ich nachher wenn
ich zuhause bin.

klasse… danke schoen :smile:

grusz

pixelKoenig

ja. das mit dem array… das mach ich dann schon.
ich moechte alle prozedur,funktions,subsnamen in einem array
auflisten.
so dass ich nachher in der lage bin, diese automatisiert
auszugeben und via klick aufzurufen :smile:

Hallo Pixelkönig,
wie willst du per Klick eine Function aufrufen?
Call MeineSub
geht
Call MeineFuktion
geht nicht

Naja, dein Problem :smile:)

Gruß
Reinhard

Hallo Pixelkönig,
wie willst du per Klick eine Function aufrufen?
Call MeineSub
geht
Call MeineFuktion
geht nicht

hmmm.
ich wollte ein globales sub schreiben,
dass den klickwert (funktionname) an eine startfunktion uebergibt …
die diese dann im modul startet.
funktioniert das nicht ?

Hallo PixelKönig,

nachfolgend ist der Code der Beispielsdatei:

Er listet untereinander in A den Mappennamen(allergrad geöffneten mappen), in B dann den Modulnamen und in C den Prozedurnamen.
Ich hatte mich mal daran versucht und damals auch Code entwickelt, der dann auch den Inhalt der Prozeduren auflistet.
Leider habe ich k.A. wo der geblieben ist :frowning:
Aber du findest im Code genügend Infos um dir das zu basteln, ich habe das heute morgen grad so hingeschrieben das es funktioniert.
Problematisch ist es dann wenn du eine Property-Prozedur hast, deshalb habe ich da eine kleine Fehlerminimierung eingebaut.
Wenn du das Selection_Change-Ereignis einbaust, wird der Code des Moduls was du in Spalte B gewählt hast angezeigt, ist klar, normale Msgbox hat Größenbegrenzung, also fehlt mal was am Ende.
Lege auf eine Schaltfläche im Blatt das Makro: Alle_Makros_Liste
Was noch fehlt ist die Auflistung der public Deklarationen.

Gruß
Reinhard

in ein Standardmoul:
Option Explicit
'
Sub Alle\_Makros\_Liste()
'Verweis auf MS Vba Extensibility muß gesetzt sein!
Dim Mdl, Zei As Long, Spa As Integer, wb As Workbook, Z As Long
 Cells.Clear
 Zei = -1
 For Each wb In Workbooks
 Zei = Zei + 2
 Spa = 1
 Cells(Zei, Spa) = wb.Name
 For Each Mdl In wb.VBProject.VBComponents
 Zei = Zei + 1
 Cells(Zei, Spa + 1) = Mdl.Name
 With Mdl.CodeModule
 Z = .CountOfDeclarationLines + 1
 On Error GoTo Fehler 'Fehler wegen vbext\_pk\_Proc, gilt nicht für Property-Prozeduren!
 Do Until Z \>= .CountOfLines
 Zei = Zei + 1
 Cells(Zei, 3) = .ProcOfLine(Z, vbext\_pk\_Proc)
 Z = Z + .ProcCountLines(.ProcOfLine(Z, vbext\_pk\_Proc), vbext\_pk\_Proc)
 Loop
 On Error GoTo 0
 End With
 Next Mdl
 Next wb
Exit Sub
Fehler:
Z = Z + 1
Resume Next
End Sub
'
Sub ProzedurAuflisten(wb, Mdl)
Dim VBMdl 'As CodeModule
Dim Zei As Long, Inhalt As String, Z As Long
Set VBMdl = Workbooks(wb).VBProject.VBComponents(Mdl).CodeModule
With VBMdl
 If .CountOfLines \> 2 Then '2 wg Option Explicit und leerzeile
 Inhalt = .Lines(1, .CountOfLines)
 MsgBox Inhalt
 End If
End With
End Sub
'
Sub tt()
Call ProzedurAuflisten2(ActiveWorkbook.Name, "Modul1")
End Sub
'
Sub ProzedurAuflisten2(wb, Mdl)
'Verweis auf MS Vba Extensibility muß gesetzt sein!
Dim VBCodeMod As CodeModule
Dim Zei As Long, strMsg As String, Inh()
Set VBCodeMod = Workbooks(wb).VBProject.VBComponents(Mdl).CodeModule
With VBCodeMod
 Zei = .CountOfDeclarationLines + 1
 Do Until Zei \>= .CountOfLines
 strMsg = strMsg & .ProcOfLine(Zei, vbext\_pk\_Proc) & Chr(13)
 Zei = Zei + .ProcCountLines(.ProcOfLine(Zei, vbext\_pk\_Proc), vbext\_pk\_Proc)
 Loop
End With
MsgBox strMsg
End Sub
'
Sub machma()
Application.EnableEvents = True
End Sub

in das Dokumentmodul von z.B. Tabelle1:

Option Explicit
'
Private Sub Worksheet\_SelectionChange(ByVal Target As Excel.Range)
Dim Mdl, wb
If Target.Cells.Count 1 Then Exit Sub
If Target.Column 2 Or Target = "" Then Exit Sub
Mdl = Target.Value
wb = Cells(Target.Offset(0, -1).End(xlUp).Row, 1).Value
Call ProzedurAuflisten(wb, Mdl)
End Sub

ich wollte ein globales sub schreiben,
dass den klickwert (funktionname) an eine startfunktion
uebergibt …
die diese dann im modul startet.
funktioniert das nicht ?

Hallo Pixelkönig,
vielleicht reden wir aneinander vorbei, oder ich versteh dich nicht oder beides :smile:
Eine „Sub“ kann man starten, die läuft dann vor sich hin und macht das was drinsteht.
M.E. kann man eine Funktion nur aufrufen und ggfs. auswerten (ja, irgendwie ist aufrufen auch starten, aber irgendwie auch nicht)

Ich versuchs mal so.
Dein Makro sieht so aus:

Sub Global(Makroname as string)
Call Makroname
End Sub

dann klappt das für Subs *annehm*
Für Funktionen aber nicht.

Dann müßte das theoretisch so aussehen:

Sub Global(Funktionsname as string)
MsgBox Funktionsname()
End Sub

Was höchstwahrscheinlich nicht geht *annehm*

Aber lassen wir das mal wech.
Ich habe meine Datei verbessert, durch Klick auf die Prozedurnamen in Spalte C wird die jeweilige Prozedur in einer Userformtetxbox angezeigt.

Die Datei:
http://www.hostarea.de/server-12/Dezember-872f1b9c06…

hat den nachfolgenden Code.

Benötigt wird eine UF mit einem Textfeld, Größen sind beliebig, TextBox sollte nur oben links in der UF anecken.
Und in der Tabelle eine Schaltfläche der das makro Alle_Makros_Liste
zugewiesen wird.

Gruß
Reinhard

in Modul1:

Option Explicit
'Public M
'
Sub test()
Call EineProzedurAufListen("ListeAllerProzeduren.xls", "Modul2", "ProzedurAuflisten")
End Sub
'
Sub EineProzedurAufListen(wb, Mdl, Proz)
'Verweis auf MS Vba Extensibility muß gesetzt sein!
Dim Zei As Long, Spa As Integer, Z As Long, M As String, B
With Workbooks(wb).VBProject.VBComponents(Mdl).CodeModule
 Z = .CountOfDeclarationLines + 1
 If .CountOfDeclarationLines \> 0 Then M = .Lines(1, .CountOfDeclarationLines) & Chr(13)
 Do While Z = .CountOfLines
 Zei = Zei + 1
 Cells(Zei, 3) = .ProcOfLine(Z, vbext\_pk\_Proc)
 Z = Z + .ProcCountLines(.ProcOfLine(Z, vbext\_pk\_Proc), vbext\_pk\_Proc)
 Loop
 On Error GoTo 0
 End With
 Next Mdl
Next wb
ActiveSheet.Columns("A:C").AutoFit
Exit Sub
Fehler:
Z = Z + 1
Cells(Zei, 3) = "property!"
Resume Next
End Sub
'
Sub ProzedurAuflisten(wb, Mdl)
Dim VBMdl 'As CodeModule
Dim Zei As Long, Inhalt As String, Z As Long
Set VBMdl = Workbooks(wb).VBProject.VBComponents(Mdl).CodeModule
With VBMdl
 If .CountOfLines \> 2 Then '2 wg Option Explicit und leerzeile
 Inhalt = .Lines(1, .CountOfLines)
 MsgBox Inhalt
 End If
End With
End Sub
'
Sub tt()
Call ProzedurAuflisten2(ActiveWorkbook.Name, "Modul1")
End Sub
'
Sub ProzedurAuflisten2(wb, Mdl)
'Verweis auf MS Vba Extensibility muß gesetzt sein!
Dim VBCodeMod As CodeModule
Dim Zei As Long, strMsg As String, Inh()
Set VBCodeMod = Workbooks(wb).VBProject.VBComponents(Mdl).CodeModule
With VBCodeMod
 Zei = .CountOfDeclarationLines + 1
 Do Until Zei \>= .CountOfLines
 strMsg = strMsg & .ProcOfLine(Zei, vbext\_pk\_Proc) & Chr(13)
 Zei = Zei + .ProcCountLines(.ProcOfLine(Zei, vbext\_pk\_Proc), vbext\_pk\_Proc)
 Loop
End With
MsgBox strMsg
End Sub

in Tabelle1:

Option Explicit
'
Private Sub Worksheet\_SelectionChange(ByVal Target As Excel.Range)
Dim wb As String, Mdl As String
If Target.Cells.Count 1 Then Exit Sub
If Target = "" Then Exit Sub
If Target.Column 2 And Target.Column 3 Then Exit Sub
If Target.Row = 1 Then Exit Sub
Select Case Target.Column
 Case 2
 wb = Cells(Target.Offset(0, -1).End(xlUp).Row, 1).Value
 Mdl = Target.Value
 Call ProzedurAuflisten(wb, Mdl)
 Case 3
 wb = Cells(Target.Offset(0, -2).End(xlUp).Row, 1).Value
 Mdl = Cells(Target.Offset(0, -1).End(xlUp).Row, 2).Value
 On Error Resume Next 'wegen property-Prozedur Fehlern
 Call EineProzedurAufListen(wb, Mdl, Target.Value)
 Case Else
 MsgBox "Ei, wo klickste denn da herum?"
End Select
End Sub