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 ???
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
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