Excel: Makro per Makro löschen

Guten Tag, liebe Excel-Expertinnen und -experten,

Excel XP: Wie kann ich per Makro (VB-Code) ein anderes Makro in derselben oder in einer anderen Arbeitsmappe löschen?
Beide Varianten kämen bei mir aufs Gleiche raus. Eine davon würde mir also genügen.

Für Hilfe wäre dankbar
Ludwig

Hallo Ludwig,

dazu brauchst du kein Makro

->Extras ->Makro ->Makros
das entsprechende Makro auswählen und auf den Button LÖSCHEN klicken
(falls es sehr viele sind, unten bei >Makros in Diese Arbeitsmappe einstellen

oder Alt+F11 drücken, das Makro markieren und entfernen

Gruß
Marion

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

Liebe Marion,

doch, ich brauche ein Makro, weil dieser Löschvorgang an zahlreichen gleichartigen Excel-Arbeitsmappen nach jedem der häufigen Updates erneut vorgenommen werden muss. Manuell käme ich da nie nach. Dennoch danke!

Ludwig

dazu brauchst du kein Makro

->Extras ->Makro ->Makros
das entsprechende Makro auswählen und auf den Button LÖSCHEN
klicken
(falls es sehr viele sind, unten bei >Makros in Diese
Arbeitsmappe einstellen

oder Alt+F11 drücken, das Makro markieren und entfernen

Gruß
Marion

Excel XP: Wie kann ich per Makro (VB-Code) ein anderes Makro
in derselben oder in einer anderen Arbeitsmappe löschen?
Beide Varianten kämen bei mir aufs Gleiche raus. Eine davon
würde mir also genügen.

Hi Ludwig,
google mal in Groups nach Insertlines und/oder Deletelines (wird leider in der Vba-Hilfe nicht beschrieben), dann siehst du Codes wie man überhaupt auf Moudle zugreifen kann.

Mit diesem Wissen kannst du dann die Module zeilenweise auslesen,
dabei dann z.B. nach der Zeile „Sub MeinMakro()“ suchen, und dann alle folgenden Codezeilen bis „End Sub“ löschen mit deletelines.

Probiers mal ob du mit diesen Angaben weiterkommst, wenn nicht dann melde dich nochmal…

Gruß
Reinhard

Hallo Reinhard,

hab dich quasi schon vermisst …
Was du mit Google vorschlägst, hab ich allerdings schon gemacht und mich zu früh gefreut: Fehlermeldung. Ich füg das Listing mal ein:

Sub Makro_löschen()
Dim FoundFlag As Boolean
Dim Zeilen()
Makroname = „Löschmich“
Suchtext = "Sub " & Makroname & „()“

Die folgende Zeile erzeugte die Fehlermeldung:

Set VBE = Application.VBE.ActiveCodePane.CodeModule
FoundFlag = False
With VBE
For x = 1 To .CountOfLines
If UCase(.Lines(x, 1)) = UCase(Suchtext) Then FoundFlag = True
If FoundFlag Then
Zähler = Zähler + 1
ReDim Preserve Zeilen(Zähler)
Zeilen(Zähler) = x
If .Lines(x, 1) = „End Sub“ Then
.DeleteLines Zeilen(1), UBound(Zeilen)
Exit For
End If
End If
Next x
If Not FoundFlag Then MsgBox „Makro " & Makroname & _
" nicht gefunden !“, vbCritical
End With
End Sub

Das hat sich dann leider zwischendrin aufgehängt - mehrmals.
Bis dann - vielen Dank einstweilen.

Ludwig

Hi Ludwig,
ich habe das auch getestet, war da auch sehr überfragt warum der Fehler kommt und fragte woanders nach, bei echten Profis.

Die Lösung ist

Extras-Makro-Sicherheit-Vertrauenswürdige Quellen
Haken bei ‚Zugriff auf Visual Basic-Prokekt vertrauen‘ rein.

Gruß
Reinhard

Hallo Reinhard,

das mit deinem letzten Tipp („Sicherheit“) hab ich gleich gemacht, aber leider noch immer mit Fehlermeldung, wenngleich jetzt anderer Art. Was tausendmal funktioniert, klappt hier nicht:

Prinzip:

Obergeordnete Excel-Datei enthält ein Makro, welches ich starte.
Dieses Makro öffnet nach und nach 28 andere (gleichartig strukturierte) Arbeitsmappen und ruft dort mehrere 28 mal jeweils gleichartige lokale „Untermakros“ der Reihe nach auf. Zuletzt werden die 28 Mappen dann alle in zwei verschiedenen Fassungen wieder gespeichert. Klingt kompliziert. Ist es auch. Hat viel Mühe gekostet. Aber klappt jetzt seit Jahren.

Nur das neueste Makro will nicht wie alle anderen, obwohl es in die vorhandene Struktur identisch engefügt ist. Selbst Syntaxfehler sind kaum denkbar, weil ich die entscheidenden Zeilen alle kopiert statt getippt habe.

Das fragliche und noch fehlerbehaftete Makro „Makro_löschen“ sucht nach dem zu löschenden Makro „Vokabeltrainer_vorbereiten“ und behauptet zuletzt in der MsgBox, es finde das gesuchte Makro nicht, obwohl dieses (also: „Vokabeltrainer_vorbereiten“) in der Liste der verfügbaren Makros auftaucht und auch tatsächlich vorhanden ist.

Irgendwas läuft hier noch falsch. Ich wüsst’ bloß gerne, was.

Vielen Dank für deine Mühe!
Ludwig

Hi Ludwig,

das mit deinem letzten Tipp („Sicherheit“) hab ich gleich
gemacht, aber leider noch immer mit Fehlermeldung, wenngleich
jetzt anderer Art. Was tausendmal funktioniert, klappt hier
nicht:

bei mir war es die Lösung. Zumindest die für die Fehlermeldung beim Set VBE Befehl.

Obergeordnete Excel-Datei enthält ein Makro, welches ich
starte.
Dieses Makro öffnet nach und nach 28 andere (gleichartig
strukturierte) Arbeitsmappen und ruft dort mehrere 28 mal
jeweils gleichartige lokale „Untermakros“ der Reihe nach auf.
Zuletzt werden die 28 Mappen dann alle in zwei verschiedenen
Fassungen wieder gespeichert. Klingt kompliziert. Ist es auch.

Ich verstehe da nun nicht daß man da 28 gleichartige Untermakros braucht.

Das fragliche und noch fehlerbehaftete Makro „Makro_löschen“
sucht nach dem zu löschenden Makro
„Vokabeltrainer_vorbereiten“ und behauptet zuletzt in der
MsgBox, es finde das gesuchte Makro nicht, obwohl dieses
(also: „Vokabeltrainer_vorbereiten“) in der Liste der
verfügbaren Makros auftaucht und auch tatsächlich vorhanden
ist.

Wo steht „Vokabeltrainer_vorbereiten“, in der obergeordneten Datei oder in jeweils den 28 anderen Dateien, in welchem Modul dort.
Wie ist der Code von „Makro_löschen“, ist es exakt dieser:

Sub Makro\_löschen()
Dim FoundFlag As Boolean
Dim Zeilen()
Makroname = "Löschmich"
Suchtext = "Sub " & Makroname & "()"
Set VBE = Application.VBE.ActiveCodePane.CodeModule
FoundFlag = False
With VBE
 For x = 1 To .CountOfLines
 'MsgBox .Lines(x, 1)
 If UCase(.Lines(x, 1)) = UCase(Suchtext) Then FoundFlag = True
 If FoundFlag Then
 Zähler = Zähler + 1
 ReDim Preserve Zeilen(Zähler)
 Zeilen(Zähler) = x
 If .Lines(x, 1) = "End Sub" Then
 .DeleteLines Zeilen(1), UBound(Zeilen)
 Exit For
 End If
 End If
 Next x
 If Not FoundFlag Then MsgBox "Makro " & Makroname & \_
 " nicht gefunden !", vbCritical
End With
End Sub

Denn dieser funktioniert schon problemlos und löscht ein Makro was „Löschmich“ heißt, allerdings nur wenn es im gleichen Modul wie
„Makro_löschen“ steht.

Man muß das Makro also nur so umschreiben, daß es auf alle Module, odr wenn der Modulnam efest sit auf dieseen, zugreift und dort nach „Löschmich“ sucht und dann löscht.

Also google mal nach z.B.
Deletelines each CodeModules
oder
Deletelines Tabelle1
oder
Deletelines Modul1
o.ä.

Wenn du nicht fündig wirst, setze ich mich zuhause hin und stricke dir das zusammen.

Gruß
Reinhard

Hallo Reinhard,

gleich wieder zuerst danke für deine viele Mühe mit mir.

bei mir war es die Lösung. Zumindest die für die Fehlermeldung
beim Set VBE Befehl.

Bei mir auch. Nur kam dann die nächste Fehlermeldung, wie beschrieben.

Ich verstehe da nun nicht daß man da 28 gleichartige
Untermakros braucht.

Ich versuch’s zu erklären.

Es geht um englische Vokabeln, für jede Lektion ab Klasse 6 bis Klasse 10 je eine Excelmappe. Macht 28. Alle diese Excel-Arbeitsmappen müssen technisch immer identisch sein, nur die Vokabeln sind natürlich jeweils andere.

Änderungen an der Exceldatei mache immer an einer ganz bestimmten. Was ich dort ändere, wird per Makros auf die übrigen 27 übertragen. Dabei müssen die Vokabeln, insgesamt sind es über 10.000 Einträge, natürlich erhalten bleiben.

(Warum 10 000 Datensätze?
a) engl. Stichwort in internat. Lautschrift
b) engl. Stichwort
c) dt. Stichwort dazu
d) engl. Beispielsatz/Anwendungsbeispiel
e) dessen dt. Übersetzung
f) (ggf. Hinweise, Lernhilfen)

