Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
Event-Handling und Command-Modifying
zurück: Thunderbird-Adressbuch für Seriendruckbrief verwenden weiter: WORD SHORTCUTS Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Tutorial Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
KeepCoolMan
VBA-NonExpert ;) Office 2010


Verfasst am:
14. Nov 2010, 14:31
Rufname: Thomas
Wohnort: Celle


Event-Handling und Command-Modifying - Event-Handling und Command-Modifying

Nach oben
       Version: Office 2010

Event-Handling und Command-Modifying

Word-Standard-Ereignisse einer Applikation und Word-Befehle mit VBA auswerten, abfangen und ändern

Es gibt in VBA mehrere Möglichkeiten, um Ereignisse (Events) und Befehle (Commands) seinen Wünschen entsprechend anzupassen oder sie zu nutzen.
Ich möchte hier das Event-Handling und das Command-Modifying beschreiben. Sie unterscheiden sich in den Events, die behandelt werden können. In erster Linie jedoch wie folgt:
  • Beim Event-Handling wird das eigentliche Ereignis erweitert (Extending), aber trotzdem noch ausgeführt, wenn es nicht explizit abgebrochen wird.
  • Das Command-Modifying überschreibt (Overriding) das eigentliche Ereignis oder den Befehl und überlässt die Ausführung gänzlich dem Programmierer.

Edit: Dank eines Hinweises von r.mueller hier ein wichtiger Zusatz:
Die Nutzung der Events hat den positiven Nebeneffekt, dass bei deaktivierten Makros die Word-eigenen Standard-Makros weiterhin funktionieren, die überschriebenen Commands aber zu einem Laufzeitfehler führen.
Beispiel: Speichern wird abgefangen
Wird der Event-Handler benutzt und die Makros werden deaktiviert, dann "merkt" Word gar nicht mehr, dass es einen anderen Event-Handler gibt (weil er ja gar nicht instanziiert werden konnte) und berücksichtigt ihn natürlich auch nicht.
Wird das Command überschrieben, ist dafür keine Instanziierung erforderlich und Word findet automatisch das "neue" Makro, kann es aber nicht ausführen, was zum Laufzeitfehler führt.


I. Event-Handling
Um Events zu erweitern, muss der Applikation eine Klasse hinzugefügt werden, in der die Events abgefangen werden und dann erweitert werden können. Von dieser Klasse muss dann im Projekt eine Instanz korrekt initialisiert werden – sie muss instanziiert werden.

Ablauf

    1. Zuerst wird ein Klassenmodul im Projekt definiert (Einfügen -> Klassenmodul) und erhält einen aussagekräftigen Namen, in diesem Beispiel myEvents.

    2. In dieser Klasse wird eine Klasseneigenschaft (Property) für das Event-Handling mit dem Schlüsselwort WithEvents deklariert.

    Klassenmodul myEvents:
    Code:
    Public WithEvents myEventHandling As Word.Application


    3. Nun werden die Events in der jeweiligen Routine (Sub) behandelt. Das zu behandelnde Event wird dabei mit einem Unterstrich an die definierte Variable angehängt und es folgt der Code, der das Event behandelt.

    Klassenmodul myEvents:
    Code:
    Private Sub myEventHandling_DocumentBeforeSave( _
                                          ByVal Doc As Document, _
                                          SaveAsUI As Boolean, _
                                          Cancel As Boolean)
         '
         ' Code
         '
    End Sub

    Die Parameter sind abhängig vom Event. Eine Auflistung der Events und der zugehörigen Parameter findest du weiter unten. Wichtigster Parameter ist Cancel. Wird dieser Parameter im Code auf True gesetzt, dann wird die Ausführung des Events durch Word abgebrochen und nur der eigene Code abgearbeitet.

    4. Abschließend wird die Klasse im Projekt instanziiert und eine Applikations-Variable mit der eigenen Event-Handling-Eigenschaft definiert. Dies geschieht in der Regel in einem Auto-Makro beim Öffnen der Datei, kann aber in jedem Modul erfolgen. Wichtig ist nur, dass dieser Code erst aufgerufen werden muss, bevor die Events behandelt werden können.

    ThisDocument:
    Code:
    Dim myApplication As New myEvents

    Code:
    Sub AutoOpen()
       Set myApplication.myEventHandling = Word.Application
    End Sub
In diesem Beispiel wird nun jedes Mal vor dem Speichern des Dokumentes die Routine myEventHandling_DocumentBeforeSave aufgerufen. Dies geschieht sowohl beim Menü-Aufruf Speichern oder Speichern unter als auch beim automatischen Speichern.

Dabei wird das Dokument selbst (Doc) und über die Variable SaveAsUI die Information, ob der Aufruf durch Speichern oder Speichern unter erfolgte, übergeben. Über die Variable Cancel kann dann Word mitgeteilt werden, ob das Word-eigene Speichern bzw. Speichern unter nach Abarbeitung des Codes noch erfolgen soll oder nicht. Default-Wert für Cancel ist False, also wird es erfolgen.

Auflistung der Application-Event-Handler (Word 2010)
    • _DocumentBeforeClose(ByVal Doc As Document, Cancel As Boolean)
    • _DocumentBeforePrint(ByVal Doc As Document, Cancel As Boolean)
    • _DocumentBeforeSave(ByVal Doc As Document, SaveAsUI As Boolean, Cancel As Boolean)
    • _DocumentChange()
    • _DocumentOpen(ByVal Doc As Document)
    • _DocumentSync(ByVal Doc As Document, ByVal SyncEventType As Office.MsoSyncEventType)
    • _EPostageInsert(ByVal Doc As Document)
    • _EPostageInsertEx(ByVal Doc As Document, ByVal cpDeliveryAddrStart As Long, ByVal cpDeliveryAddrEnd As Long, ByVal cpReturnAddrStart As Long, ByVal cpReturnAddrEnd As Long, ByVal xaWidth As Long, ByVal yaHeight As Long, ByVal bstrPrinterName As String, ByVal bstrPaperFeed As String, ByVal fPrint As Boolean, fCancel As Boolean)
    • _EPostagePropertyDialog(ByVal Doc As Document)
    • _MailMergeAfterMerge(ByVal Doc As Document, ByVal DocResult As Document)
    • _MailMergeAfterRecordMerge(ByVal Doc As Document)
    • _MailMergeBeforeMerge(ByVal Doc As Document, ByVal StartRecord As Long, ByVal EndRecord As Long, Cancel As Boolean)
    • _MailMergeBeforeRecordMerge(ByVal Doc As Document, Cancel As Boolean)
    • _MailMergeDataSourceLoad(ByVal Doc As Document)
    • _MailMergeDataSourceValidate(ByVal Doc As Document, Handled As Boolean)
    • _MailMergeDataSourceValidate2(ByVal Doc As Document, Handled As Boolean)
    • _MailMergeWizardSendToCustom(ByVal Doc As Document)
    • _MailMergeWizardStateChange(ByVal Doc As Document, FromState As Long, ToState As Long, Handled As Boolean)
    • _NewDocument(ByVal Doc As Document)
    • _ProtectedViewWindowActivate(ByVal PvWindow As ProtectedViewWindow)
    • _ProtectedViewWindowBeforeClose(ByVal PvWindow As ProtectedViewWindow, ByVal CloseReason As Long, Cancel As Boolean)
    • _ProtectedViewWindowBeforeEdit(ByVal PvWindow As ProtectedViewWindow, Cancel As Boolean)
    • _ProtectedViewWindowDeactivate(ByVal PvWindow As ProtectedViewWindow)
    • _ProtectedViewWindowOpen(ByVal PvWindow As ProtectedViewWindow)
    • _ProtectedViewWindowSize(ByVal PvWindow As ProtectedViewWindow)
    • _Quit()
    • _WindowActivate(ByVal Doc As Document, ByVal Wn As Window)
    • _WindowBeforeDoubleClick(ByVal Sel As Selection, Cancel As Boolean)
    • _WindowBeforeRightClick(ByVal Sel As Selection, Cancel As Boolean)
    • _WindowDeactivate(ByVal Doc As Document, ByVal Wn As Window)
    • _WindowSelectionChange(ByVal Sel As Selection)
    • _WindowSize(ByVal Doc As Document, ByVal Wn As Window)
    • _XMLSelectionChange(ByVal Sel As Selection, ByVal OldXMLNode As XMLNode, ByVal NewXMLNode As XMLNode, Reason As Long)
    • _XMLValidationError(ByVal XMLNode As XMLNode)



