Makros
Auf dieser Seite
Mit Bild
Es gibt viele Gelegenheiten, bei denen Sie per VBA die internen Word-Befehle gegen eigene austauschen müssen, etwa wenn Sie bei jedem Ausdruck mitzählen wollen, dass nicht zu viele Kopien erstellt werden. Dazu sollten Sie die verschiedenen Techniken von speziellen Prozeduren bis hin zur Ereignis-Programmierung kennen, die Ihnen jeden Eingriff in Word erlauben.
Mit Bild
Keine Anleitung zur Viren-Programmierung
Seit Makro-Viren praktisch täglich in irgendwelchen eMail-Anhängen enthalten sind, haben automatische Makros und Ereignisse einen sehr schlechten Ruf bekommen. Deswegen sei hier direkt vorangestellt: es geht nicht um eine Anleitung zur Virenprogrammierung. Abgesehen davon ist ein Makro-Virus so einfach zu programmieren, dass technisch darin keine Herausforderung besteht, wie Sie gleich sehen werden.
Mit Bild
Ein Virus?
Schreiben Sie in einem beliebigen Modul einer Word-Datei eine Prozedur mit dem reservierten Namen AutoOpen wie im folgenden Code:
Mit Bild
Sub AutoOpen() MsgBox "Hallo!" End Sub
Mit Bild
Wenn statt eines freundlichen "Hallo" nun eine böswillige Aktion wie Kill "C:\tmp\datei.txt" gestartet worden wäre, hätten Sie soeben einen Makro-Virus programmiert. Der Aufwand ist also nicht besonders hoch.
Mit Bild
Eine solche Aktion lässt sich aber genauso gut oder schlecht von einem Menüeintrag oder einer Schaltfläche aus starten. Daher sind automatische Makros nicht an sich gefährlich, sondern deren Inhalt und Absicht bestimmen die Gefährlichkeit. Die Technik selbst ist neutral.
Mit Bild
Automatischen Aufruf verhindern
Im Übrigen kann jeder Benutzer die Ausführung von automatischen Makros immer ganz einfach verhindern.
Wenn beim Öffnen einer Datei die Umschalt-(Shift-)Taste gedrückt gehalten wird, werden automatische Makros nicht ausgeführt. Dies funktioniert bereits seit Word 97, ist unabhängig von irgendwelchen Makrovirenschutz-Einstellungen und sollte eigentlich selbstverständlich beim Öffnen jeder unbekannten Datei sein.
Mit Bild
Verschiedene Auto-Makros
Dabei tritt dieses Problem nicht nur beim Öffnen einer Datei mit AutoOpen auf, sondern je nach Word-Version auch bei anderen Anlässen. Bereits seit Word 97 reagieren ganz normale Prozeduren mit jeweils reservierten Namen:
AutoExec: beim Öffnen eines AddIns
AutoNew: beim Erstellen eines neuen Dokuments auf Grundlage dieser Dokumentvorlage
AutoOpen: beim Öffnen eines Dokuments
AutoClose: beim Schließen eines Dokuments
AutoExit: beim Schließen eines AddIns
Sie funktionieren auch heute noch, obwohl sie konzeptionell veraltet sind und daher nicht mehr eingesetzt werden sollten. Vor allem dürfen sie nicht mehrfach gleichnamig in unterschiedlichen Modulen enthalten sein, weil dann nur eines davon ausgeführt würde.
Mit Bild
Welches Makro wo speichern?
Die Prozeduren AutoExec, AutoNew und AutoExit müssen immer in Dokumentvorlagen gespeichert sein. Dabei werden AutoExec und AutoExit nur ausgeführt, wenn diese Dokumentvorlage als AddIn geöffnet wird. Das funktioniert gleichermaßen durch Speicherung im Word-AutoStart-Ordner oder explizites Einbinden mittels Menü Extras/Vorlagen und AddIns und dort mit der Schaltfläche Hinzufügen.
Mit Bild
Makros nicht in der Normal.dot speichern
Das AddIn Normal.dot ist übrigens in diesem Zusammenhang nur eines von vielen möglichen AddIns. Es ist aber grundsätzlich keine gute Idee, speziell dieses mit Makros zu überfrachten. Besser ist immer ein eigenes AddIn je Aufgabe, dann lassen sich die eigenen Makros bei Bedarf auch leichter entfernen und werden vor allem nicht von fremden AddIns überschrieben.
Mit Bild
AutoOpen und AutoClose starten dann automatisch, wenn das betreffende Dokument als Datei geöffnet bzw. geschlossen wird. Dabei kann es für AutoOpen sowohl eine Dokumentvorlage als auch eine normale Datei sein, solange Sie den Befehl Datei/Öffnen benutzen.
Mit Bild
Sonderfälle AutoOpen und AutoClose
Die Prozedur AutoOpen reagiert sowohl beim Öffnen einer Datei, wenn das Makro im Dokument selbst enthalten ist, als auch dann, wenn das Makro in seiner Dokumentvorlage steht. Gleiches gilt für AutoClose.
Eventuell muss Ihr Makro also überprüfen, von wo aus dieses Öffnen beziehungsweise Schließen veranlasst wurde, wie im folgenden Listing zu sehen ist:
Mit Bild
Sub AutoOpen() 'Aktive Datei mit Vorlage vergleichen If ActiveDocument Is ThisDocument Then MsgBox "Die Vorlage mit dem Namen " & ThisDocument.Name & " selber wird als Datei geöffnet." Else MsgBox "Ein Dokument basierend auf der Vorlage " & ThisDocument.Name & " wird geöffnet." End If End Sub
Mit Bild
Bei AutoClose gilt es zusätzlich zu berücksichtigen, wann es aufgerufen wird. Wenn die Datei nämlich noch Änderungen enthält, erscheint normalerweise die Speicher-Abfrage wie im folgenden Bild. Da AutoClose aber vorher abläuft, können Sie rechtzeitig darauf reagieren.
Mit Bild
Automatischer Sicherheits-Dialog beim Schließen geänderter Dateien
Mit Bild
Word-Speichern-Anfrage umgehen
Wenn Sie für Dokumente bestimmte Dateinamen vorschlagen oder Dateien einfach mit Datum und Uhrzeit benennen wollen, kann dies wie im folgenden Code beim Schließen geprüft werden:
Mit Bild
Sub AutoClose() Dim strName As String 'eindeutigen Namen aus Datum/Uhrzeit zusammensetzen 'das Verzeichnis muss existieren strName = "C:\Briefe\Dok_" & Format(Date, "yyyymmdd_hhmmss") &".doc" If ActiveDocument.Saved Then MsgBox "Datei ist bereits gespeichert." Else If Len(ActiveDocument.Path) = 0 Then 'neues Dokument, da noch nie gespeichert With Dialogs(wdDialogFileSaveAs) .Name = strName 'SpeichernUntern-Dialog anzeigen .Show SendKeys "{ESC}" End With Else 'vorhandenes Dokument mit Änderungen Select Case MsgBox("Neue Version speichern?", vbQuestion + vbYesNoCancel) Case vbYes 'mit neuem Namen speichern ActiveDocument.SaveAs strName Case vbNo 'mit vorhandenem Namen speichern ActiveDocument.Save Case vbCancel 'nix tun, aber ÄnderungenSpeichern-Dialog verschwinden lassen! SendKeys "{ESC}" End Select End If End If End Sub
Mit Bild
Dabei wird zuerst geprüft, ob das Dokument bereits gespeichert ist. Wenn es nicht gespeichert ist, kann es ein ganz neues oder ein vorhandenes mit Änderungen sein. Neue Dokumente erkennen Sie daran, dass die Path-Eigenschaft leer ist.
Für diesen Fall wird der Windows-übliche DateiSpeichernUnter-Dialog angeboten, allerdings bereits mit einem Namensvorschlag für die neue Datei. Der Benutzer könnte diesen übrigens ändern oder sogar den Dialog ganz abbrechen. Das wird hier nicht weiter berücksichtigt, um nur die prinzipielle Vorgehensweise zu zeigen.
Wenn es sich um ein geändertes Dokument handelt, gibt es drei Optionen: neue Version, bisheriger Dateiname und Abbruch. Das Hauptproblem besteht dabei im Abbruch, also dem Offenhalten der Datei ohne irgendeine Speicherung.
Beim Schließen käme nämlich anschließend von Word der im ersten Bild gezeigte, automatische Dialog mit der Speichern-Anfrage. Dieser lässt sich nicht sauber deaktivieren, daher der unschöne SendKeys-Befehl, der per Escape-Taste diesen folgenden Dialog bedient. Das geht so schnell, dass der Benutzer nichts davon sieht.