Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Application.UnDo

Forumthread: Application.UnDo

Application.UnDo
17.07.2020 16:44:59
Michael
Hallo zusammen,
ich habe folgendes Problem:
Ich benutze den Worksheet_Change Trigger um verschieden Bereiche, in denen eigentlich Formeln stehen, auf die Eingabe von Werten zu überprüfen. Damit der Trigger nicht in eine Schleife läuft wird Application.EnableEvents am Anfang auf False gesetzt und am Ende der Prozedur wieder auf True. Mittels Application.undo hole ich kurz die alte Formel der Zelle zurück, um diese abzuspeichern und, nachdem die Prozedur gemacht hat was sie machen soll, wieder statt dem Eingabewert einzusetzen.
Dies funktioniert alles prima. Jetzt komme ich aber zu einer bestimmten Ausnahme.
Unter einer besonderen Bedingung möchte ich, dass der Worksheet_Change Trigger nochmal ausgeführt wird. Genauer gesagt schreibe ich per Code in die Zelle unterhalb der Eingabezelle einen Wert (dort steht auch eine Formel) und jetzt möchte ich, dass der Worksheet_Change Trigger so durchlaufen wird, als hätte der User den Wert per Hand eingegeben. Damit dies geschieht habe ich erst einmal Application.EnableEvents wieder auf true gesetzt. Danach schreibe ich den Wert in die entsprechende Zelle (habe auch schon probiert die Zelle vorher zu selektieren, hat aber nichts gebracht). Als Ergebnis der Eingabe wird der Trigger, so wie ich es erwartet habe, auch ausgeführt, aber wenn der Code an die Stelle mit Application.undo kommt steigt die Prozedur aus. Application.undo kann nicht ausgeführt werden.
Was muss ich machen, damit meine Wertzuweisung (Zelle.value = neuer Wert) wie eine händische Eingabe von Excel gesehen wird und ich die Formel, die vorher in der Zelle stand, mit Application.undo wieder hervorholen kann?
Danke für Eure Tipps
Michael
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Gegenfrage...
17.07.2020 17:05:43
Oberschlumpf
Hi Michael,
du willst vermeiden, dass in den Zellen, in denen Formeln stehen, "per Hand" Werte eingegeben werden können, oder?
Wieso steuerst du das nicht mit einem passwortgeschützten Blattschutz?!
Die Zellen schützen, die Formeln enthalten...
Die Zellen freigeben, in denen Werte "per Hand" eingetragen werden sollen...
Fertig
Hilfts?
Ciao
Thorsten
Anzeige
Nachtrag ;)
17.07.2020 17:06:48
Oberschlumpf
Die Zellen schützen, die Formeln enthalten...
Die Zellen freigeben, in denen Werte "per Hand" eingetragen werden sollen...
natürlich Blattschutz aktivieren (mit Passwort)
AW: Nachtrag ;)
17.07.2020 17:23:56
Michael
Hallo Thorsten,
nein, du hast mich falsch verstanden. Ich möchte, dass in den Zellen in denen Formeln stehen Werte eingegeben werden können. Diese Werte werden dann weiterverarbeite und in eine Datenbank geschrieben. Danach wird das Ergebnis (dafür ist die Formel) wieder angezeigt (in Kurzform geschrieben).
Es geht wirklich nur darum, dass ich Application.UnDo brauche, um die alten Formel wieder "hervorzuholen". In dem Moment in dem Worksheet.Change ausgeführt wird, ist ja nur noch Target, bzw. Target.Value vorhanden. Nur über Application.UnDo komme ich wieder zur Formel. Ein Durchlauf funktioniert ja auch prima. Nur wenn ich per Code eine Eingabe mache und damit ja die Formel überschreibe geht es nicht mehr. Ich kann natürliche die Formel vor dem schreiben zwischenspeichern. Wenn ich keine Lösung finde werde ich es auch so machen. Aber ich verstehe nicht, warum im Trigger Code beim zweiten Durchlauf das Application.UnDo nicht mehr funktioniert.
Grüße Michael
Anzeige
AW: Application.UnDo
17.07.2020 17:13:50
onur
Microsoft:
Application.Undo
Diese Methode macht nur die letzte Aktion, die der Benutzer vor dem Ausführen des Makros vorgenommen hat, und muss die erste Textseite des Makros sein. Es kann nicht verwendet werden, um Visual Basic-Befehle rückgängig zu machen.
Da du aber Application.undo 2x ausführst, geht das 2. Mal in die Hose.
Nimm eine Globale Variable, setze sie auf True, bevor du Change nochmal ausführst und mache Application.undo davon abhängig.
Anzeige
AW: Application.UnDo
17.07.2020 17:26:03
Michael
Danke für die Antwort. Manchmal sollte man doch auf der Microsoft Seite nachlesen.
Grüße Michael
Gerne !
17.07.2020 18:37:02
onur
;
Anzeige

