Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
980to984
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
980to984
980to984
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

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

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

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

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

Anzeige
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

302 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige