Interne Word-Befehle ersetzen und Ereignisse abfangen

Makros

∅ 1 / 1 Bewertungen

Makros

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.

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.

Ein Virus?

Schreiben Sie in einem beliebigen Modul einer Word-Datei eine Prozedur mit dem reservierten Namen AutoOpen wie im folgenden Code:

Sub AutoOpen()
	MsgBox "Hallo!"
End Sub

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.

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.

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.

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.

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.

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.

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.

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:

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

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.

58255_speichern01-png

Automatischer Sicherheits-Dialog beim Schließen geänderter Dateien

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:

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

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.