Aktionen

Office:Word2010 VBA Makro sollen sich selbst aus Dokument löschen

Aus znilwiki

Unter http://www.office-loesung.de hat der Benutzer "mumpel" einige VBA Makros für Excel gepostet die ich an Word entsprechend angepasst habe:

Schritt 1: Wir müssen mal wieder an der Makro Sicherheit schrauben.
Es ist natürlich eine "böse" Sache wenn ein Makro anfängt andere zu löschen und dann sich selbst. Word fängt so etwas gleich ab.
Mit folgender Einstellung geht es dann doch:

Zugriff auf das VBA-Projektmodell vertrauen-001.gif

Alternativ direkt den Registry-Key editieren:

HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Word\Security\
AccessVBOM = REG_DWORD 1

an selber Stelle kann auch die Makro Sicherheit heruntergeschaltet werden:

HKEY_CURRENT_USER\Software\Microsoft\Office\14.0\Word\Security\
VBAWarnings = REG_DWORD 1

Die nachfolgenden Makros löschen zunächst alle Module, dann alle Forms (Benutzeroberflächen) und dann alle direkt im Dokument vorhandenen Makros (ThisDocument) - einschließlich sich selbst.
Unter ThisDocument sollten dann auch diese Makros selbst hinterlegt werden.

DeleteAllWordVBAMacros.txt

 Sub DeleteAllWordVBAMacros()
 Rem Ruf die Sub-Routinen nacheinander auf - mit der letzten löschen wir uns auch selbst
     Call Delete_WordModules
     Call Delete_WordUserforms
     Call Delete_WordThisDocumentProcedures
 End Sub
 
 Sub Delete_WordModules()
 Rem Löscht alle im aktiven Dokument hinterlegten Module:
     For n = ActiveDocument.VBProject.vbComponents.Count To 1 Step -1
         If ActiveDocument.VBProject.vbComponents(n).Type = 1 Then
             ActiveDocument.VBProject.vbComponents(n).Collection.Remove ActiveDocument.VBProject.vbComponents(n)
         End If
     Next
 End Sub
 
 Sub Delete_WordUserforms()
 Rem Löscht alle im aktiven Dokument hinterlegten Forms:
     For n = ActiveDocument.VBProject.vbComponents.Count To 1 Step -1
         If ActiveDocument.VBProject.vbComponents(n).Type = 3 Then
             ActiveDocument.VBProject.vbComponents(n).Collection.Remove ActiveDocument.VBProject.vbComponents(n)
         End If
     Next
 End Sub
 
 Sub Delete_WordThisDocumentProcedures()
 Rem Löscht alle Makros aus dem Bereich "ThisDocument"
     For n = ActiveDocument.VBProject.vbComponents.Count To 1 Step -1
         For i = 1 To ActiveDocument.VBProject.vbComponents(n).CodeModule.CountOfLines
             If ActiveDocument.VBProject.vbComponents(n).Type <> 1 And ActiveDocument.VBProject.vbComponents(n).Type <> 3 Then _
                 ActiveDocument.VBProject.vbComponents(n).CodeModule.DeleteLines 1
         Next
     Next
 End Sub


Anonymer Benutzer #1

60 Monaten zuvor
Punktzahl 0++
Vielen Dank, super Code, hat mir gerade sehr genützt...

Anonymer Benutzer #2

57 Monaten zuvor
Punktzahl 0++

Vielen Dank,

saubere Sache. Dafür jetzt eine kleine Ergänzung:

Sub Delete_WordClasses() Rem Löscht alle im aktiven Dokument hinterlegten Klassen: For n = ActiveDocument.VBProject.vbComponents.Count To 1 Step -1 If ActiveDocument.VBProject.vbComponents(n).Type = 2 Then ActiveDocument.VBProject.vbComponents(n).Collection.Remove ActiveDocument.VBProject.vbComponents(n) End If Next End Sub

Die Aufrufe müssen natürlich entsprechend angepasst werden, im Modul Delete_WordThisDocumentProcedures() muss man natürlich noch der Type 2 abgefragt werden.

Harry
Kommentar hinzufügen
znilwiki freut sich über alle Kommentare. Sofern du nicht anonym bleiben möchtest, trage deinen Namen oder deine Email-Adresse ein oder melde dich an. Du kannst das Feld auch einfach leer lassen.