Alle Makros als BAS-files auslesen

Hi
Ausgangslage:
Ich habe eine Sammlung von Excel-Sheets mit vielen MAKROS, wie z.B. in vielen VBA-Büchern. Ich erinnere mich an einen Begriff/Text in einem der Makros oder möchte wissen, ob ein spezieller Befehl etc. irgendwo vorkommt. (z.B. ganz einfach: wird in einem der Makros „UsedRange“ gebraucht?).
Frage:
Ich möchte für alle Makros den Code automatisch exportieren, so dass ich dann eine Anzahl „Modul1xx.bas“ oder „Modul2.txt“ bekomme, die ich nach dem Begriff absuchen kann.
(Ich habe in einem einzigen Buch so eine Liste gefunden ohne Erklärung, wie sie hergestellt wurde: Das Excel-VBA Codebook, Addison-Wesley mit 809 Makros als TXT).

Das solte doch möglich sein! Kann man die Makros mit einem Makro exportieren ???

Auf gute Hinweise hofft
Erich

Hallo Erich,

nach etwas Bastelarbeit schafft es dieser relativ einfache Code. Dabei hab ich die Möglichkeit eingebaut alle Elemente zu exportieren oder nur einzelne. Es ja nicht sinnvoll ist, die Elemente „DieseArbeitsmappe“ oder die Tabellen zu exportieren, wenn diese keinen Code enthalten.

Sub CodeExportieren()
 'Exportiert den VBA-Code der aktiven Arbeitsmappe in bas-Dateien, Userforms in bas/frx-Dateien
 'Erstellt unter Excel 97, fcs, 2006-09-02
 Dim Mappe As Workbook, Pfad As String, Einzel, Alle
 Pfad = "C:\Test\VBA\_Module"
 Set Mappe = ActiveWorkbook
 Alle = MsgBox("Alle VBA-Komponenten (Tabellen, Module und Userforms) exportieren?" & vbLf \_
 & vbLf & "Bei 'nein' kann für jedes Element einzeln gewählt werden.", \_
 vbYesNo, "VBA-Code exportieren")
 For Each VBKomponente In Mappe.VBProject.VBComponents
 With VBKomponente
 Einzel = vbYes
 If Alle = vbNo Then
 Einzel = MsgBox("Code von " & Mappe.Name & " " & .Name & " exportieren?", \_
 vbYesNo, "VBA-Code exportieren")
 End If
 If Einzel = vbYes Then
 .Export (Pfad & "\" & Mappe.Name & "\_" & .Name & ".bas")
 End If
 End With
 Next VBKomponente
End Sub

Gruß
Franz

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Franz
Genau so habe ich mir das vorgestellt!
Nur: könntest du mir bitte noch die Variable „VBKomponente“ definieren?
Vielen Dank und einen schönen Sonntag noch
Erich

Genau so habe ich mir das vorgestellt!
Nur: könntest du mir bitte noch die Variable „VBKomponente“
definieren?

Hallo Erich,

Zitat aus http://www.jumper.ch/Artikel/215.htm :

Der erste Schritt in der Programmierung mit VBE ist, das Objekt, das für die Arbeit benötigt wird, zu referenzieren.

VBProject
Dim VBProj As VBProject
Set VBProj = ThisWorkbook.VBProject

VBComponent
Dim VBComp As VBComponent
Set VBComp = ThisWorkbook.VBProject.VBComponents(„Modul1“)

CodeModule
Dim VBCodeMod As CodeModule
Set VBCodeMod = ThisWorkbook.VBProject.VBComponents(„Modul1“).CodeModule

Gruß
Reinhard

1 Like

nach etwas Bastelarbeit schafft es dieser relativ einfache
Code. Dabei hab ich die Möglichkeit eingebaut alle Elemente zu
exportieren oder nur einzelne. Es ja nicht sinnvoll ist, die
Elemente „DieseArbeitsmappe“ oder die Tabellen zu exportieren,
wenn diese keinen Code enthalten.

Hallo Franz,
ja, da hast du Recht. Deshalb ist es gut zu schauen ob die Module leer sind, also gar nichts oder nur Option Eplicit beinhaltn. Ich hatte Schwierigkeiten die Anzahl der Codezeilen zu ermitteln. Mit externer Hilfe bekam ich es hin. Aus den nachfolgenden Codes und deinem kann man sich einen Exportcode basteln. Wenn das Exportieren nicht notwendig ist kann man ja nach dem Begriff in den Zeilen suchen und nur bei Findung den Code exportieren.
Die Unterscheidung nach Modultyp ist wichtig um beim Exportieren gleich die richtige Endung bas, cls, frm mitzugeben um später einfach importieren zu können.
Gruß
Reinhard

Option Explicit

Sub tt()
 Dim VBComp As Object, str As String, n As Long
 For Each VBComp In ThisWorkbook.VBProject.VBComponents
 str = str & VBComp.Name & " = " & CompTypeToName(VBComp) & Chr(13)
 MsgBox VBComp.Name
 MsgBox VBComp.CodeModule.CountOfDeclarationLines
 MsgBox VBComp.CodeModule.CountOfLines
 For n = 1 To VBComp.CodeModule.CountOfLines
 MsgBox VBComp.CodeModule.Lines(n, 1)
 Next n

 Next VBComp
 MsgBox str
End Sub

Function CompTypeToName(VBComp As Object) As String
 Select Case VBComp.Type
 Case 11
 CompTypeToName = "Active X Designer"
 Case 2
 CompTypeToName = "Klassenmodul"
 Case 100
 CompTypeToName = "Dokumentmodul"
 Case 3
 CompTypeToName = "MS Form"
 Case 1
 CompTypeToName = "Standardmodul"
 Case Else
 CompTypeToName = "unbekannter Typ"
 End Select
End Function

Hallo Reinhard
Besten Dank für die tollen Hinweise! Nun läuft mein Makro wie geschmiert; ich habe damit mehrere Hundert Module aus allen vorhandenen Büchern in „TXT“ ausgelesen.
Auch die Website von Pearson ist sehr instruktiv und war mir unbekannt.
Bis zum nächsten erfreulichen Kontakt grüsst
Erich