Infobox / Tutorial

Anwendung von Application.Undo in Excel VBA


Schritt-für-Schritt-Anleitung

  1. Erstellen eines Worksheet_Change Triggers: Du kannst den Worksheet_Change Trigger verwenden, um Änderungen in einem bestimmten Bereich zu überwachen. Achte darauf, dass du Application.EnableEvents auf False setzt, um eine Schleife zu vermeiden.

    Private Sub Worksheet_Change(ByVal Target As Range)
       Application.EnableEvents = False
       ' Dein Code hier
       Application.EnableEvents = True
    End Sub
  2. Verwendung von Application.Undo: Um die letzte Aktion rückgängig zu machen, kannst du Application.Undo verwenden. Dies sollte jedoch an der richtigen Stelle im Code platziert werden, um sicherzustellen, dass es nur die letzte Benutzeraktion betrifft.

    Application.Undo
  3. Wertzuweisung und Trigger auslösen: Wenn du per Code einen Wert in eine Zelle schreibst, stelle sicher, dass Application.EnableEvents wieder auf True gesetzt ist. Dies ermöglicht es dem Trigger, erneut ausgeführt zu werden.

    Application.EnableEvents = True
    Target.Offset(1, 0).Value = neuerWert ' Beispiel für das Setzen eines Werts

Häufige Fehler und Lösungen

  • Fehler: Application.Undo funktioniert nicht: Dies geschieht oft, wenn Application.Undo nicht die letzte Benutzeraktion betrifft. Stelle sicher, dass dein Code nicht mehrere Application.Undo aufruft, da dies zu einem Fehler führen kann.

  • Lösung: Verwende eine globale Variable, um den Zustand zu verfolgen. Setze diese Variable vor dem erneuten Auslösen des Triggers und lasse Application.Undo davon abhängig sein.

    Global triggerActive As Boolean
    
    Private Sub Worksheet_Change(ByVal Target As Range)
       If triggerActive Then Exit Sub
       triggerActive = True
       ' Code hier
       Application.Undo
       triggerActive = False
    End Sub

Alternative Methoden

Wenn Application.Undo nicht die gewünschte Funktionalität bietet, kannst du versuchen, die ursprüngliche Formel vor dem Überschreiben zu speichern.

  1. Zwischenspeichern der Formel: Speichere die Formel in einer Variablen, bevor du den Wert änderst.

    Dim alteFormel As String
    alteFormel = Target.Formula
    Target.Value = neuerWert
  2. Wiederherstellen der Formel: Wenn nötig, kannst du die Formel später wiederherstellen.

    Target.Formula = alteFormel

Praktische Beispiele

Angenommen, du hast eine Zelle, die eine Formel enthält, und du möchtest den Wert durch Application.Undo wiederherstellen:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim alteFormel As String
    Application.EnableEvents = False

    If Not Intersect(Target, Me.Range("A1")) Is Nothing Then
        alteFormel = Target.Formula
        Target.Value = 100 ' Beispiel für eine Eingabe
        ' Trigger erneut ausführen
        Application.EnableEvents = True
        Application.Undo ' Versucht, die vorherige Formel wiederherzustellen
    End If

    Application.EnableEvents = True
End Sub

Tipps für Profis

  • Nutze Application.EnableEvents immer sorgfältig, um unerwartete Schleifen zu vermeiden.
  • Teste deinen Code in einer sicheren Umgebung, bevor du ihn auf wichtige Daten anwendest.
  • Halte deine Excel-Version auf dem neuesten Stand, um die neuesten Funktionen und Bugfixes zu nutzen.

FAQ: Häufige Fragen

1. Warum funktioniert Application.Undo nicht, wenn ich Werte per Code schreibe?
Application.Undo kann nur die letzte Aktion des Benutzers rückgängig machen. Wenn du per VBA schreibst, zählt das nicht als Benutzeraktion.

2. Gibt es eine Möglichkeit, die alte Formel zu speichern, ohne Application.Undo zu verwenden?
Ja, du kannst die Formel in einer Variablen speichern, bevor du den Wert änderst, und sie später wiederherstellen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige