Modul aus Datei per VBa entfernen

Grüezi Wissende,

für eine Anfrage im Brett Programmierung (Betreff: Batch: Datei …)
habe ich u.a. auch diesen Code gebastelt.

Es soll die Datei unter anderem Namen per Vba abgespeichert werden. Klappt auch. Problemchen ist noch, unnötigerweise werden die Makros in der Datei mitabgespeichert, wie lösche ich die denn?

Liegt es daran, daß Vba nicht kompiliert sondern interprtiert und sich nicht selbst löschen kann?

Achja, der Code wird in dem Before_Close-Ereignis der Mappe durch Call gestartet, diese Zeilen müßen natürlich auch weg in der erzeugten Datei.

Prinzipiell weiß ich wie das geht Zeilen in einem Modul zu löschen. Aber da ich noch am Löschen von Modul1 festhänge habe ich es nohc nicht probiert, deshalb ist ja nicht ausgeschlodssen daß ich da auch auf gleiche Schwierigkeiten stoße.

Fehlermeldung kommt keine. Benutze ich die Msgbox so wird die Meldung zweimal ausgegeben und es erscheint korrekterweise der name der erzeugten Datei.
Warum zweimalige Ausgabe ist mir schleierhaft, habe da wohl gewaltige Lücken im Wissen wie Excel da genau beim Abarbeiten von Vba-Code vorgeht.

Code von modul1:

Option Explicit
'
Sub Speichern2()
Dim Dateiname As String
Const Pfad As String = "c:\test\"
With ThisWorkbook
 .Save
 If .Name "kwdoc.xls" Then Exit Sub
 Dateiname = Left(.Name, Len(.Name) - 4) & Format(Date, "yyyymmdd") & ".xls"
 Application.DisplayAlerts = False
 .SaveAs Filename:=Pfad & Dateiname
 Application.DisplayAlerts = True
End With
With ActiveWorkbook
 'MsgBox .Name
 .VBProject.VBComponents.Remove .VBProject.VBComponents("Modul1")
 .Close savechanges:=True
End With
End Sub

Danke ^ Gruß
Reinhard

Nachtrag
Hallo Interesierte,

bitte keine Alternativangebote wie man das Problem der anderen Betragsfolge anders angehen könnte, alle Blätter in eine neue Datei kopieren oder so.

Mir geht es nur noch um das Problem wie beschrieben Modul1 zu löschen.

Und ich bin an Tipps, Links (sehr gerne in Deutsch *gg*) interessiert, wie denn der genaue Ablauf ist wenn Excel ein Makro startet.

Bisher weiß ich nur (glaube zu wissen) ein Teil des Codes wird kompilert, Platz für die Variablen geschaffen, der Rest wird dann interpretiert so wie beim Uralt basic.

Das hatte damals den Vorteil, daß man während des Programmablaufs noch den Code selbst Byteweise abändern konnte mittels „Poke“.

Mir fiel gerade als noch ungetesteter workaround ein in dem Modul1 mit Run ein Makro in der personl.xls zu starten was dann Modul1 löschen soll, mal schauen ob das klappt.
Das kann ich aber erst heute Abend testen.

Gruß
Reinhard

Grüezi Reinhard :smile:)

Es soll die Datei unter anderem Namen per Vba abgespeichert
werden. Klappt auch. Problemchen ist noch, unnötigerweise
werden die Makros in der Datei mitabgespeichert, wie lösche
ich die denn?

Achja, der Code wird in dem Before_Close-Ereignis der Mappe
durch Call gestartet, diese Zeilen müßen natürlich auch weg in
der erzeugten Datei.

Du darfst dann nicht Code in der soeben kopierten Mappe aufrufen, sondern IMO solchen der in der steuernden enthalten ist - dann sollte/müsste das eigentlich klappen.

Schau mal ob dir das folgende weiterhilft:

Sub NoModuls()
Dim x As Integer, t As Integer, Z As Integer, VW As Workbook
 If MsgBox("Achutung!" & Chr(10) & "Alle Module in der zweiten geöffneten Mappe werden gelöscht!" & Chr(10) & "Wollen Sie weiterfahren?", vbYesNo, "Warnung") = vbNo Then Exit Sub
 On Error Resume Next
 VW = ActiveWorkbook.Name
 Application.ScreenUpdating = False
 Windows(2).Activate
 If ActiveWorkbook.Name = VW Then
 Windows(1).Activate
 End If
 x = 1
 Z = ActiveWorkbook.VBProject.VBComponents.Count
 If Z \> 0 Then
 While x VW Then
 ActiveWorkbook.Save
 End If
 End If
 Windows(2).Activate
 If ActiveWorkbook.Name VW Then
 Windows(1).Activate
 End If
 ActiveWorkbook.Saved = True
 ActiveWorkbook.Close
 Application.ScreenUpdating = True
End Sub

Mit freundlichen Grüssen
Thomas Ramel

  • MVP für Microsoft-Excel -
    [Win XP Pro SP-2 / xl2003 SP-3]

Moin Thomas,

Es soll die Datei unter anderem Namen per Vba abgespeichert
werden. Klappt auch. Problemchen ist noch, unnötigerweise
werden die Makros in der Datei mitabgespeichert, wie lösche
ich die denn?

Du darfst dann nicht Code in der soeben kopierten Mappe
aufrufen, sondern IMO solchen der in der steuernden enthalten
ist - dann sollte/müsste das eigentlich klappen.

*aargs*, nicht meine Uhrzeit, brauch erstmal nen Kaffee, nur ein Satz und mein Kopf ist voll mit Fragezeichen.

Aber auch mit Ausrufungszeichen *gg*
Ich habe ja eine steuernde Datei, nennen wir sie mal „Original“, darin ist Code den ich starte, im Code steht, speichere diese Datei unter dem Namen „Kopie“ ab, dann lösche in „Kopie“ das Modul1".

Insofern bin nicht ich das, der Code in „Kopie“ aufruft, wenn dann Excel.
Ich starte einzig einmalig eine Prozedur in „Original“ *rausrede*

Warum die MsgBox 2mal kommt verstehe ich nicht, in beiden Dateien, die ich ja per Code schließe steht ja im Ereignis „Before_Close“ der Aufruf der MsgBox, das wäre ja verständlich daß die MsgBox deshalb 2mal kommt, aber vor der MsgBox steht auch im Code, wenn die aktuelle Mappe nicht „Kopie“ heißt, so mache nix.
Ergo, warum kommt die MsgBox 2mal ist für mich noch nicht gelöst.

Deinen Code schaue ich mir gleich/nachher an, danke erstmal.

Gruß
Reinhard

Grüezi Reinhard

Es soll die Datei unter anderem Namen per Vba abgespeichert
werden. Klappt auch. Problemchen ist noch, unnötigerweise
werden die Makros in der Datei mitabgespeichert, wie lösche
ich die denn?

Du darfst dann nicht Code in der soeben kopierten Mappe
aufrufen, sondern IMO solchen der in der steuernden enthalten
ist - dann sollte/müsste das eigentlich klappen.

*aargs*, nicht meine Uhrzeit, brauch erstmal nen Kaffee, nur
ein Satz und mein Kopf ist voll mit Fragezeichen.

Wenn man nicht überzeugen kann, dann soll man wenigstens verwirren!

-)

Aber auch mit Ausrufungszeichen *gg*
Ich habe ja eine steuernde Datei, nennen wir sie mal
„Original“, darin ist Code den ich starte, im Code steht,
speichere diese Datei unter dem Namen „Kopie“ ab, dann lösche
in „Kopie“ das Modul1".

Insofern bin nicht ich das, der Code in „Kopie“ aufruft, wenn
dann Excel.

Das ist (in diesem speziellen Fall) im Endeffekt dasselbe.

Ich starte einzig einmalig eine Prozedur in „Original“
*rausrede*

stattgegeben.
Doch Du arbeitest mit ActiveWorkbook - das ist IMO (fast) so schlimm wie .Select.

Wie wäre es, wenn Du die kopierte Mappe als Objekt referenzierst?
Dann kannst Du aus der steuernden Mappe immer direkt und sicher darauf zugreifen ohne dass das ActiveWorkbook eine Rolle spielt.

Warum die MsgBox 2mal kommt verstehe ich nicht, in beiden
Dateien, die ich ja per Code schließe steht ja im Ereignis
„Before_Close“ der Aufruf der MsgBox, das wäre ja verständlich
daß die MsgBox deshalb 2mal kommt, aber vor der MsgBox steht
auch im Code, wenn die aktuelle Mappe nicht „Kopie“ heißt, so
mache nix.
Ergo, warum kommt die MsgBox 2mal ist für mich noch nicht
gelöst.

Darüber habe ich mir (faul wie ich nun mal bin) (noch) keine weiteren Gedanken gemacht - ich habe versucht das Problem prinzipiell zu sehen.

Besteht vielleicht die Möglichkeit, die Kopie im xl5-Format zu speichern? Dann wären alle Makros entfernt und die Mappe wäre ‚sauber‘.

Mit freundlichen Grüssen
Thomas Ramel

  • MVP für Microsoft-Excel -
    [Win XP Pro SP-2 / xl2003 SP-3]

OT
Grüezi Thomas,

Wenn man nicht überzeugen kann, dann soll man wenigstens
verwirren!

-)

jepp ich kenne das so:

Besser eine starke Behauptung als ein schwacher Beweis.

Danke für den Tipp mit XL5 muß ich aml testen.

Gruß
Reinhard