(a) bis (e) ist jeweils ein Datensatz mit bis zu 6 Einträgen.
Dies zusammen ergibt bei den 28 Dateien diese besagten über 10.000 Einträge. Die sind in Jahren gereift und unersetzbar.

Die eine Datei - nennen wir sie Mutterdatei - heißt
H3U1-voc.xls

(H=Hauptschule, 3= Band 3 = 7. Schuljahr, U = Unit=Lektion, 1 =Unit 1=erste Lektion)
Analog sind die übrigen 27 Dateien benamst.

Will ich nun an der Excel-Mappe-Struktur etwas ändern, so geschieht dies also immer und nur an H3U1-voc.xls. Diese Änderung wird alsdann durch ein System von Makros auf die übrigen 27 Dateien übertragen.

Zu diesem Zweck gibt e noch eine extra Datei, die nichts anderers tut, als die Ober-Makros zu enthalten und ablaufen zu lassen. Ober-Makros heißt: In Modulen programmierte Abläufe, die, weil Excel eine seltsame Dateigrößenbegrenzung für Makros hat, in kleinere Einzelschritte (Makros) zerlegt sind. Sie laufen modulartig eins nach dem anderen ab. Dazu starten sie eine Vokabeldatei nach der anderen, rufen dort bestimmte lokale Makros auf, speichern die bearbeitete Version und rufen dann die nächste Vokabeldatei auf. Bis alle 28 auf dem Stand von H3U1-voc.xls sind.

