Translate

Freitag, 21. Oktober 2016

WORD Add-In: Funktionalitäten automatisch ausführen sobald ein beliebiges Dokument geöffnet wird


Kürzlich kam die Anforderung auf, das jedes Dokument was geöffnet wird, standardmäßig immer auf 160% automatisch gezoomt werden soll.

Nun ich habe leider keine Einstelloption in Word gefunden, daher habe ich mir kurzerhand ein Add-in geschrieben, welches genau diese (oder auch andere) Aufgabe übernimmt.

Mein erstelltes Add-in kann hier heruntergeladen werden.

Die Datei DefaultFunctions.dotm muss nun einfach in den AutoStart-Ordner von Word gespeichert werden. Dieser müsste standardmäßig der folgende sein:
C:\Users\username\AppData\Roaming\Microsoft\Word\STARTUP

Alternativ kann dieser in Word in den Optionen nachgeschaut werden:
Datei/Optionen/Erweitert/Dateispeicherorte…/AutoStart/Ändern

Jetzt noch Word einmal schließen und neu Starten und schon sollte die Funktionalität aktiv sein.

Die Technik dahinter:
Die Datei DefaultFunctions.dotm wird automatisch geöffnet, sobald Word gestartet wurde, da sie sich ja im AutoStart-Ordner befindet.

In dieser Datei befindet sich eine AutoExec-Prozedur, die (wie der Name es schon ausdrückt) automatisch ausgeführt wird, sobald die Datei geöffnet wurde.

In dieser Prozedur wird eine Klasse instanziiert, welche die Aufgabe hat, die Ereignisse von Word abzufangen und dann dort was zu machen. Uns interessiert hier das Ereignis DocumentOpen, welches ausgelöst wird, sobald eine Datei in Word geöffnet wurde.

Hier der Code dazu:
Option Explicit
    Const ZoomPercentage As Long = 160
    Private cWatcher As clsWatchWD 'Hier wird die Klasse im Speicher gehalten

Public Sub AutoExec()
'Diese Prozedur wird automatisch nach dem Öffnen ausgeführt
    Set cWatcher = New clsWatchWD 'Die Klasse wird instanziiert, somit werden die Ereignisse der aktuellen Word-Instanz in dieser abgefangen (siehe Klasse)
    cWatcher.SetZoomPercentage = ZoomPercentage 'des Wertes für den Zoomfaktor
End Sub

Hier der Code von unserer Klasse clsWatchWD, die den eigentlich Job macht:
Option Explicit
    Private WithEvents cWD As Word.Application 'Durch WithEvents erhalten wir eine ereignisfähige Objektvariable

    Dim cZoomPercentage As Long

Public Property Let SetZoomPercentage(T As Long)
    cZoomPercentage = T 'Übergabe des Wertes für den Zoomfaktor
End Property

Private Sub Class_Initialize()
'Beim instanziieren der Klasse, wird diese Prozedur automatisch ausgeführt
    Set cWD = Application 'Die aktuelle Word-instanz wird in der Ereignisfähigen Objektvariable cWD gespeichert
End Sub

Private Sub cWD_DocumentOpen(ByVal Doc As Document)
'Diese Ereignis-Prozedur wird automatisch ausgeführt, nach dem ein Dokument geöffnet wurde
'Die Variable Doc verweis auf das gerade geöffnete Dokument
'Diese Prozedur kann mit weiteren gewünschten Befehlen erweitert werden...
    With Doc
        'Dieser Abschnitt stellt die Ansicht auf Seitenlayout um, falls dies nicht der Fall sein sollte
        If .ActiveWindow.View.SplitSpecial = wdPaneNone Then
            .ActiveWindow.ActivePane.View.Type = wdPrintView
        Else
            .ActiveWindow.View.Type = wdPrintView
        End If
        'Hier wird das aktuelle Fenster auf den gewünschten Wert gezoomt
        .ActiveWindow.ActivePane.View.Zoom.Percentage = cZoomPercentage
    End With
End Sub

Der Code kann in der Datei eingesehen und angepasst werden, dazu die Datei nicht direkt öffnen, sondern aus dem Windows Explorer mit rechter maustaste und Befehle Öffnen laden.
Mit der bekannten Tastenkombi ALT+F11 wird in den VBA-Editor gewechselt und der Code kann eingesehen und geändert werden.

In der Klasse können noch weitere Ereignis-Prozeduren angelegt werden, je nach Wunsch. z.B. Newdocument, wenn nach dem Erstellen eines neuen Dokumentes was passieren soll.
Oder DocumentBeforeClose, wenn beim Schließen eines Dokumentes was passieren soll, usw...