Ich habe eine Formel in C2, sagen Sie =A2+B2
. Immer wenn C2 den Wert ändert (Istwert, nicht Formel), möchte ich, dass das aktuelle Datum und die aktuelle Uhrzeit in D2 aktualisiert werden.
Ich habe viele VBA-Codes und Tricks ausprobiert und keiner von ihnen funktioniert, wenn eine Formel in C2 eingegeben wird. ABER wenn ich einen Wert manuell in C2 eingebe, werden Datum und Uhrzeit nach Bedarf aktualisiert. Dies liegt natürlich daran, dass ein realer Wert eingegeben/geändert wird - bei dem die Formel gleich bleibt.
Frage: Kann ein VBA-Code (oder etwas anderes) erstellt werden, der D2 aktualisiert, wenn sich das Ergebnis der Formel in C2 ändert?
Wenn möglich, brauche ich dies für die Zellen C2: C30 (+ D2: D30 für Datum + Uhrzeit).
Verwenden von Excel 2010.
Sie können die abhängige Zelle (D2) mit einer benutzerdefinierten Funktion (VBA-Makrofunktion) füllen, die den Wert der C2-Zelle als Eingabeparameter übernimmt und das aktuelle Datum als Ausgabe zurückgibt.
Wenn Sie C2 als Eingabeparameter für die UDF in D2 verwenden, wird Excel angezeigt, dass D2 bei jeder Änderung von C2 neu bewertet werden muss (dh, wenn die automatische Berechnung von Formeln für die Arbeitsmappe aktiviert ist).
BEARBEITEN:
Hier ist ein Code:
Für die UDF:
Public Function UDF_Date(ByVal data) As Date
UDF_Date = Now()
End Function
Als Formel in D2:
=UDF_Date(C2)
Sie müssen dem D2-Cell ein Datum-Uhrzeit-Format zuweisen, oder es wird eine numerische Darstellung des Datumswerts angezeigt.
Sie können die Formel über den gewünschten Bereich ausdehnen, indem Sie sie ziehen, wenn Sie die C2-Referenz in der D2-Formel relativ beibehalten.
Hinweis: Dies ist möglicherweise immer noch nicht die ideale Lösung, da bei jeder Neuberechnung der Arbeitsmappe durch Excel das Datum in D2 auf den aktuellen Wert zurückgesetzt wird Es müsste eine Art Nachverfolgung der vergangenen Werte von C2 .. geben. Dies könnte zum Beispiel in der UDF implementiert werden, indem auch die Adresse neben dem Wert des Eingabeparameters angegeben wird, wobei die Eingabeparameter in a gespeichert werden ausgeblendetes Blatt, und vergleicht sie bei jedem Aufruf der UDF mit den vorherigen Werten.
Nachtrag:
Hier sehen Sie eine Beispielimplementierung einer UDF, die die Änderungen der Zellenwerte verfolgt und das Datum und die Uhrzeit zurückgibt, als die letzten Änderungen erkannt wurden. Wenn Sie diese Funktion verwenden, beachten Sie Folgendes:
Die Verwendung der UDF ist dieselbe wie oben beschrieben.
Die UDF funktioniert nur für einzelne Zelleneingabebereiche.
Die Zellenwerte werden verfolgt, indem der letzte Wert der Zelle und das Datum und die Uhrzeit, zu der die Änderung erkannt wurde, in den Dokumenteigenschaften der Arbeitsmappe .__ gespeichert werden. Wenn die Formel für große Datensätze verwendet wird, kann die Größe der -Datei erheblich zunehmen, da für jede Zelle, die von Verfolgt wird, der Speicherbedarf steigt (letzter Wert von Zelle + Datum der letzten Änderung. ) Excel ist möglicherweise auch nicht in der Lage, sehr große Mengen an Dokumenteigenschaften zu verarbeiten, und der Code könnte an einem bestimmten Punkt abbremsen.
Wenn der Name eines Arbeitsblatts geändert wird, gehen alle Verfolgungsinformationen der darin enthaltenen Zellen verloren.
Der Code kann für Zellenwerte bremsen, für die die Konvertierung in eine Zeichenfolge nicht deterministisch ist.
Der folgende Code ist nicht getestet und sollte nur als Beweis für das Konzept angesehen werden. Verwenden Sie es auf eigene Gefahr .
Public Function UDF_Date(ByVal inData As Range) As Date
Dim wb As Workbook
Dim dProps As DocumentProperties
Dim pValue As DocumentProperty
Dim pDate As DocumentProperty
Dim sName As String
Dim sNameDate As String
Dim bDate As Boolean
Dim bValue As Boolean
Dim bChanged As Boolean
bDate = True
bValue = True
bChanged = False
Dim sVal As String
Dim dDate As Date
sName = inData.Address & "_" & inData.Worksheet.Name
sNameDate = sName & "_dat"
sVal = CStr(inData.Value)
dDate = Now()
Set wb = inData.Worksheet.Parent
Set dProps = wb.CustomDocumentProperties
On Error Resume Next
Set pValue = dProps.Item(sName)
If Err.Number <> 0 Then
bValue = False
Err.Clear
End If
On Error GoTo 0
If Not bValue Then
bChanged = True
Set pValue = dProps.Add(sName, False, msoPropertyTypeString, sVal)
Else
bChanged = pValue.Value <> sVal
If bChanged Then
pValue.Value = sVal
End If
End If
On Error Resume Next
Set pDate = dProps.Item(sNameDate)
If Err.Number <> 0 Then
bDate = False
Err.Clear
End If
On Error GoTo 0
If Not bDate Then
Set pDate = dProps.Add(sNameDate, False, msoPropertyTypeDate, dDate)
End If
If bChanged Then
pDate.Value = dDate
Else
dDate = pDate.Value
End If
UDF_Date = dDate
End Function
Machen Sie das Einfügen des Datums abhängig von dem Bereich.
Dies hat den Vorteil, dass das Datum nicht geändert wird, es sei denn, der Inhalt der Zelle wird geändert, und es liegt im Bereich C2: C2. Selbst wenn das Blatt geschlossen und gespeichert wird, wird es nicht neu berechnet, es sei denn, die angrenzende Zelle ändert sich.
Angepasst von dieser Tipp und @Paul S Antwort
Private Sub Worksheet_Change(ByVal Target As Range)
Dim R1 As Range
Dim R2 As Range
Dim InRange As Boolean
Set R1 = Range(Target.Address)
Set R2 = Range("C2:C20")
Set InterSectRange = Application.Intersect(R1, R2)
InRange = Not InterSectRange Is Nothing
Set InterSectRange = Nothing
If InRange = True Then
R1.Offset(0, 1).Value = Now()
End If
Set R1 = Nothing
Set R2 = Nothing
End Sub
Am einfachsten ist es, =IF(B3="","Not Allocated",Now())
hinzuzufügen und das Format der Spalte in das erforderliche Datums- und Uhrzeitformat zu ändern. Wenn hier jedoch die Spalte B bearbeitet wird, werden Datum und Uhrzeit der jeweiligen Spalte, für die das Update erforderlich ist, automatisch für alle Spalten aktualisiert, da der alte Wert nicht geprüft wird. Wenn es jedoch gut ist, die aktuelle Uhrzeit zu erhalten, kann diese problemlos verwendet werden.
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$2" Then
ActiveSheet.Range("D2").Value = Now()
End If
End Sub