Nun ist die komplette Lehrerversion 28 mal fertig. Nun wird aus jeder von ihnen eine abgespeckte und entsprechend eingerichtete Schülerversion erstellt, ebenfalls 28 mal, und ebenfalls per Makros und (lokalen) Untermakros. „H3U1-vocTrainer.xls“ usw. dient dann zum Ausdrucken der Datensätze (machen die Kids selber in der Schule) und zum Lernen am Bildschirm als Vokabeltrainer - heiß begehrt.

Damit die einzelnen Makros laufen, musste ich lernen, dass da Spielregeln einzuhalten sind:

Ich will ja nicht 28 Dateien einzeln öffnen, mehrere Makros starten, und dann wieder schließen (mit Speichern unter), und dann die nächste.
Also gibt es die Oberdatei, die das Obermakro (in Stufen) ablaufen lässt. Diese dient also als Shell, das heißt, sie bleibt während der geamten Prozedur geöffnet. Nur so kann man per Makro andere Exceldateien öffnen, bearbeiten lassen, speichern und auch umbenennen.
Ich lasse jetzt weg, dass es noch komplexer abläuft, weil ich ja die ganzen Vokabeln erhalten muss, vorübergehend „parken“, dann die neue Version erst leer erstellen, dann die Vokabeldatensätze wieder hervorholen und in die neue Mappe einkopieren …

Wenn du noch mehr dazu erfahren willst, frag mich.

Das fragliche und noch fehlerbehaftete Makro „Makro_löschen“
sucht nach dem zu löschenden Makro
„Vokabeltrainer_vorbereiten“ und behauptet zuletzt in der
MsgBox, es finde das gesuchte Makro nicht, obwohl dieses
(also: „Vokabeltrainer_vorbereiten“) in der Liste der
verfügbaren Makros auftaucht und auch tatsächlich vorhanden
ist.

Wo steht „Vokabeltrainer_vorbereiten“, in der obergeordneten
Datei oder in jeweils den 28 anderen Dateien, in welchem Modul
dort.

„Vokabeltrainer_vorbereiten“ ist ein lokales Makro, das heißt, es ist in jeder der 28 Daten enthalten und ruft seinerseits wieder mehrere Unter-Untermakros auf. Da es, deinem Tipp zufolge, auch das per Unter-Unter-Makro eingefügte Kennwort zum Schutz einer Seite enthält, will ich dieses Makro „Vokabeltrainer_vorbereiten“ nach Gebrauch in der Vokabeltrainerversion überall automatisch löschen lassen.

So viel zum Grundsätzlichen.

Wie ist der Code von „Makro_löschen“, ist es exakt dieser:

Sub Makro_löschen()
Dim FoundFlag As Boolean
Dim Zeilen()
Makroname = „Löschmich“
Suchtext = "Sub " & Makroname & „()“
Set VBE = Application.VBE.ActiveCodePane.CodeModule
FoundFlag = False
With VBE
For x = 1 To .CountOfLines
'MsgBox .Lines(x, 1)
If UCase(.Lines(x, 1)) = UCase(Suchtext) Then
FoundFlag = True
If FoundFlag Then
Zähler = Zähler + 1
ReDim Preserve Zeilen(Zähler)
Zeilen(Zähler) = x
If .Lines(x, 1) = „End Sub“ Then
.DeleteLines Zeilen(1), UBound(Zeilen)
Exit For
End If
End If
Next x
If Not FoundFlag Then MsgBox „Makro " & Makroname & _
" nicht gefunden !“, vbCritical
End With
End Sub

Ich hatte das so einkopiert, wie du es mir geschickt hattest. Nur den Namen des zu löschenden Makros „Vokabeltrainer_vorbereiten“ statt „löschmich“ habe ich natürlich einkopiert.

Denn dieser funktioniert schon problemlos und löscht ein Makro
was „Löschmich“ heißt, allerdings nur wenn es im gleichen
Modul wie
„Makro_löschen“ steht.

Stimmt, manuell gestartet hat’s geklappt. Doch per Obermakro von der Shell aus aufgerufen aufgerufen: Fehlermeldung! Obwohl eine ganze Reihe anderer Makros auf genau dieselbe Art problemlos aufgerufen werden und bestens laufen.

Man muß das Makro also nur so umschreiben, daß es auf alle
Module, odr wenn der Modulnam efest sit auf dieseen, zugreift
und dort nach „Löschmich“ sucht und dann löscht.

Was mir (in der Schüler-Vokabeltrainer-Version) genauso oder noch mehr willkommen wäre: alle darin enthaltenen Makros zu löschen. Die Sch. brauchen sie nicht, der Koll. Administrator hat zudem eh alle Makromöglichkeiten verhindert (und weiß warum). Das heißt: Alle Makros komplett weg wär auch eine willkommene Möglichkeit, wenn es ginge.

Deinen Google-Tipp will ich auch noch beherzigen.

Und schon mal ganz herzlichen Dank für deine Hilfe und das Angebot.

Ludwig

eine Ergänzung
Nochmals ich …

Eben habe ich genau dieses Listing (s.u.) getestet und erhielt die Fehlermeldung „Next ohne for …“. Da müsste also noch ein „Syntax-Error“ drin sein. Nur wo? Ich hab noch die Zeile Exit For ergänzt um ein vorangesetztes „Then“. Wollte er auch nicht.

Nochmals danke und Gruß
Ludwig

Dim FoundFlag As Boolean
Dim Zeilen()
Makroname = „Löschmich“
Suchtext = "Sub " & Makroname & „()“
Set VBE = Application.VBE.ActiveCodePane.CodeModule
FoundFlag = False
With VBE
For x = 1 To .CountOfLines
'MsgBox .Lines(x, 1)
If UCase(.Lines(x, 1)) = UCase(Suchtext) Then
FoundFlag = True
If FoundFlag Then
Zähler = Zähler + 1
ReDim Preserve Zeilen(Zähler)
Zeilen(Zähler) = x
If .Lines(x, 1) = „End Sub“ Then
.DeleteLines Zeilen(1), UBound(Zeilen)
Exit For
End If
End If
Next x
If Not FoundFlag Then MsgBox „Makro " & Makroname & _
" nicht gefunden !“, vbCritical
End With

Eben habe ich genau dieses Listing (s.u.) getestet und erhielt
die Fehlermeldung „Next ohne for …“. Da müsste also noch ein
„Syntax-Error“ drin sein. Nur wo? Ich hab noch die Zeile Exit
For ergänzt um ein vorangesetztes „Then“. Wollte er auch
nicht.

Hi Ludwig,
bitte benutze Einrückungen in den Codes und hier beim Posten den pre-Tag, wird unterhalb des Eingabefensters erklärt.
Du hast 3mal ein If…Then aber nur 2mal End If.
Der Debugger bemerkt das als Fehler, bringt aber leider die irreführende Meldung mit For.
Gruß
Reinhard

Nochmals danke und Gruß
Ludwig

Dim FoundFlag As Boolean
Dim Zeilen()
Makroname = „Löschmich“
Suchtext = "Sub " & Makroname & „()“
Set VBE = Application.VBE.ActiveCodePane.CodeModule
FoundFlag = False
With VBE
For x = 1 To .CountOfLines
'MsgBox .Lines(x, 1)
If UCase(.Lines(x, 1)) = UCase(Suchtext) Then
FoundFlag = True
If FoundFlag Then
Zähler = Zähler + 1
ReDim Preserve Zeilen(Zähler)
Zeilen(Zähler) = x
If .Lines(x, 1) = „End Sub“ Then
.DeleteLines Zeilen(1), UBound(Zeilen)
Exit For
End If
End If
Next x
If Not FoundFlag Then MsgBox „Makro " & Makroname & _
" nicht gefunden !“, vbCritical
End With

Hi Ludwig,
kannst du das Teil mal bei http://www.badango.com o.ä. mal hochladen oder mir schicken.
Persönliche Daten von Schülern kannste ja löschen, so wie alles was nicht mit der Problematik zusammenhängt.
Wichtig ist nur daß der Tabellenaufbau klar erkennbar bleibt.
Insofern reicht mir eine kleine Beispieldatei, brauche da kiene 5MB Datei, die exakt so aufgebaut ist wie das Orginal.
Und falls es da wichtig wäre persönliche Daten einzubringen, Zur Problemlösung brauche ich nicht

 A B C D
1 Name Vorname Tel-Nr
2 Schwarzer Alice 12345678
3

Mir reicht dicke

 A B C D
1 Name Vorname Tel-Nr
2 s a 12 
3

Und mit Teil meine ich die Oberdatei, deshalb auch noch 2 von den Unterdateien, damit ich dann vielleicht besser begreife.
Gruß
Reinhard