Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Wert vor Ändern einer Zelle abrufen

Wert vor Ändern einer Zelle abrufen
05.06.2008 16:09:00
Tomi
Liebe Excelpert/innen,
welche Möglichkeit gibt es innerhalb eines Moduls eine Wert der in einer Zelle stand, abzurufen nachdem diese Zelle verändert wurde.
Bsp.
In Zelle A1 steht eine 3
Nun ändert jemand diese Zelle A1 und schreibt eine 5 hinein
--- Wie kann ich nun in einem Modul den Wert bevor die 5 hineingeschrieben wurde (also die 3) abfragen ?
Danke für jede Hilfe und viele Grüße,
Tomi

Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Wert vor Ändern einer Zelle abrufen
05.06.2008 16:37:44
Andreas
Hi Tomi,
m. E. geht das nur, indem du das Worksheet_Change Event nutzt, die geänderte Zelle ausliest in einen Parameter, dann ein Undo in Excel vornimmst und den alten Wert in einen zweiten Parameter einliest und dann den ersten Parameter wieder hernimmst und die Zelle damit füllst.
Viele Grüße
Andreas

Anzeige
AW: Wert vor Ändern einer Zelle abrufen
05.06.2008 16:42:42
fcs
Hallo Tomi,
direkte Möglichkeit kenn ich nicht,
Du kannst jedoch das Selektion_Ereignis nutzen, um bei Zellauswahl im relevanten Bereich den aktuellen Wert und ggf. auch das Range-Objekt der Selektion in einer Variablen speichern.
Im Change_Ereignis des Worksheets prüfst du dann ob die Änderung akzeptiert wird oder auf den vorherigen Wert zurückgesetzt wird.
Ausserdem muss du in der Change_Prozedur die Events zeitweise deaktivieren, damit du nicht in eine Endlosschleife geräts.
Das ist eine ziemliche Puzzle-Arbeit bis des rund läuft.
Gruß
Franz

Anzeige
AW: Wert vor Ändern einer Zelle abrufen
05.06.2008 16:44:00
Nepumuk
Hallo Tomi,
mal ein Beispiel. Wenn du allerdings mehrere Zellen auf einmal änderst, gibt diese Variante nur den Wert der obersten linken Zelle des geänderten Bereiches zurück. Im Array "vntBefore" sind aber alle Werte drin.
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim vntAfter As Variant, vntBefore As Variant
    Dim strAddress As String
    strAddress = Selection.Address
    vntAfter = Target.Value2
    With Application
        .EnableEvents = False
        .ScreenUpdating = False
        .Undo
    End With
    Range(strAddress).Select
    vntBefore = Target.Value2
    Target.Value2 = vntAfter
    If IsArray(vntBefore) Then
        MsgBox vntBefore(1, 1)
    Else
        MsgBox vntBefore
    End If
    With Application
        .EnableEvents = True
        .ScreenUpdating = True
    End With
End Sub

Ich würde da aber eine Abfrage einbauen, wie groß der geänderte Bereich ist, denn wenn jemand eine oder mehrere Spalten oder sogar die ganze Tabelle markiert und z.B. auf entfernen drückt, dann dauert das eine Weile, bis das Programm durch ist. Ist die ganze Tabelle markiert, wird das Programm sowieso auf einen Fehler laufen, denn ein so großes Variant-Array erzeugt einen Überlauf.
Gruß
Nepumuk

Anzeige
AW: @Nepumuk
05.06.2008 17:41:46
Erich
Hi Max,
eine Frage: Ist die Zeile
Range(strAddress).Select
wirklich nötig?
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

AW: @Nepumuk
05.06.2008 17:45:00
Nepumuk
Hallo Erich,
sieht irgendwie doof aus, wenn ich A1 ändere und nach dem drücken der Enter-Taste der Cursor wieder in A1 steht. Wenn du ne bessere Idee hast, her damit.
Gruß
Nepumuk

Anzeige
AW: Danke! (Du warst schneller...) owT
05.06.2008 17:49:20
Erich

AW: @Nepumuk - eledigt
05.06.2008 17:47:16
Erich
Hi Max,
jetzt habe ich die Frage selbst beantwortet:
Sie ist nötig, denn ohne diese Zeile bleibt der Zellzeiger "hängen", verhält sich also nicht mehr normal.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

AW: Wert vor Ändern einer Zelle abrufen
06.06.2008 08:14:40
Tomi
Danke für die Ideen.
Danke Andreas Emmert - diese idee werde ich aufgreifen, da ich sowieso mit dem Worksheets-Change arbeite.
An einer anderen Stelle im Programmablauf überprüfe ich ob mehr als eine Zelle geändert werden soll und unterbinde dies (ausser bei Admin-Rechten) mit einem application.undo, somit stellt sich nicht die Problematik, mehrere Werte abspeichern zu müssen.
Meine "Quick and Dirty" Lösung sieht dann so aus - funktioniert für meine Zwecke astrein, wenngleich vielleicht ein wenig umständlich
'Eintrag rückgängig machen um Original-Wert auszulesen
ProgID = "OriginalWert"
Application.Undo
EndeOriginalWert:
OriginalWert = Worksheets(WorkS).[A1].Offset(UpdateZeile - 1, UpdateSpalte - 1).Value2
ProgID = "OriginalWert2"
Worksheets(WorkS).[A1].Offset(UpdateZeile - 1, UpdateSpalte - 1).Value2 = UpdateWert
EndeOriginalWert2:
Die Variablen UpdateWert und OriginalWert sind beide Public und stehen mir somit an Ende der letzten Programmzeile zur Verfügung.
Danke und Gruß,
Tomi
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Wert vor Ändern einer Zelle abrufen in Excel


Schritt-für-Schritt-Anleitung

Um den Wert einer Zelle vor einer Änderung in Excel abzufragen, kannst Du das Worksheet_Change-Ereignis nutzen. Hier ist eine einfache Schritt-für-Schritt-Anleitung:

  1. Öffne das Visual Basic for Applications (VBA) Editor mit ALT + F11.
  2. Suche das entsprechende Arbeitsblatt, in dem Du die Änderungen verfolgen möchtest.
  3. Füge den folgenden Code in das Arbeitsblattmodul ein:
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim vntBefore As Variant
    Dim vntAfter As Variant

    ' Speichere den aktuellen Wert
    vntBefore = Target.Value2

    ' Mache das letzte Ereignis rückgängig, um den alten Wert zu erhalten
    Application.EnableEvents = False
    Application.Undo
    vntAfter = Target.Value2

    ' Setze den Wert zurück auf den neuen Wert
    Target.Value2 = vntBefore

    ' Zeige den alten Wert an
    MsgBox "Alter Wert: " & vntAfter

    Application.EnableEvents = True
End Sub
  1. Schließe den VBA-Editor und teste die Funktion, indem Du den Wert einer Zelle änderst.

Häufige Fehler und Lösungen

  • Fehler: "Laufzeitfehler 1004"
    Ursache: Dies passiert, wenn Du versuchst, eine große Anzahl von Zellen gleichzeitig zu ändern.
    Lösung: Überprüfe die Anzahl der betroffenen Zellen und verhindere Änderungen an zu vielen Zellen. Verwende beispielsweise eine Abfrage, um die Größe des geänderten Bereichs zu überprüfen.

  • Fehler: Endlosschleife
    Ursache: Wenn das Worksheet_Change-Ereignis nicht deaktiviert wird, kann es zu einer Endlosschleife kommen.
    Lösung: Stelle sicher, dass Application.EnableEvents = False zu Beginn der Prozedur gesetzt wird.


Alternative Methoden

Eine alternative Methode ist die Verwendung des Selection_Change-Ereignisses, um den aktuellen Wert zu speichern, bevor eine Zelle geändert wird. Hier ist ein Beispiel:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ' Speichere den aktuellen Wert in einer globalen Variablen
    Global LastValue As Variant
    LastValue = Target.Value2
End Sub

Du kannst dann diese Variable im Worksheet_Change-Ereignis verwenden, um den vorherigen Wert abzurufen.


Praktische Beispiele

Hier ist ein praktisches Beispiel, das zeigt, wie Du den alten Wert in einer MsgBox anzeigen kannst:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim OldValue As Variant
    OldValue = Target.Value2

    Application.EnableEvents = False
    Application.Undo
    MsgBox "Alter Wert: " & Target.Value2
    Target.Value2 = OldValue
    Application.EnableEvents = True
End Sub

Tipps für Profis

  • Verwende Option Explicit: Das Hinzufügen von Option Explicit am Anfang Deines Codes hilft, Tippfehler zu vermeiden, indem es sicherstellt, dass alle Variablen deklariert sind.
  • Entwickle eine Fehlerbehandlung: Implementiere eine Fehlerbehandlungsroutine, um unerwartete Fehler elegant abzufangen.
  • Dokumentiere Deinen Code: Schreibe Kommentare zu Deinem Code, um ihn verständlicher für andere (oder Dich selbst in der Zukunft) zu machen.

FAQ: Häufige Fragen

1. Wie kann ich den alten Wert in einer anderen Zelle speichern?
Du kannst den alten Wert in einer anderen Zelle speichern, indem Du den Code anpasst, um einfach Worksheets("DeinBlatt").Range("B1").Value = OldValue hinzuzufügen.

2. Ist dieser Code mit allen Excel-Versionen kompatibel?
Ja, dieser VBA-Code funktioniert in Excel-Versionen, die VBA unterstützen, wie Excel 2010, 2013, 2016 und 2019.

3. Was passiert, wenn ich mehrere Zellen gleichzeitig ändere?
Der Code gibt nur den Wert der ersten Zelle im geänderten Bereich zurück. Du musst möglicherweise eine Schleife einbauen, um alle Werte zu verarbeiten.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige