webentwicklung-frage-antwort-db.com.de

Automatische Datumsaktualisierung in einer Zelle, wenn sich der Wert einer anderen Zelle ändert (berechnet anhand einer Formel)

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.

5
AlienHand

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
    
10
Roman

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
4
datatoo

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.

0
Arun Chettoor
Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Address = "$C$2" Then

        ActiveSheet.Range("D2").Value = Now()

    End If

End Sub
0
Paul S