Barvna shema: Riviera
Trenutno dejavna stran: start » de » Dokumentation » Werkzeuge für Microsoft Access » WKL Forms Object Library » troubleshooting » Eine Ereignisprozedur wird nie aufgerufen

Eine Ereignisprozedur wird nie aufgerufen

Eine Prozedur wie Grid1_RowClick oder btnSave_Click steht im Formularmodul, aber wenn der Benutzer das Steuerelement bedient, geschieht nichts – kein Haltepunkt wird erreicht, kein Meldungsfeld erscheint.

Umgebung

Jedes WKL-Steuerelement und -Objekt, jedes Release, Microsoft 365 Access (Vollversion und Runtime) sowie UserForms in Excel und Word.

Ursache

Einer dieser Fälle, die häufigsten zuerst:

  • Das Formularmodul lässt sich nicht kompilieren. Ein Modul mit einem Kompilierfehler an beliebiger Stelle erhält überhaupt kein Ereignis, und Access meldet das nirgends, bis das Modul kompiliert wird: Ein per Automatisierung aufgerufenes DoCmd.OpenForm kehrt zurück, ohne das Formular zu öffnen, und RunCommand acCmdCompileAndSaveAllModules löst keinen Fehler aus. Eine häufige Ursache ist eine von Hand geschriebene Deklaration mit einer anderen Anzahl von Parametern, als das Ereignis hat, oder ein Aufzählungstyp (WklUpdateAction …), während der Verweis auf WKL Forms Object Library fehlt.
  • Das Formular hat kein Modul. Enthält Modul = Nein: Access gibt kein Ereignis irgendeines Steuerelements an das Formular weiter. Ein leeres Modul genügt.
  • Die Aktion kam aus Code. Die meisten Ereignisse melden, was der Benutzer tut. Dieselbe Änderung durch Code – SelectedKey = 5, Value = True, MoveNode, Requery – löst kein Ereignis aus, so wie AfterUpdate eines Access-Textfelds, das per Code gesetzt wird. Ausnahmen sind beim jeweiligen Member genannt: AfterTabChange von WklDockLayout (Grund wtcCode), FilterChipRemoved (ByUser = False) und CommandStateChange folgen auch Änderungen durch Code.
  • Ein Formatierungsereignis ist abgeschaltet. NodeFormat, RowFormat und CellFormat treten nur mit FormatEvents = True auf (Begründung).
  • Der Name passt nicht. Die Prozedur muss <Steuerelementname>_<Ereignis> heißen, mit dem aktuellen Namen des Steuerelements; nach dem Umbenennen des Steuerelements gehört die alte Prozedur nicht mehr zu ihm.
  • WithEvents innerhalb einer Prozedur, oder das Objekt existiert nicht mehr. Bei WklToast und WklLinkManager muss die WithEvents-Variable im Deklarationsteil eines Klassen- oder Formularmoduls deklariert sein, und das Objekt muss dort noch gehalten werden (Set mToast = New WklToast), wenn das Ereignis eintritt.
  • Eine andere Ereignisprozedur desselben Steuerelements läuft noch. VBA liefert kein Ereignis eines Objekts aus, solange eine Prozedur für ein Ereignis desselben Objekts läuft. Die Datensatzbefehle von WklGrid (DeleteSelected, NewRecord …), die innerhalb einer seiner eigenen Ereignisprozeduren aufgerufen werden, laufen deshalb erst nach dem Ende dieser Prozedur, damit ihre Ereignisse ankommen; andere Ereignisse, die inzwischen ausgelöst werden, gehen verloren.

Lösung

  1. Wählen Sie im VBA-Editor Debuggen › Kompilieren von <Projekt> und beheben Sie jeden angezeigten Fehler; prüfen Sie danach im Direktbereich, dass ? Application.IsCompiled True liefert.
  2. Setzen Sie Enthält Modul des Formulars auf Ja.
  3. Legen Sie die Prozedur über die Objekt- und Prozedurliste des Codefensters an (oder über die Designerseite Ereignisse der Struktur- und Rastersteuerelemente), damit Name und Deklaration stimmen (Anleitung).
  4. Setzen Sie für Formatierungsereignisse FormatEvents = True; verschieben Sie bei Objekten die WithEvents-Deklaration auf Modulebene.
  5. Um nach einer Aktion, die Sie selbst auslösen, Code auszuführen, rufen Sie Ihre Prozedur direkt nach der Anweisung auf, die die Aktion auslöst.
de/wiki/msaccess/comctl/troubleshooting/event-procedure-never-called.txt · Zadnja sprememba: uporabnika Wolfgang van der Stille