Excel VBA-Ereignisse - Eine einfache (und vollständige) Anleitung

Wenn Sie ein Makro in Excel erstellen oder aufzeichnen, müssen Sie das Makro ausführen, um die Schritte im Code auszuführen.

Einige Möglichkeiten zum Ausführen eines Makros umfassen die Verwendung des Makrodialogfelds, das Zuweisen des Makros zu einer Schaltfläche, die Verwendung einer Verknüpfung usw.

Abgesehen von diesen benutzerinitiierten Makroausführungen können Sie das Makro auch mit VBA-Ereignissen ausführen.

Excel VBA-Ereignisse - Einführung

Lassen Sie mich zunächst erklären, was ein Ereignis in VBA ist.

Ein Ereignis ist eine Aktion, die die Ausführung des angegebenen Makros auslösen kann.

Wenn Sie beispielsweise eine neue Arbeitsmappe öffnen, handelt es sich um ein Ereignis. Wenn Sie ein neues Arbeitsblatt einfügen, handelt es sich um ein Ereignis. Wenn Sie auf eine Zelle doppelklicken, handelt es sich um ein Ereignis.

Es gibt viele solcher Ereignisse in VBA, und Sie können Codes für diese Ereignisse erstellen. Dies bedeutet, dass sobald ein Ereignis eintritt und Sie einen Code für dieses Ereignis angegeben haben, dieser Code sofort ausgeführt wird.

Excel macht dies automatisch, sobald es merkt, dass ein Ereignis stattgefunden hat. Sie müssen also nur den Code schreiben und in die richtige Ereignisunterroutine einfügen (dies wird später in diesem Artikel behandelt).

Wenn Sie beispielsweise ein neues Arbeitsblatt einfügen und es ein Jahrespräfix haben soll, können Sie den Code dafür schreiben.

Wenn nun jemand ein neues Arbeitsblatt einfügt, wird dieser Code automatisch ausgeführt und fügt dem Namen des Arbeitsblatts das Jahrespräfix hinzu.

Ein anderes Beispiel könnte sein, dass Sie die Farbe der Zelle ändern möchten, wenn jemand darauf doppelklickt. Dazu können Sie das Doppelklick-Ereignis verwenden.

Ebenso können Sie VBA-Codes für viele solcher Ereignisse erstellen (wie wir später in diesem Artikel sehen werden).

Unten sehen Sie eine kurze Grafik, die das Doppelklickereignis in Aktion zeigt. Sobald ich auf Zelle A1 doppelklicke. Excel öffnet sofort ein Meldungsfeld, das die Adresse der Zelle anzeigt.

Doppelklick ist ein Ereignis, und das Anzeigen des Meldungsfelds ist das, was ich im Code angegeben habe, wenn das Doppelklickereignis stattfindet.

Obwohl das obige Beispiel ein nutzloses Ereignis ist, hoffe ich, dass es Ihnen hilft zu verstehen, was Ereignisse wirklich sind.

Verschiedene Arten von Excel VBA-Ereignissen

Es gibt verschiedene Objekte in Excel - wie Excel selbst (wird oft als Anwendung bezeichnet), Arbeitsmappen, Arbeitsblätter, Diagramme usw.

Jedem dieser Objekte können verschiedene Ereignisse zugeordnet sein. Beispielsweise:

  • Wenn Sie eine neue Arbeitsmappe erstellen, handelt es sich um ein Ereignis auf Anwendungsebene.
  • Wenn Sie ein neues Arbeitsblatt hinzufügen, handelt es sich um ein Ereignis auf Arbeitsmappenebene.
  • Wenn Sie den Wert in einer Zelle in einem Blatt ändern, handelt es sich um ein Ereignis auf Arbeitsblattebene.

Im Folgenden sind die verschiedenen Arten von Ereignissen aufgeführt, die in Excel vorhanden sind:

  1. Ereignisse auf Arbeitsblattebene: Dies sind die Arten von Ereignissen, die basierend auf den im Arbeitsblatt ausgeführten Aktionen ausgelöst werden. Beispiele für diese Ereignisse sind das Ändern einer Zelle im Arbeitsblatt, das Ändern der Auswahl, das Doppelklicken auf eine Zelle, das Klicken mit der rechten Maustaste auf eine Zelle usw.
  2. Ereignisse auf Arbeitsmappenebene: Diese Ereignisse würden basierend auf den Aktionen auf Arbeitsmappenebene ausgelöst. Beispiele für diese Ereignisse sind das Hinzufügen eines neuen Arbeitsblatts, das Speichern der Arbeitsmappe, das Öffnen der Arbeitsmappe, das Drucken eines Teils oder der gesamten Arbeitsmappe usw.
  3. Ereignisse auf Anwendungsebene: Dies sind die Ereignisse, die in der Excel-Anwendung auftreten. Ein Beispiel hierfür wäre das Schließen einer der geöffneten Arbeitsmappen oder das Öffnen einer neuen Arbeitsmappe.
  4. Ereignisse auf UserForm-Ebene: Diese Ereignisse würden basierend auf den Aktionen in der „UserForm“ ausgelöst. Beispiele hierfür sind das Initialisieren einer UserForm oder das Klicken auf eine Schaltfläche in der UserForm.
  5. Diagrammereignisse: Dies sind Ereignisse, die sich auf das Diagrammblatt beziehen. Ein Diagrammblatt unterscheidet sich von einem Arbeitsblatt (wo die meisten von uns gewohnt sind, in Excel zu arbeiten). Ein Diagrammblatt dient dazu, ein Diagramm zu halten. Beispiele für solche Ereignisse sind das Ändern der Reihe des Diagramms oder das Ändern der Größe des Diagramms.
  6. OnTime- und OnKey-Ereignisse: Dies sind zwei Ereignisse, die in keine der oben genannten Kategorien passen. Daher habe ich diese separat aufgelistet. Das Ereignis „OnTime“ ermöglicht es Ihnen, einen Code zu einer bestimmten Zeit oder nach Ablauf einer bestimmten Zeit auszuführen. Das Ereignis „OnKey“ ermöglicht es Ihnen, einen Code auszuführen, wenn ein bestimmter Tastenanschlag (oder eine Kombination von Tastenanschlägen) verwendet wird.

Wo soll der ereignisbezogene Code abgelegt werden

Im obigen Abschnitt habe ich die verschiedenen Arten von Ereignissen behandelt.

Je nach Art des Ereignisses müssen Sie den Code in das entsprechende Objekt einfügen.

Wenn es sich beispielsweise um ein arbeitsblattbezogenes Ereignis handelt, sollte es im Codefenster des Arbeitsblattobjekts angezeigt werden. Wenn es sich um eine Arbeitsmappe handelt, sollte es im Codefenster für ein Arbeitsmappenobjekt angezeigt werden.

In VBA haben verschiedene Objekte - wie Arbeitsblätter, Arbeitsmappen, Diagrammblätter, UserForms usw. ihre eigenen Codefenster. Sie müssen den Ereigniscode in das Codefenster des entsprechenden Objekts einfügen. Wenn es sich beispielsweise um ein Ereignis auf Arbeitsmappenebene handelt, müssen Sie den Ereigniscode im Fenster Arbeitsmappencode haben.

In den folgenden Abschnitten werden die Stellen behandelt, an denen Sie den Ereigniscode einfügen können:

Im Arbeitsblattcodefenster

Wenn Sie den VB-Editor öffnen (mit der Tastenkombination ALT + F11), werden Sie das Arbeitsblattobjekt im Projekt-Explorer bemerken. Für jedes Arbeitsblatt in der Arbeitsmappe wird ein Objekt angezeigt.

Wenn Sie auf das Arbeitsblattobjekt doppelklicken, in das Sie den Code einfügen möchten, wird das Codefenster für dieses Arbeitsblatt geöffnet.

Während Sie mit dem Schreiben des Codes von Grund auf beginnen können, ist es viel besser, das Ereignis aus einer Liste von Optionen auszuwählen und VBA automatisch den relevanten Code für das ausgewählte Ereignis einfügen zu lassen.

Dazu müssen Sie zuerst das Arbeitsblatt aus der Dropdown-Liste oben links im Codefenster auswählen.

Nachdem Sie Arbeitsblatt aus der Dropdown-Liste ausgewählt haben, erhalten Sie eine Liste aller Ereignisse, die sich auf das Arbeitsblatt beziehen. Sie können den gewünschten Code aus der Dropdown-Liste oben rechts im Codefenster auswählen.

Sobald Sie das Ereignis auswählen, wird automatisch die erste und letzte Zeile des Codes für das ausgewählte Ereignis eingegeben. Jetzt können Sie Ihren Code zwischen den beiden Zeilen einfügen.

Hinweis: Sobald Sie im Dropdown-Menü Arbeitsblatt auswählen, werden Sie feststellen, dass im Codefenster zwei Codezeilen angezeigt werden. Nachdem Sie das Ereignis ausgewählt haben, für das Sie den Code wünschen, können Sie die standardmäßig angezeigten Zeilen löschen.

Beachten Sie, dass jedes Arbeitsblatt über ein eigenes Codefenster verfügt. Wenn Sie den Code für Sheet1 einfügen, funktioniert er nur, wenn das Ereignis in Sheet1 eintritt.

In diesem Arbeitsmappen-Codefenster

Genau wie bei Arbeitsblättern können Sie einen Ereigniscode auf Arbeitsmappenebene im Codefenster DieseArbeitsmappe platzieren.

Wenn Sie auf ThisWorkbook doppelklicken, wird das Codefenster dafür geöffnet.

Sie müssen Arbeitsmappe aus der Dropdown-Liste oben links im Codefenster auswählen.

Nachdem Sie im Dropdown-Menü Arbeitsmappe ausgewählt haben, erhalten Sie eine Liste aller Ereignisse, die sich auf die Arbeitsmappe beziehen. Sie können den gewünschten Code aus der Dropdown-Liste oben rechts im Codefenster auswählen.

Sobald Sie das Ereignis auswählen, wird automatisch die erste und letzte Zeile des Codes für das ausgewählte Ereignis eingegeben. Jetzt können Sie Ihren Code zwischen den beiden Zeilen einfügen.

Hinweis: Sobald Sie im Dropdown-Menü Arbeitsmappe auswählen, werden im Codefenster zwei Codezeilen angezeigt. Nachdem Sie das Ereignis ausgewählt haben, für das Sie den Code wünschen, können Sie die standardmäßig angezeigten Zeilen löschen.

Im Userform-Codefenster

Wenn Sie UserForms in Excel erstellen, können Sie UserForm-Ereignisse auch verwenden, um Codes basierend auf bestimmten Aktionen auszuführen. Sie können beispielsweise einen Code angeben, der ausgeführt wird, wenn auf die Schaltfläche geklickt wird.

Während die Sheet-Objekte und ThisWorkbook-Objekte bereits verfügbar sind, wenn Sie den VB-Editor öffnen, müssen Sie UserForm zuerst erstellen.

Um eine UserForm zu erstellen, klicken Sie mit der rechten Maustaste auf eines der Objekte, gehen Sie zu Einfügen und klicken Sie auf UserForm.

Dadurch wird ein UserForm-Objekt in die Arbeitsmappe eingefügt.

Wenn Sie auf die UserForm (oder eines der Objekte, die Sie der UserForm hinzufügen) doppelklicken, wird das Codefenster für die UserForm geöffnet.

Jetzt können Sie genau wie bei Arbeitsblättern oder DieseArbeitsmappe das Ereignis auswählen und es wird die erste und die letzte Zeile für dieses Ereignis eingefügt. Und dann können Sie den Code in der Mitte hinzufügen.

Im Diagrammcode-Fenster

In Excel können Sie auch Diagrammblätter einfügen (die sich von Arbeitsblättern unterscheiden). Ein Diagrammblatt soll nur Diagramme enthalten.

Wenn Sie ein Diagrammblatt eingefügt haben, können Sie das Diagrammblattobjekt im VB-Editor sehen.

Sie können den Ereigniscode zum Codefenster des Diagrammblatts hinzufügen, genau wie wir es im Arbeitsblatt getan haben.

Doppelklicken Sie im Projekt-Explorer auf das Chart-Blatt-Objekt. Dadurch wird das Codefenster für das Diagrammblatt geöffnet.

Jetzt müssen Sie Diagramm aus der Dropdown-Liste oben links im Codefenster auswählen.

Nachdem Sie Diagramm aus der Dropdown-Liste ausgewählt haben, erhalten Sie eine Liste aller Ereignisse im Zusammenhang mit dem Diagrammblatt. Sie können den gewünschten Code aus dem Dropdown-Menü oben rechts im Codefenster auswählen.

Hinweis: Sobald Sie Diagramm aus der Dropdown-Liste auswählen, werden im Codefenster zwei Codezeilen angezeigt. Nachdem Sie das Ereignis ausgewählt haben, für das Sie den Code wünschen, können Sie die standardmäßig angezeigten Zeilen löschen.

In-Class-Modul

Klassenmodule müssen wie UserForms eingefügt werden.

Ein Klassenmodul kann Code enthalten, der sich auf die Anwendung bezieht – also Excel selbst und die eingebetteten Diagramme.

Ich werde das Klassenmodul in den kommenden Wochen als separates Tutorial behandeln.

Beachten Sie, dass außer OnTime- und OnKey-Ereignissen keines der oben genannten Ereignisse im regulären VBA-Modul gespeichert werden kann.

Verstehen der Ereignissequenz

Wenn Sie ein Ereignis auslösen, geschieht es nicht isoliert. Es kann auch zu einer Folge von mehreren Triggern kommen.

Wenn Sie beispielsweise ein neues Arbeitsblatt einfügen, passieren die folgenden Dinge:

  1. Ein neues Arbeitsblatt wird hinzugefügt
  2. Das vorherige Arbeitsblatt wird deaktiviert
  3. Das neue Arbeitsblatt wird aktiviert

In den meisten Fällen müssen Sie sich zwar nicht um die Sequenz kümmern, aber wenn Sie komplexe Codes erstellen, die auf Ereignissen basieren, ist es besser, die Sequenz zu kennen, um unerwartete Ergebnisse zu vermeiden.

Die Rolle von Argumenten in VBA-Ereignissen verstehen

Bevor wir zu Event-Beispielen und den großartigen Dingen, die Sie damit machen können, überspringen, gibt es ein wichtiges Konzept, das ich behandeln muss.

In VBA-Ereignissen gibt es zwei Arten von Codes:

  • Ohne Argumente
  • Mit Argumenten

Und in diesem Abschnitt möchte ich kurz auf die Rolle von Argumenten eingehen.

Unten ist ein Code, der kein Argument enthält (die Klammern sind leer):

Private Sub Workbook_Open() MsgBox "Denken Sie daran, die Arbeitszeittabelle auszufüllen" End Sub

Mit dem obigen Code wird beim Öffnen einer Arbeitsmappe einfach ein Meldungsfeld mit der Meldung angezeigt - "Denken Sie daran, die Arbeitszeittabelle auszufüllen".

Sehen wir uns nun einen Code an, der ein Argument hat.

Private Sub Workbook_NewSheet(ByVal Sh As Object) Sh.Range("A1") = Sh.Name End Sub

Der obige Code verwendet das Sh-Argument, das als Objekttyp definiert ist. Das Argument Sh kann ein Arbeitsblatt oder ein Diagrammblatt sein, da das obige Ereignis ausgelöst wird, wenn ein neues Blatt hinzugefügt wird.

Durch die Zuweisung des neuen Blatts, das der Arbeitsmappe hinzugefügt wird, an die Objektvariable Sh, hat VBA es uns ermöglicht, es im Code zu verwenden. Um auf den neuen Blattnamen zu verweisen, kann ich Sh.Name verwenden.

Das Konzept der Argumente wird nützlich sein, wenn Sie die VBA-Ereignisbeispiele in den nächsten Abschnitten durchgehen.

Ereignisse auf Arbeitsmappenebene (mit Beispielen erklärt)

Im Folgenden sind die am häufigsten verwendeten Ereignisse in einer Arbeitsmappe aufgeführt.

VERANSTALTUNGSNAME WAS TRIGIERT DAS EVENT
aktivieren Sie Wenn eine Arbeitsmappe aktiviert ist
NachSpeichern Wenn eine Arbeitsmappe als Add-In installiert ist
VorherSpeichern Wenn eine Arbeitsmappe gespeichert wird
VorherSchließen Wenn eine Arbeitsmappe geschlossen ist
VorherDrucken Wenn eine Arbeitsmappe gedruckt wird
Deaktivieren Wenn eine Arbeitsmappe deaktiviert ist
NeuesBlatt Wenn ein neues Blatt hinzugefügt wird
Offen Wenn eine Arbeitsmappe geöffnet wird
BlattAktivieren Wenn ein Blatt in der Arbeitsmappe aktiviert ist
BlattVorLöschen Wenn ein Blatt gelöscht wird
SheetBeforeDoubleClick Wenn auf ein Blatt doppelgeklickt wird
BlattBeforeRechtsklick Wenn ein Blatt mit der rechten Maustaste angeklickt wird
BlattBerechnen Wenn ein Blatt berechnet oder neu berechnet wird
BlattDeaktivieren Wenn eine Arbeitsmappe deaktiviert ist
SheetPivotTableUpdate Wenn eine Arbeitsmappe aktualisiert wird
SheetSelectionChange Wenn eine Arbeitsmappe geändert wird
FensterAktivieren Wenn eine Arbeitsmappe aktiviert ist
FensterDeaktivieren Wenn eine Arbeitsmappe deaktiviert ist

Beachten Sie, dass dies keine vollständige Liste ist. Die vollständige Liste finden Sie hier.

Denken Sie daran, dass der Code für das Workbook-Ereignis im Codefenster der ThisWorkbook-Objekte gespeichert wird.

Werfen wir nun einen Blick auf einige nützliche Arbeitsmappenereignisse und sehen wir, wie diese in Ihrer täglichen Arbeit verwendet werden können.

Veranstaltung zum Öffnen der Arbeitsmappe

Angenommen, Sie möchten dem Benutzer eine freundliche Erinnerung zum Ausfüllen seiner Arbeitszeittabellen anzeigen, wenn er eine bestimmte Arbeitsmappe öffnet.

Sie können dazu den folgenden Code verwenden:

Private Sub Workbook_Open() MsgBox "Denken Sie daran, die Arbeitszeittabelle auszufüllen" End Sub

Sobald Sie die Arbeitsmappe mit diesem Code öffnen, wird Ihnen ein Meldungsfeld mit der angegebenen Nachricht angezeigt.

Bei der Arbeit mit diesem Code (oder Arbeitsmappenereigniscodes im Allgemeinen) sind einige Dinge zu beachten:

  • Wenn eine Arbeitsmappe über ein Makro verfügt und Sie es speichern möchten, müssen Sie es im .XLSM-Format speichern. Sonst geht der Makrocode verloren.
  • Im obigen Beispiel würde der Ereigniscode nur ausgeführt, wenn die Makros aktiviert sind. Möglicherweise sehen Sie einen gelben Balken, der um Erlaubnis zum Aktivieren von Makros bittet. Solange dies nicht aktiviert ist, wird der Ereigniscode nicht ausgeführt.
  • Der Workbook-Ereigniscode wird im Codefenster des ThisWorkbook-Objekts platziert.

Sie können diesen Code weiter verfeinern und nur die Nachricht von Freitag anzeigen.

Der folgende Code würde dies tun:

Private Sub Workbook_Open() wkday = Weekday(Date) If wkday = 6 Then MsgBox "Denken Sie daran, die Arbeitszeittabelle auszufüllen" End Sub

Beachten Sie, dass in der Funktion Wochentag dem Sonntag der Wert 1 zugewiesen wird, Montag ist 2 usw.

Daher habe ich für Freitag 6 verwendet.

Das Ereignis „Arbeitsmappe öffnen“ kann in vielen Situationen nützlich sein, z.

  • Wenn Sie der Person beim Öffnen einer Arbeitsmappe eine Willkommensnachricht anzeigen möchten.
  • Wenn Sie beim Öffnen der Arbeitsmappe eine Erinnerung anzeigen möchten.
  • Wenn Sie beim Öffnen immer ein bestimmtes Arbeitsblatt in der Arbeitsmappe aktivieren möchten.
  • Wenn Sie zusammen mit der Arbeitsmappe zugehörige Dateien öffnen möchten.
  • Wenn Sie bei jedem Öffnen der Arbeitsmappe den Datums- und Zeitstempel erfassen möchten.

Workbook NewSheet-Ereignis

Das NewSheet-Ereignis wird ausgelöst, wenn Sie ein neues Blatt in die Arbeitsmappe einfügen.

Angenommen, Sie möchten den Datums- und Uhrzeitwert in Zelle A1 des neu eingefügten Blatts eingeben. Sie können dazu den folgenden Code verwenden:

Private Sub Workbook_NewSheet(ByVal Sh As Object) On Error Resume Next Sh.Range("A1") = Format(Now, "dd-mmm-yyyy hh:mm:ss") End Sub

Der obige Code verwendet "On Error Resume Next", um Fälle zu behandeln, in denen jemand ein Diagrammblatt und kein Arbeitsblatt einfügt. Da das Diagrammblatt keine Zelle A1 enthält, wird ein Fehler angezeigt, wenn "On Error Resume Next" nicht verwendet wird.

Ein anderes Beispiel könnte sein, wenn Sie eine grundlegende Einstellung oder Formatierung auf ein neues Blatt anwenden möchten, sobald es hinzugefügt wird. Wenn Sie beispielsweise ein neues Blatt hinzufügen möchten und automatisch eine Seriennummer (bis zu 100) erhalten möchten, können Sie den folgenden Code verwenden.

Private Sub Workbook_NewSheet(ByVal Sh As Object) Bei Fehler Resume Next With Sh.Range("A1") .Value = "S. No." .Interior.Color = vbBlue .Font.Color = vbWhite End With For i = 1 To 100 Sh.Range("A1").Offset(i, 0).Value = i Next i Sh.Range("A1", Range ("A1").End(xlDown)).Borders.LineStyle = xlContinuous End Sub

Der obige Code führt auch ein wenig Formatierung durch. Es verleiht der Kopfzeile eine blaue Farbe und macht die Schrift weiß. Es wendet auch einen Rahmen auf alle gefüllten Zellen an.

Der obige Code ist ein Beispiel dafür, wie ein kurzer VBA-Code Ihnen helfen kann, jedes Mal ein paar Sekunden zu stehlen, wenn Sie ein neues Arbeitsblatt einfügen (falls Sie dies jedes Mal tun müssen).

Arbeitsmappe vorherEreignis speichern

Vor dem Speichern-Ereignis wird ausgelöst, wenn Sie eine Arbeitsmappe speichern. Beachten Sie, dass zuerst das Ereignis ausgelöst und dann die Arbeitsmappe gespeichert wird.

Beim Speichern einer Excel-Arbeitsmappe kann es zwei mögliche Szenarien geben:

  1. Sie speichern es zum ersten Mal und es wird das Dialogfeld Speichern unter angezeigt.
  2. Sie haben es bereits früher gespeichert und es werden die Änderungen in der bereits gespeicherten Version einfach gespeichert und überschrieben.

Sehen wir uns nun einige Beispiele an, in denen Sie das BeforeSave-Ereignis verwenden können.

Angenommen, Sie haben eine neue Arbeitsmappe, die Sie zum ersten Mal speichern, und möchten den Benutzer daran erinnern, sie auf dem Laufwerk K zu speichern, dann können Sie den folgenden Code verwenden:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If SaveAsUI Then MsgBox "Diese Datei im K-Laufwerk speichern" End Sub

Wenn die Datei im obigen Code noch nie gespeichert wurde, ist SaveAsUI True und öffnet das Dialogfeld Speichern unter. Der obige Code würde die Meldung anzeigen, bevor das Dialogfeld Speichern unter angezeigt wird.

Ein anderes Beispiel könnte sein, das Datum und die Uhrzeit zu aktualisieren, wenn die Datei in einer bestimmten Zelle gespeichert wird.

Der folgende Code würde den Datums- und Zeitstempel in Zelle A1 von Sheet1 einfügen, wenn die Datei gespeichert wird.

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Worksheets("Sheet1").Range("A1") = Format(Now, "dd-mmm-yyyy hh:mm:ss") End Sub

Beachten Sie, dass dieser Code ausgeführt wird, sobald der Benutzer die Arbeitsmappe speichert. Wenn die Arbeitsmappe zum ersten Mal gespeichert wird, wird ein Dialogfeld Speichern unter angezeigt. Der Code ist jedoch bereits ausgeführt, wenn das Dialogfeld Speichern unter angezeigt wird. Wenn Sie zu diesem Zeitpunkt die Arbeitsmappe abbrechen und nicht speichern möchten, werden Datum und Uhrzeit bereits in die Zelle eingegeben.

Arbeitsmappe BeforeClose Event

Das Ereignis Before Close tritt unmittelbar vor dem Schließen der Arbeitsmappe ein.

Der folgende Code schützt alle Arbeitsblätter, bevor die Arbeitsmappe geschlossen wird.

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim sh As Worksheet For Each sh In ThisWorkbook.Worksheets sh.Protect Next sh End Sub

Denken Sie daran, dass der Ereigniscode ausgelöst wird, sobald Sie die Arbeitsmappe schließen.

Eine wichtige Sache, die Sie über dieses Ereignis wissen sollten, ist, dass es egal ist, ob die Arbeitsmappe tatsächlich geschlossen ist oder nicht.

Falls die Arbeitsmappe nicht gespeichert wurde und Sie gefragt werden, ob die Arbeitsmappe gespeichert werden soll oder nicht, und Sie auf Abbrechen klicken, wird Ihre Arbeitsmappe nicht gespeichert.Allerdings wäre der Ereigniscode bis dahin bereits ausgeführt worden.

Arbeitsmappe vor dem Druckereignis

Wenn Sie den Druckbefehl (oder Druckvorschaubefehl) geben, wird das Ereignis Vor dem Drucken ausgelöst.

Der folgende Code würde alle Arbeitsblätter neu berechnen, bevor Ihre Arbeitsmappe gedruckt wird.

Private Sub Workbook_BeforePrint(Cancel As Boolean) For Each ws in Worksheets ws.Calculate Next ws End Sub

Wenn der Benutzer die Arbeitsmappe druckt, wird das Ereignis ausgelöst, unabhängig davon, ob er die gesamte Arbeitsmappe oder nur einen Teil davon druckt.

Ein weiteres Beispiel unten ist der Code, der das Datum und die Uhrzeit beim Drucken der Arbeitsmappe in die Fußzeile einfügt.

Private Sub Workbook_BeforePrint(Cancel As Boolean) Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets ws.PageSetup.LeftFooter = "Printed On - " & Format(Now, "dd-mmm-yyyy hh:mm") Next ws End Sub

Ereignisse auf Arbeitsblattebene (mit Beispielen erklärt)

Arbeitsblattereignisse finden basierend auf den Triggern im Arbeitsblatt statt.

Im Folgenden sind die am häufigsten verwendeten Ereignisse in einem Arbeitsblatt aufgeführt.

Veranstaltungsname Was löst das Ereignis aus
aktivieren Sie Wenn das Arbeitsblatt aktiviert ist
VorherLöschen Bevor das Arbeitsblatt gelöscht wird
VorherDoppelklick Bevor auf das Arbeitsblatt doppelgeklickt wird
VorherRechtsklick Bevor das Arbeitsblatt mit der rechten Maustaste angeklickt wird
Berechnung Bevor das Arbeitsblatt berechnet oder neu berechnet wird
Veränderung Wenn die Zellen im Arbeitsblatt geändert werden
Deaktivieren Wenn das Arbeitsblatt deaktiviert ist
PivotTableUpdate Wenn die Pivot-Tabelle im Arbeitsblatt aktualisiert wird
AuswahlÄndern Wenn die Auswahl auf dem Arbeitsblatt geändert wird

Beachten Sie, dass dies keine vollständige Liste ist. Die vollständige Liste finden Sie hier.

Denken Sie daran, dass der Code für das Worksheet-Ereignis im Codefenster des Arbeitsblattobjekts gespeichert ist (in dem Fenster, in dem das Ereignis ausgelöst werden soll). Eine Arbeitsmappe kann mehrere Arbeitsblätter enthalten, und Ihr Code wird nur dann ausgelöst, wenn das Ereignis in dem Arbeitsblatt stattfindet, in dem er platziert ist.

Schauen wir uns nun einige nützliche Arbeitsblatt-Ereignisse an und sehen, wie diese in Ihrer täglichen Arbeit verwendet werden können.

Arbeitsblatt-Aktivierungsereignis

Dieses Ereignis wird ausgelöst, wenn Sie ein Arbeitsblatt aktivieren.

Der folgende Code hebt den Schutz eines Blatts auf, sobald es aktiviert wird.

Private Sub Worksheet_Activate() ActiveSheet.Unprotect End Sub

Sie können dieses Ereignis auch verwenden, um sicherzustellen, dass eine bestimmte Zelle oder ein Zellbereich (oder ein benannter Bereich) ausgewählt ist, sobald Sie das Arbeitsblatt aktivieren. Der folgende Code würde Zelle D1 auswählen, sobald Sie das Blatt aktivieren.

Private Sub Worksheet_Activate() ActiveSheet.Range("D1").Select End Sub

Arbeitsblattänderungsereignis

Ein Änderungsereignis wird immer dann ausgelöst, wenn Sie eine Änderung im Arbeitsblatt vornehmen.

Nun… nicht immer.

Es gibt einige Änderungen, die das Ereignis auslösen, und einige, die dies nicht tun. Hier ist eine Liste einiger Änderungen, die das Ereignis nicht auslösen:

  • Wenn Sie die Formatierung der Zelle ändern (Schriftgröße, Farbe, Rahmen usw.).
  • Wenn Sie Zellen zusammenführen. Dies ist überraschend, da durch das Zusammenführen von Zellen manchmal auch Inhalte aus allen Zellen mit Ausnahme der oberen linken entfernt werden.
  • Wenn Sie einen Zellenkommentar hinzufügen, löschen oder bearbeiten.
  • Wenn Sie einen Zellbereich sortieren.
  • Wenn Sie die Zielsuche verwenden.

Die folgenden Änderungen würden das Ereignis auslösen (auch wenn Sie vielleicht denken, dass dies nicht der Fall sein sollte):

  • Das Kopieren und Einfügen von Formatierungen würde das Ereignis auslösen.
  • Das Löschen der Formatierung würde das Ereignis auslösen.
  • Das Ausführen einer Rechtschreibprüfung würde das Ereignis auslösen.

Unten ist ein Code, der ein Meldungsfeld mit der Adresse der Zelle anzeigt, die geändert wurde.

Private Sub Worksheet_Change(ByVal Target As Range) MsgBox "Sie haben sich gerade geändert" & Target.Address End Sub

Obwohl dies ein nutzloses Makro ist, zeigt es Ihnen, wie Sie das Target-Argument verwenden, um herauszufinden, welche Zellen geändert wurden.

Sehen wir uns nun ein paar weitere nützliche Beispiele an.

Angenommen, Sie haben einen Zellbereich (sagen wir A1: D10) und möchten eine Eingabeaufforderung anzeigen und den Benutzer fragen, ob er wirklich eine Zelle in diesem Bereich ändern möchte oder nicht, können Sie den folgenden Code verwenden.

Es zeigt eine Eingabeaufforderung mit zwei Schaltflächen - Ja und Nein. Wenn der Benutzer "Ja" auswählt, wird die Änderung durchgeführt, andernfalls wird sie rückgängig gemacht.

Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row <= 10 And Target.Column <= 4 Then Ans = MsgBox("Sie nehmen eine Änderung in den Zellen in A1:D10 vor. Sind Sie sicher, dass Sie dies möchten?", vbYesNo) End If Ans = vbNo Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If End Sub

Im obigen Code prüfen wir, ob sich die Zielzelle in den ersten 4 Spalten und den ersten 10 Zeilen befindet. Wenn dies der Fall ist, wird das Meldungsfeld angezeigt. Wenn der Benutzer im Meldungsfeld Nein auswählte, wird die Änderung auch rückgängig gemacht (durch den Application.Undo-Befehl).

Beachten Sie, dass ich Application.EnableEvents = False vor der Zeile Application.Undo verwendet habe. Und dann habe ich es umgekehrt, indem ich Application.EnableEvent = True in der nächsten Zeile verwendet habe.

Dies wird benötigt, da beim Rückgängigmachen auch das Änderungsereignis ausgelöst wird. Wenn ich EnableEvent nicht auf False setze, wird das Änderungsereignis weiterhin ausgelöst.

Sie können die Änderungen an einem benannten Bereich auch mithilfe des Änderungsereignisses überwachen. Wenn Sie beispielsweise einen benannten Bereich namens "DataRange" haben und eine Eingabeaufforderung anzeigen möchten, falls der Benutzer eine Änderung in diesem benannten Bereich vornimmt, können Sie den folgenden Code verwenden:

Private Sub Worksheet_Change(ByVal Target As Range) Dim DRange As Range Set DRange = Range("DataRange") If Not Intersect(Target, DRange) Is Nothing Then MsgBox "Sie haben gerade eine Änderung am Datenbereich vorgenommen" End If End Sub

Der obige Code überprüft, ob die Zelle/der Bereich, in dem Sie die Änderungen vorgenommen haben, Zellen enthält, die dem Datenbereich gemeinsam sind. Wenn dies der Fall ist, wird das Meldungsfeld angezeigt.

Arbeitsmappenauswahländerungsereignis

Das Auswahländerungsereignis wird immer dann ausgelöst, wenn eine Auswahländerung im Arbeitsblatt erfolgt.

Der folgende Code würde das Blatt neu berechnen, sobald Sie die Auswahl ändern.

Private Sub Worksheet_SelectionChange(ByVal Target As Range) Application.Calculate End Sub

Ein weiteres Beispiel für dieses Ereignis ist, wenn Sie die aktive Zeile und Spalte der ausgewählten Zelle hervorheben möchten.

Etwas wie unten gezeigt:

Der folgende Code kann dies tun:

Private Sub Worksheet_SelectionChange(ByVal Target As Range) Cells.Interior.ColorIndex = xlNone With ActiveCell .EntireRow.Interior.Color = RGB(248, 203, 173) .EntireColumn.Interior.Color = RGB(180, 198, 231) End With End Sub

Der Code entfernt zuerst die Hintergrundfarbe aus allen Zellen und wendet dann die im Code erwähnte auf die aktive Zeile und Spalte an.

Und das ist das Problem mit diesem Code. Dass es Farbe aus allen Zellen entfernt.

Wenn Sie die aktive Zeile/Spalte hervorheben möchten, während die Farbe in anderen Zellen intakt bleibt, verwenden Sie die in diesem Tutorial gezeigte Technik.

Arbeitsmappen-DoubleClick-Ereignis

Dies ist eines meiner Lieblings-Arbeitsblatt-Events und Sie werden viele Tutorials sehen, in denen ich es verwendet habe (wie dieses oder dieses).

Dieses Ereignis wird ausgelöst, wenn Sie auf eine Zelle doppelklicken.

Lass mich dir zeigen, wie toll das ist.

Mit dem folgenden Code können Sie auf eine Zelle doppelklicken und eine Hintergrundfarbe anwenden, die Schriftfarbe ändern und den Text in der Zelle fett formatieren.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True With Target .Interior.Color = vbBlue .Font.Color = vbWhite .Font.Bold = True End With End Sub

Dies kann nützlich sein, wenn Sie eine Liste von Zellen durchgehen und einige ausgewählte hervorheben möchten. Während Sie die F4-Taste verwenden können, um den letzten Schritt zu wiederholen, können Sie nur eine Art von Formatierung anwenden. Mit diesem Doppelklick-Ereignis können Sie alle drei mit nur einem Doppelklick anwenden.

Beachten Sie, dass ich im obigen Code den Wert von Cancel = True festgelegt habe.

Dies geschieht so, dass die Standardaktion des Doppelklickens deaktiviert ist - das heißt, in den Bearbeitungsmodus zu gelangen. Mit Abbrechen = True bringt Excel Sie nicht in den Bearbeitungsmodus, wenn Sie auf die Zelle doppelklicken.

Hier ist ein weiteres Beispiel.

Wenn Sie eine Aufgabenliste in Excel haben, können Sie das Doppelklick-Ereignis verwenden, um das durchgestrichene Format anzuwenden, um die Aufgabe als abgeschlossen zu markieren.

Etwas wie unten gezeigt:

Hier ist der Code, der dies tut:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True CurrFormat = Target.Font.Strikethrough If CurrFormat Then Target.Font.Strikethrough = False Else Target.Font.Strikethrough = True End If End Sub

Beachten Sie, dass ich in diesem Code einen Doppelklick als Umschaltereignis gemacht habe. Wenn Sie auf eine Zelle doppelklicken, wird überprüft, ob das durchgestrichene Format bereits angewendet wurde. Ist dies der Fall, wird das durchgestrichene Format durch Doppelklick entfernt, und wenn nicht, wird das durchgestrichene Format angewendet.

Excel VBA OnTime-Ereignis

Die Ereignisse, die wir bisher in diesem Artikel gesehen haben, waren mit einem der Excel-Objekte verknüpft, sei es die Arbeitsmappe, das Arbeitsblatt, das Diagrammblatt oder die UserForms usw.

Das OnTime-Ereignis unterscheidet sich von anderen Ereignissen, da es im regulären VBA-Modul gespeichert werden kann (während die anderen im Codefenster von Objekten wie ThisWorkbook oder Worksheets oder UserForms platziert werden sollten).

Innerhalb des regulären VBA-Moduls wird es als Methode des Anwendungsobjekts verwendet.

Dies wird als Ereignis angesehen, weil es basierend auf der von Ihnen angegebenen Zeit ausgelöst werden kann. Wenn ich beispielsweise möchte, dass das Blatt alle 5 Minuten neu berechnet wird, kann ich das OnTime-Ereignis dafür verwenden.

Wenn ich zu einer bestimmten Tageszeit eine Nachricht/Erinnerung anzeigen möchte, kann ich das Ereignis OnTime verwenden.

Unten ist ein Code, der jeden Tag um 14:00 Uhr eine Nachricht anzeigt.

Sub MessageTime() Application.OnTime TimeValue("14:00:00"), "ShowMessage" End Sub Sub ShowMessage() MsgBox "Es ist Mittagszeit" End Sub

Denken Sie daran, dass Sie diesen Code in das reguläre VBA-Modul einfügen müssen.

Auch wenn das OnTime-Ereignis zum angegebenen Zeitpunkt ausgelöst wird, müssen Sie das Makro jederzeit manuell ausführen. Sobald Sie das Makro ausgeführt haben, wartet es bis 14 Uhr und ruft dann das Makro "ShowMessage" auf.

Das ShowMessage-Makro würde dann die Nachricht anzeigen.

Das Ereignis OnTime benötigt vier Argumente:

Anwendung.OnTime(Frühester Zeitpunkt, Verfahren, Spätester Zeitpunkt, Zeitplan)

  • Frühester Zeitpunkt: Die Zeit, zu der Sie das Verfahren ausführen möchten.
  • Verfahren: Der Name der Prozedur, die ausgeführt werden soll.
  • LetzteZeit (optional): Falls ein anderer Code ausgeführt wird und Ihr angegebener Code zur angegebenen Zeit nicht ausgeführt werden kann, können Sie die LatestTime angeben, auf die er warten soll. Zum Beispiel könnte es EarlyiestTime + 45 sein (was bedeutet, dass 45 Sekunden gewartet wird, bis der andere Vorgang abgeschlossen ist). Wenn der Vorgang auch nach 45 Sekunden nicht ausgeführt werden kann, wird er abgebrochen. Wenn Sie dies nicht angeben, wartet Excel, bis der Code ausgeführt werden kann, und führt ihn dann aus.
  • Zeitplan (optional): Wenn auf True gesetzt, wird ein neues Zeitverfahren geplant. Bei False wird die zuvor festgelegte Prozedur abgebrochen. Standardmäßig ist dies True.

Im obigen Beispiel haben wir nur die ersten beiden Argumente verwendet.

Schauen wir uns ein anderes Beispiel an.

Der folgende Code würde das Arbeitsblatt alle 5 Minuten aktualisieren.

Dim NextRefresh as Date Sub RefreshSheet() ThisWorkbook.Worksheets("Sheet1").Calculate NextRefresh = Now + TimeValue("00:05:00") Application.OnTime NextRefresh, "RefreshSheet" End Sub Sub StopRefresh() On Error Resume Next Application.OnTime NextRefresh, "RefreshSheet", , False End Sub

Der obige Code würde das Arbeitsblatt alle 5 Minuten aktualisieren.

Es verwendet die Now-Funktion, um die aktuelle Uhrzeit zu ermitteln und addiert dann 5 Minuten zur aktuellen Uhrzeit.

Das OnTime-Ereignis wird so lange ausgeführt, bis Sie es beenden. Wenn Sie die Arbeitsmappe schließen und die Excel-Anwendung noch ausgeführt wird (andere Arbeitsmappen sind geöffnet), wird die Arbeitsmappe, in der das OnTime-Ereignis ausgeführt wird, erneut geöffnet.

Dies wird besser gehandhabt, indem das OnTime-Ereignis gezielt gestoppt wird.

Im obigen Code habe ich den StopRefresh-Code, aber Sie müssen ihn ausführen, um das OnTime-Ereignis zu stoppen. Sie können dies manuell tun, es einer Schaltfläche zuweisen und dies tun, indem Sie die Schaltfläche drücken oder sie aus dem Ereignis Workbook Close aufrufen.

Private Sub Workbook_BeforeClose(Cancel As Boolean) Call StopRefresh End Sub

Der obige Ereigniscode „BeforeClose“ wird im Codefenster von ThisWorkbook angezeigt.

Excel VBA OnKey-Ereignis

Wenn Sie mit Excel arbeiten, werden die von Ihnen verwendeten Tastenanschläge überwacht. Dies ermöglicht es uns, Tastenanschläge als Auslöser für ein Ereignis zu verwenden.

Mit dem Ereignis OnKey können Sie einen Tastenanschlag (oder eine Kombination von Tastenanschlägen) und den Code angeben, der ausgeführt werden soll, wenn dieser Tastenanschlag verwendet wird. Wenn diese Tastenanschläge gedrückt werden, wird der Code dafür ausgeführt.

Genau wie das Ereignis OnTime müssen Sie das Ereignis OnKey abbrechen können. Wenn Sie das OnKey-Ereignis für einen bestimmten Tastenanschlag festlegen, wird es außerdem in allen geöffneten Arbeitsmappen verfügbar.

Bevor ich Ihnen ein Beispiel für die Verwendung des OnKey-Ereignisses zeige, lassen Sie mich zunächst die Schlüsselcodes teilen, die Ihnen in VBA zur Verfügung stehen.

SCHLÜSSEL CODE
Rücktaste {RÜCKTASTE} oder {BS}
Brechen {BRECHEN}
Caps Lock {CAPS LOCK}
Löschen {DELETE} oder {DEL}
Pfeil nach unten {NIEDER}
Ende {ENDE}
Eintreten ~
Enter (auf der numerischen Tastatur) {EINTRETEN}
Flucht {ESCAPE} oder {ESC}
Heim {HEIMAT}
Ins {EINFÜGUNG}
Linker Pfeil {LINKS}
Num Lock {NUM LOCK}
Bild nach unten {PGDN}
Seite nach oben {PGUP}
Rechter Pfeil {RECHTS}
Scroll-Sperre {SCROLLOCK}
Tab {TAB}
Aufwärtspfeil {HOCH}
F1 bis F15 {F1} bis {F15}

Wenn Sie ein onkey-Ereignis verwenden müssen, müssen Sie den Code dafür verwenden.

Die obige Tabelle enthält die Codes für einzelne Tastenanschläge.

Sie können diese auch mit den folgenden Codes kombinieren:

  • Verschiebung: + (Pluszeichen)
  • Steuerung: ^ (Pflege)
  • Alt: % (Prozentsatz)

Zum Beispiel müssen Sie für Alt F4 den Code verwenden: „%{F4}” - wobei % für die ALT-Taste und {F4} für die F4-Taste steht.

Schauen wir uns nun ein Beispiel an (denken Sie daran, dass der Code für OnKey-Ereignisse im regulären VBA-Modul platziert ist).

Wenn Sie die PageUp- oder PageDown-Taste drücken, springt es 29 Zeilen über / unter die aktive Zelle (zumindest macht es das auf meinem Laptop).

Wenn Sie möchten, dass nur 5 Zeilen gleichzeitig gesprungen werden, können Sie den folgenden Code verwenden:

Sub PageUpDOwnKeys() Application.OnKey "{PgUp}", "PageUpMod" Application.OnKey "{PgDn}", "PageDownMod" End Sub Sub PageUpMod() On Error Resume Next ActiveCell.Offset(-5, 0).Activate End Sub Sub PageDownMod() On Error Resume Next ActiveCell.Offset(5, 0).Activate End Sub

Wenn Sie den ersten Teil des Codes ausführen, werden die OnKey-Ereignisse ausgeführt. Sobald dies ausgeführt ist, würde die Verwendung der PageUp- und PageDown-Tasten dazu führen, dass der Cursor nur 5 Zeilen gleichzeitig springt.

Beachten Sie, dass wir „On Error Resume Next“ verwendet haben, um sicherzustellen, dass Fehler ignoriert werden. Diese Fehler können auftreten, wenn Sie die Bild-auf-Taste drücken, auch wenn Sie sich ganz oben im Arbeitsblatt befinden. Da keine Zeilen mehr zu überspringen sind, würde der Code einen Fehler anzeigen. Aber da wir ‚On Error Resume Next‘ verwendet haben, wird es ignoriert.

Um sicherzustellen, dass diese OnKey-Ereignisse verfügbar sind, müssen Sie den ersten Teil des Codes ausführen. Falls Sie möchten, dass diese beim Öffnen der Arbeitsmappe verfügbar ist, können Sie dies im Codefenster DieseArbeitsmappe platzieren.

Private Sub Workbook_Open() Application.OnKey "{PgUp}", "PageUpMod" Application.OnKey "{PgDn}", "PageDownMod" End Sub

Der folgende Code bringt die Tasten zu ihrer normalen Funktionalität zurück.

Sub Cancel_PageUpDownKeysMod() Application.OnKey "{PgUp}" Application.OnKey "{PgDn}" End Sub

Wenn Sie das zweite Argument in der OnKey-Methode nicht angeben, wird der Tastenanschlag auf seine normale Funktionalität zurückgesetzt.

Falls Sie die Funktionalität eines Tastenanschlags abbrechen möchten, damit Excel bei Verwendung dieses Tastenanschlags nichts tut, müssen Sie als zweites Argument eine leere Zeichenfolge verwenden.

Im folgenden Code würde Excel nichts tun, wenn wir die PageUp- oder PageDown-Tasten verwenden.

Sub Ignore_PageUpDownKeys() Application.OnKey "{PgUp}", "" Application.OnKey "{PgDn}", "" End Sub

Deaktivieren von Ereignissen in VBA

Manchmal müssen Sie möglicherweise Ereignisse deaktivieren, damit Ihr Code ordnungsgemäß funktioniert.

Angenommen, ich habe einen Bereich (A1:D10) und möchte eine Nachricht anzeigen, wenn eine Zelle in diesem Bereich geändert wird. Also zeige ich ein Meldungsfeld und frage den Benutzer, ob er sicher ist, dass er die Änderung vornehmen möchte. Wenn die Antwort Ja lautet, wird die Änderung vorgenommen, und wenn die Antwort Nein lautet, würde VBA sie rückgängig machen.

Sie können den folgenden Code verwenden:

Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row <= 10 And Target.Column <= 4 Then Ans = MsgBox("Sie nehmen eine Änderung in den Zellen in A1:D10 vor. Sind Sie sicher, dass Sie dies möchten?", vbYesNo) End If If Ans = vbNo Then Application.Undo End If End Sub

Das Problem mit diesem Code besteht darin, dass die Aktion rückgängig gemacht wird, wenn der Benutzer im Meldungsfeld Nein auswählt (wie ich Application.Undo verwendet habe).

Wenn das Rückgängigmachen erfolgt und der Wert wieder auf den ursprünglichen Wert geändert wird, wird das VBA-Änderungsereignis erneut ausgelöst und dem Benutzer wird wieder dasselbe Meldungsfeld angezeigt.

Dies bedeutet, dass Sie im Meldungsfeld weiterhin auf NEIN klicken können und es weiterhin angezeigt wird. Dies geschieht, da Sie in diesem Fall in der Endlosschleife stecken geblieben sind.

Um solche Fälle zu vermeiden, müssen Sie Ereignisse deaktivieren, damit das Änderungsereignis (oder ein anderes Ereignis) nicht ausgelöst wird.

Der folgende Code würde in diesem Fall gut funktionieren:

Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row <= 10 And Target.Column <= 4 Then Ans = MsgBox("Sie nehmen eine Änderung in den Zellen in A1:D10 vor. Sind Sie sicher, dass Sie dies möchten?", vbYesNo) End If Ans = vbNo Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If End Sub

Im obigen Code, direkt über der Application.Undo-Zeile, haben wir - Application.EnableEvents = False verwendet.

Das Festlegen von EnableEvents auf False würde kein Ereignis auslösen (in der aktuellen oder geöffneten Arbeitsmappen).

Sobald wir den Rückgängig-Vorgang abgeschlossen haben, können wir die EnableEvents-Eigenschaft wieder auf True setzen.

Beachten Sie, dass sich das Deaktivieren von Ereignissen auf alle Arbeitsmappen auswirkt, die derzeit geöffnet sind (oder geöffnet werden, während EnableEvents auf False festgelegt ist). Wenn Sie beispielsweise als Teil des Codes eine neue Arbeitsmappe öffnen, funktioniert das Workbook Open-Ereignis nicht.

Auswirkungen von Ereignissen Rückgängig-Stapel

Lassen Sie mich Ihnen zunächst erklären, was ein Undo-Stack ist.

Wenn Sie in Excel arbeiten, werden Ihre Aktionen ständig überwacht. Wenn Sie einen Fehler machen, können Sie jederzeit mit Strg + Z zum vorherigen Schritt zurückkehren (d. h. Ihre aktuelle Aktion rückgängig machen).

Wenn Sie zweimal Strg + Z drücken, gelangen Sie zwei Schritte zurück. Diese von Ihnen ausgeführten Schritte werden als Teil des Rückgängig-Stapels gespeichert.

Jedes Ereignis, das das Arbeitsblatt ändert, zerstört diesen Rückgängig-Stack.Das bedeutet, dass ich, wenn ich 5 Dinge getan habe, bevor ich ein Ereignis auslöse, nicht in der Lage bin, Strg + Z zu verwenden, um zu diesen vorherigen Schritten zurückzukehren. Das Auslösen des Ereignisses hat diesen Stapel für mich zerstört.

Im folgenden Code verwende ich VBA, um den Zeitstempel in Zelle A1 einzugeben, wenn sich das Arbeitsblatt ändert.

Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Range("A1").Value = Format(Now, "dd-mmm-yyyy hh:mm:ss") Application.EnableEvents = True End Sub

Da ich eine Änderung im Arbeitsblatt vornehme, wird dadurch der Rückgängig-Stack zerstört.

Beachten Sie auch, dass dies nicht nur auf Veranstaltungen beschränkt ist.

Wenn Sie einen Code haben, der in einem regulären VBA-Modul gespeichert ist, und Sie eine Änderung im Arbeitsblatt vornehmen, würde dies auch den Rückgängig-Stack in Excel zerstören.

Geben Sie beispielsweise im folgenden Code einfach den Text "Hallo" in Zelle A1 ein, aber selbst die Ausführung würde den Rückgängig-Stack zerstören.

Sub TypeHello() Range("A1").Value = "Hello" End Sub

Möglicherweise gefallen Ihnen auch die folgenden Excel VBA-Tutorials:

  • Arbeiten mit Zellen und Bereichen in Excel VBA.
  • Arbeiten mit Arbeitsblättern in Excel VBA.
  • Arbeiten mit Arbeitsmappen in Excel VBA.
  • Excel VBA-Schleifen - Der ultimative Leitfaden.
  • Verwenden von IF Then Else-Anweisung in Excel VBA.
  • Für nächste Schleife in Excel.
  • Erstellen von benutzerdefinierten Funktionen in Excel VBA.
  • So erstellen und verwenden Sie Add-Ins in Excel.
  • Erstellen und Wiederverwenden von Makros durch Speichern in der persönlichen Makroarbeitsmappe.

Sie werden die Entwicklung der Website helfen, die Seite mit Ihren Freunden teilen

wave wave wave wave wave