II. Command-Modifying
Beim Command-Modifying handelt es sich um das Modifizieren und Überschreiben der Word-eigenen Befehle. Dies ist relativ einfach und in zwei Varianten realisierbar.
    1. Im Projekt wird in einem Modul eine Prozedur (Methode) geschrieben, die den gleichen Namen hat wie die Word-eigene Prozedur oder

    2. im Projekt wird ein Modul erstellt, welches den gleichen Namen hat, wie die Word-eigene Prozedur und in diesem Modul wird eine Prozedur mit dem Namen Main implementiert.

Wichtig sind hierbei zwei Dinge:
    • Die Methode hat Vorrang vor dem Modul. Das bedeutet, wenn in einem Modul eine Methode mit z. B. dem Namen DateiSpeichernUnter geschrieben wurde und gleichzeitig ein Modul mit dem Namen DateiSpeichernUnter mit einer Prozedur Main existiert, so wird nur die Methode DateiSpeichernUnter ausgefüht. Das Modul bleibt unberücksichtigt.

    • Wird eine Methode oder ein Modul zum Überschreiben der Word-eigenen Funktion geschrieben, dann wird die Word-eigene Funktion nicht mehr ausgeführt, sondern ausschließlich die selbst geschriebene Funktion.

Beispiel:

Es wird ein Modul DateiSpeichernUnter angelegt. In dieses Modul wird die Prozedur Main implementiert:

Modul DateiSpeichernUnter:
Code:
Sub main()
     MsgBox "MODUL DateiSpeichernUnter"
End Sub

Nun wird beim Menü-Aufruf Speichern unter die Meldung
Zitat:
MODUL DateiSeichernUnter
ausgegeben. Die Dialogbox Speichern unter erscheint jedoch nicht mehr, da dies nicht im Code implementiert ist.

Nun wird zusätzlich in einem beliebigen Modul eine Prozedur DateiSpeichernUnter implementiert.

Methode DateiSpeichernUnter:
Code:
Sub DateiSpeichernUnter()
     MsgBox "METHODE DateiSpeichernUnter"
End Sub

Jetzt erscheint beim Menü-Aufruf Speichern unter nur die Meldung
Zitat:
METHODE DateiSpeichernUnter
aus dieser Prozedur. Weder das gleichnamige Modul wird aufgerufen, noch die Dialogbox erscheint.


Eine Auflistung der überschreibbaren Word-Befehle findest du in der Makros-Dialogbox, wenn du dort neben Makros in: den Eintrag Word-Befehlen auswählst.

Wenn die entsprechenden Makronamen als Methode oder Modul verwendet werden, wird der Word-Befehl überschrieben und nur noch dein Code ausgeführt.


Wie immer freue ich mich über Feedback, Verbesserungs- und Korrekturvorschläge!

_________________
Gruß Thomas

Ich freue mich über Feedback, Kritik und Verbesserungsvorschläge...
Wer will, findet Möglichkeiten; wer nicht will, findet Gründe! :: Unt wär Rächdshraibfela fint, daaf sie behaltn!



Event-Handling und Command-Modifying.pdf
 Beschreibung:
Word-Standard-Ereignisse einer Applikation und Word-Befehle mit VBA auswerten, abfangen und ändern

Download
 Dateiname:  Event-Handling und Command-Modifying.pdf
 Dateigröße:  482.38 KB
 Heruntergeladen:  111 mal

Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: HTML Editoren Forum