Excel - bei WENN-Anweisung keine Änderung des Zelleninhalts

sTEk

Erfahrenes Mitglied
Hallo!
Ich möchte nur beim aktuellen Datum eine Änderung in der jeweiligen Zelle durchführen.
Der Vergleich klappt soweit (Vergleichsdatum in anderer Zelle) - wenn die beiden Daten jedoch nicht gleich sind (was ja beim Großteil des Monats ist ;)) gibt die WENN-Funktion entweder ein "FALSCH" oder den Sonst-Wert zurück. Was muss ich beim Sonst-Wert eintragen, damit der eigentliche Inhalt nicht geändert wird?

Bsp:
Heute ist der 3.1.2007. Für heute soll er die aktuelle Uhrzeit eintragen, bei den anderen Tagen keine Änderung vornehmen.
nicht so richtig klappende Formel: =WENN(A5=HEUTE(); JETZT())

so soll es aussehen:
1.1.2007 > 14:30 (alter Wert)
2.1.2007 > 16:12 (gestriger, alter Wert)
3.1.2007 > aktuelle Uhrzeit
 
Zuletzt bearbeitet:
Hai,

das ist nicht ganz einfach zu Lösen, dieses Problem.

Variante 1: über Zirkelverweise.
Allerdings meckert hier Excel öfters mal, berechnet aber trotzdem den Wert, sofern möglich.

Bsp.:
Code:
A		B				C
01.04.07	10:31				10:31
		=WENN(A1=HEUTE(); JETZT();C1)	=B1
Nun noch A1bis C1 markieren und nach unten kopieren.
Excel schreibt dann zwar in fortführender B bzw C-Reihe eine Uhrzeit rein, aber diese wird erst am entsprechenden Tag aus Spalte A geändert. In meinen kurzen Experimenten hatte diese Variante funktoniert.

Variante 2: Macro
Eine andere und auf jedenfall funktionierende Variante ist das Erstellen eines Macros.
Dazu einen Code in das Worksheet speichern, der es auf Veränderungen überprüft und bei Veränderung die entsprechenden Funktionen ausführt.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Application.Intersect(Target, _
        Range("D:D")) Is Nothing Then
        lz = Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
        For i = 2 To lz
            If Not Application.Intersect(Target, _
                Cells(i, 4)) Is Nothing Then
                If Cells(i, 1) = Date Then
                  Cells(i, 2) = Time
                End If
                Exit For
            End If
        Next i
    End If
End Sub

Zuerst wir auf Veränderungen in Spalte E gesucht und dann wird gesucht in welcher Zeile diese Veränderung stattgefunden hat.
Der Rest ist eine einfache Überprüfung des Datums und gegebenenfalls das Reinschreiben der Uhrzeit.


Gruss DuckDonald
 
Zuletzt bearbeitet:
Danke für Deine schnelle Antwort.
Bei der ersten Lösungsmöglichkeit verweigert er mir die zusammenarbeit. ;)

Nun zur zweiten:
Ich gebe zu, das ist mein erster Ausflug in die Makro-Welt und ich habe da einige Fragen. Leider t das Makro so nicht, obwohl es ja automatisch ausgeführt werden sollte, oder?

Es fängt erst in Zeile 6 an:
Code:
For i = 6 To lz

Die Zeit steht in Spalte D:
Code:
Cells(i, 3)) Is Nothing Then
...
Cells(i, 3) = Time
Hab ich das soweit richtig verstanden?
 
Hallo nochmal,

ja, wenn der Code erst in Zeile 6 anfangen soll ist "For i = 6 To lz" richtig.
Hinweis: Die Zeile "lz = Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row" ermittelt die letzte beschriebene Zeile.


A entspricht 1; B entspricht 2; . . . D=4

also: "Cells(i, 4) = Time"

Die Spalte auf die bei Veränderung reagiert werden soll muss hier eingetragen werden: "Range("G:G")) Is Nothing Then"

und die Zahl der entsprechenden Reihe hier: "Cells(i, 7)) Is Nothing Then" (G=7)


Gruss DuckDonald
 
So...ich habe den Code folgendermaßen abgeändert - aber irgendwie funktioniert es nicht. Ich habe das Gefühl, dass er das Makro nicht mal ausführt. :/
Beim Laden des Dokuments fragt er mich zwar nach dem aktivieren der enthaltenen Makros, ein abarbeiten ist jedoch nicht zu sehen.
Ich habe das Makro über den VB-Editor in Tabelle1 eingefügt.

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Application.Intersect(Target, _
        Range("D:D")) Is Nothing Then
        lz = Cells.Find("*", [A6], , , xlByRows, xlPrevious).Row
        For i = 6 To lz
            If Not Application.Intersect(Target, _
                Cells(i, 4)) Is Nothing Then
                If Cells(i, 2) = Date Then
                  Cells(i, 4) = Time
                End If
                Exit For
            End If
        Next i
    End If
End Sub
 
Habe jetzt mal meine Übungsdatei mit hochgeladen, denn da funktionierts eigenlich so, wie du beschrieben hattest. Des Weiteren habe ich mal etwas ausführlicher den code Kommentiert.
 

Anhänge

  • Wenn-Datum.zip
    8,7 KB · Aufrufe: 60
Wunderbar - es klappt!
Ich hatte nicht gesehen, dass das Makro erst nach einer Eingabe in der speziellen Spalte aktiv wird.

Ich danke Dir! :)

Ähm...noch was...kann man ein Makro auch so aufrufen lassen, dass es direkt zum Ende kurz vor dem Schließen der Datei ausgeführt wird?
 
Ja, das geht.

Im VB-Editor hast du die einzelnen Tabellen. Dort kannst du zB oben einstellen Worksheet und dann einige aktionen auswählen, wie Change, Activate, Deactivate.
Wenn du jetzt links statt "Tabelle1" "DieseArberitmappe" auswählst und oben Workbook einstellst, dann kannst du auch das Ereignis "BeforeClose" auswählen.
 
Okay - danke, das hat geklappt.
Nun habe ich natürlich das Problem, dass er in der Zeile
Code:
            If Not Application.Intersect(Target, _
                Cells(i, 5)) Is Nothing Then
das Target nicht mehr kennt (ist ja in Deiner Funktion in der Deklaration drin).
Was muss ich denn da nun eintragen bzw. kannst Du mir mal einen MSDN-Verweis zu dem eigentlichen Befehl geben? Habe nichts gefunden.
 
Nunja, das BevorClose ereignis ist ja ein Globales Ereignis, das heist es geht nicht mehr zu überprüfen in welchen Blatt genau was geändert wird/wurde.

Ich ging davon aus, dass der nur bei Veränderung der Zeile die Uhrzeit aktualisieren soll, wenn der aber einfachso beim beenden oder öffnen das machen soll, dann reicht es aus den Mittelteil der Funktion zu verwenden.

Code:
        Sheets("Tabelle1").Select 'da es ja ins Beenden-Ereignis reinkommt, kann es ja sein das ein anderes Tabellenblatt ausgewählt ist
        lz = Cells.Find("*", [A6], , , xlByRows, xlPrevious).Row
        For i = 6 To lz
                If Cells(i, 2) = Date Then
                  Cells(i, 4) = Time
                End If
        Exit For
        ActiveWorkbook.Save 'zum Speichern der gemachten änderungen (ich glaube versehentlich gemachte änderungen werden mit gespeichert!!)
Jetzt müsste bei jedem Beenden des Dokumentes die Zeilen auf das aktuelle Datum gesucht werden und ggf. die aktuelle Zeit eingeschrieben werden. (habs nicht nochmal getestet)
 
Zurück