asterix2
Goto Top

Nach kopieren einer Tabelle, Makro löschen

Erst einmal wüsche ich allen Mitgliedern hier im Forum eine Frohe Weihnacht. Ich hoffe ich mache alles richtig, denn dies ist mein erster Eintrag in diesem Forum.
Ich nutze einen Code welchen ich nicht selber erstellt habe, welchen ich aber gerne auf meine
Bedürfnisse anpassen würde.

Um folgenden Code dreht sich meine Frage:


Private Sub CommandButton1_Click()
Dim strDateiName As String
Dim strVerzeichnisPfad As String
Dim strSaveDatei As String
Dim bSpeichernDialog As Boolean
Dim bSpeichern As Boolean
bSpeichern = False
Application.DisplayAlerts = False
'Wert True = es wird defintiv gespeichert. False = nichts Speichern
'------------------------------------------------------------------------
'Festlegen ob der Speichern unter Dialog (GetSaveAsFileName) überhaupt aufgerufen werden soll
'Wert auf Flase setzen wenn dies nicht gewünscht wird. Kann auch durch eine Zellabfrage (0 oder 1) erfolgen
'dann bSpeichernDialog = Range("X1") wobei eine 0 Falsch und alles andere Wahr bedeutet. Ansonsten hier Manuell festlegen
bSpeichernDialog = Range("BZ1")
'bSpeichernDialog = False
'------------------------------------------------------------------------
'Verzeichnispfad Vorschlag festlegen
strVerzeichnisPfad = "E:\"
'Dateiname aus Zelle F4 des aktuellen Blatts holen und Datum (Sortierbar) und Dateierweiterung dranhängen. Die yyymmdd ist bei sortierung richtig
strDateiName = Range("AC4") & ("_") & Range("T9") & Format(Date, "_yyyy_mm_dd") & ".xlsm"
'Speicherpfad und Dateiname zusammenfügen
strSaveDatei = strVerzeichnisPfad & strDateiName
'------------------------------------------------------------------------
'Mit dem jetzt vorhandenen Dateiname inkl. Pfad abfragen ob der Speicherort OK ist.
'Dazu das Dialogfenster GetSaveAsFilename aufrufen (Achtung, mus Zwingend Bestätigt werden
'Dies aber nur falls der Dialog abgefragt werden soll. bSpeicherDialog regelt dies über Wahr / Unwahr
If bSpeichernDialog Then
'Dialog zum bestätigen des Speicherorts und Datename aufrufen. Achtung, kann auch mit Abbrechen beendet werden
'Zuweisen des endgültigen Dateinamens oder ein Falsch wenn abbruch
strSaveDatei = SpeichernUnter(strSaveDatei)
'Wurde abgebrochen?
If strSaveDatei = "Falsch" Then
'Es wurde im Speicherdialog auf Abbrechen geklickt. Nichts zu tun und Tschüß
bSpeichern = False
'Exit Sub
'Mit Exit Sub kann hier die gesamte restliche SUB beendet werden. Unschön, aber manchmal nötig
Else
'Im Dialog wurde auf Speichern geklickt
bSpeichern = True
End If
Else
'Der Dialog sollte nicht aufgerufen werden, also wird der DateiPfad und Name als gegeben und nicht änderbar angenommen.
bSpeichern = True
End If
'------------------------------------------------------------------------
'Bestimmen ob dies eine Neue datei oder eine schon vorhandene ist.
'Falls neu, das .SaveAs verwenden. Wen die Datei schon vorhanden ist, wird zwingend ein Dialog wegen überschreibung eingeblendet
'daher falls die Datei schon vorhanden ist, das .Save verwenden was einen Überschreiben Dialog nicht aufruft
Do While bSpeichern
If DateiVorhanden(strSaveDatei) Then
'Datei wird überschrieben OHNE Dialog
ActiveWorkbook.Save
Else
'Datei wird erstmalig erstellt Ohne Dialog
ActiveWorkbook.SaveAs strSaveDatei
End If
bSpeichern = False
Loop

Ich möchte erreichen das die neu erzeugte Mappe keine Makros mehr enthält. Der einfache Weg, unter .xlsx zu speichern
funktioniert nicht. Stelle ich den Code auf .xlsx um folgen Fehlermeldungen.
Gibt es die Möglichkeit, das nach dem erzeugen der neuen Datei, die Makros aus dieser gelöscht werden?
Es wäre ein tolles Weihnachtsgeschenk wenn ihr mir helfen könnt.
Dank schon einmal für eure Mühe.
Gruß Asterix2

Content-Key: 196219

Url: https://administrator.de/contentid/196219

Printed on: April 24, 2024 at 01:04 o'clock

Mitglied: 76109
76109 Dec 24, 2012 at 09:07:47 (UTC)
Goto Top
Hallo Asterix2!

Theoretisch kann man Makros über VBE-Project löschen, allerdings bekomme ich seit Win7 und keinen Zugriff mehr auf VBE-Project und keine Ahnung warum?

Aber ich würde es eh anders machen und zwar in etwa so:

Im Sheet einen Symbolleiste-Formular-Button
Den Sheet-Code in ein Modul (Public Sub) setzen und den Formular Button damit Verknüpfen
Nicht das Workbook speichern, sondern das/die Sheets per Sheets.Copy in eine neue Arbeitsmappe einfügen
Alle Shapes (Buttons) im Active Workbook in Sheet XY (ActiveSheet?) löschen, speichern und schließen
Das Makro-Workbook nicht speichern (.Close False). Wobei, wenn Du die Makro-Datei bearbeiten willst, könntest Du am einfachsten beim Öffnen der Makro-Vorlage eine MsgBox-Abfrage nach dem Motto '... im Edit-Modus öffnen?' Ja/Nein machen und Deinen Save-Parameter damit auf True/False setzen...

Gruß Dieter
Member: Asterix2
Asterix2 Dec 24, 2012 at 10:06:00 (UTC)
Goto Top
Hallo didi1954!

Danke für deine Hilfe. Da ich aber absoluter Laie bin, was das Thema VBA betrifft, fühle ich mich etwas überfordert.
Ich hab zwar schon mal alles gehört, aber das Erstellen des Codes werde ich nicht schaffen. Im IE kann man folgende Codes finden:
Rem Diese Prozedur zum Löschen aufrufen
Sub Alles_löschen()
Call Lösche_Module
Call Lösche_Userformen
Call Lösche_Ereignisprozeduren
End Sub

Sub Lösche_Module()
Rem Löscht Module:
For n = ActiveWorkbook.VBProject.vbComponents.Count To 1 Step -1
If ActiveWorkbook.VBProject.vbComponents(n).Type = 1 Then
ActiveWorkbook.VBProject.vbComponents(n).Collection.Remove _
ActiveWorkbook.VBProject.vbComponents(n)
End If
Next
End Sub

Sub Lösche_Userformen()
Rem Löscht Userforms:
For n = ActiveWorkbook.VBProject.vbComponents.Count To 1 Step -1
If ActiveWorkbook.VBProject.vbComponents(n).Type = 3 Then
ActiveWorkbook.VBProject.vbComponents(n).Collection.Remove _
ActiveWorkbook.VBProject.vbComponents(n)
End If
Next
End Sub

Sub Lösche_Ereignisprozeduren()
Rem Löscht Ereignisprozeduren:
For n = ActiveWorkbook.VBProject.vbComponents.Count To 1 Step -1
For i = 1 To ActiveWorkbook.VBProject.vbComponents(n).CodeModule.CountOfLines
If ActiveWorkbook.VBProject.vbComponents(n).Type <> 1 And _
ActiveWorkbook.VBProject.vbComponents(n).Type <> 3 Then _
ActiveWorkbook.VBProject.vbComponents(n).CodeModule.DeleteLines 1
Next
Next
End Sub
Kann ich die beiden Codes nicht miteinander verknüpfen?
Gruß Asterix2
Mitglied: 76109
76109 Dec 24, 2012 at 10:18:50 (UTC)
Goto Top
Hallo Asterix2!

Na, dann versuch's doch, indem Du den Code in ein Modul kopierst und wenn alles gelöscht werden soll, an entsprechender Stelle die Sub 'Alles_Löschen' aufrufst...

In etwa so (erst mit einer Kopie testen):
Do While bSpeichern
 If DateiVorhanden(strSaveDatei) Then
 'Datei wird überschrieben OHNE Dialog  
Call Alles_Löschen 
ActiveWorkbook.Save
 Else
 'Datei wird erstmalig erstellt Ohne Dialog  
Call Alles_Löschen  
ActiveWorkbook.SaveAs strSaveDatei
 End If
 bSpeichern = False
 Loop

Gruß Dieter
Member: Asterix2
Asterix2 Dec 24, 2012 at 10:45:29 (UTC)
Goto Top
Okay, wenn ich den Code löschen möchte, bevor die neue Mappe geschlossen wird, wie rufe ich dann das Modul auf?
Werden Module überhaupt mit in die neue Mappe kopiert? Bevore_Workbook Close()???