2017-03-10 3 views
1

Ziel:Anwenden Zeitstempel auf dynamische Reihe auf Änderungsereignis

Ich mag einen Datum-/Zeitstempel in eine Spalte über die letzte Spalte in der Zeile gesetzt haben, geändert wird, basierend auf einem Änderungsereignis. Der Wert der Zelle, wenn ausgewählt, soll mit dem Wert derselben Zelle verglichen werden, wenn sie nicht mehr das Ziel ist.

Aktuelle Code:

Im Sheet1 Code anzeigen

Private Sub Worksheet_Change(ByVal Target As Range) 

'MsgBox "Now: " & Now() 

Dim i, j As Integer 
Dim k As String 
Dim LC As Long 

i = Target.Row 
j = Target.Column 
k = Target.Value 
LC = Cells(i, Columns.Count).End(xlToLeft).Column 

If Not Cells(i, j).Value = k Then 
    Cells(i, LC + 1).Formula = Format(Now(), "yyyyMMddhhmmss") 
End If 

End Sub 

Problem:

Nach dem Versuch, diesen Code auszuführen, kann ich keine Ausgabe erhalten. Getestet habe ich MsgBox mit „Now:“ & now(), was mir tut zeigen, dass die Änderung Ereigniscode an der richtigen Stelle ist (ich bemerkte, dass, aber es war, wie ich überprüft, welche sollte erschienen

. ich dachte, dass durch i definieren, j und k, außerhalb der If-Anweisung, dass ich diese Werte speichern könnte und vergleichen Werte von der Auswahl im Vergleich zu, wenn sie nicht ausgewählt

. Frage:

ist der Weg Ich stelle diesen Code unpassend auf, und wenn ja, wie würde ich dies korrigieren, um geeigneter zu sein? Das ist meine Tanne Spielzeit mit Change Events.

Edit1: mehr Einzelheiten zu Ziel, wenn man bedenkt Kommentar von @ScottCraner

+0

Sie testen, ob die Zielzelle oder Zelle, die sich geändert hat, nicht dem Wert entspricht, der darin enthalten ist. Dies liefert immer den Wert false, da die Zielzelle immer dem Zielzellenwert entspricht. Noch eine Anmerkung: Sobald Sie herausgefunden haben, was Sie eigentlich testen möchten, müssen Sie vor dem Vornehmen von Änderungen eine 'application.EnableEvents = False 'einfügen und danach' application.EnableEvents = True', damit es nicht in eine Schleife geht wird die Reihe mit Daten füllen, bis Sie keine Spalten mehr haben. –

+0

@ScottCraner Danke dafür. Ich habe nicht einmal darüber nachgedacht, die Ereignisse dort abzustellen (töricht bin ich). Ich versuche sicherzustellen, dass meine anfänglich ausgewählte Zelle immer noch dieselbe ist, wenn ich diese Zelle verlasse, vorausgesetzt, ich benutze den Abwärtspfeil und überkreuze einige Zellen. – Cyril

+0

Das Ereignis "workshape_change" wird nur ausgelöst, wenn ein Zellenwert geändert wird, nicht die Auswahl. Nach der Änderung hat die Bereichsvariable Target alle Attribute der Zelle, die sich geändert hat, einschließlich ihres neuen Werts, nicht des alten. Das Alte ist weg. –

Antwort

3

Wie pro Ihre Kommentare hinzufügen Sie wollen:

Private Sub Worksheet_Change(ByVal Target As Range) 

'MsgBox "Now: " & Now() 

Dim i As Long 

Dim LC As Long 

i = Target.Row 
LC = Cells(i, Columns.Count).End(xlToLeft).Column 

Application.EnableEvents = False 
Cells(i, LC + 1).Formula = Format(Now(), "yyyyMMddhhmmss") 
Application.EnableEvents = True 

End Sub 
+0

schlag mich um 56 Sekunden, +1. Du könntest auch 'i' loswerden –

+1

Danke, dass du mir das hier erklärt hast. Ich habe offenbar übersehen, wie das Change Event ausgelöst wurde. Sehr geschätzt. Wird @Shairado +1 geben, damit er etwas aus seiner Zeit bekommt, wie ihr zwei gespiegelt habt! – Cyril

+1

@Shairado ja, aber meh. Geben Sie die zusätzlichen i's ein und tippen Sie dann zweimal 'Target.Row'. Und durch diese Logik könnte man es auch ohne das LC machen. –

2

Ist das, was Sie suchen?

Private Sub Worksheet_Change(ByVal Target As Range) 

Dim LC As Long 

Application.EnableEvents = False 

LC = Cells(Target.Row, Columns.Count).End(xlToLeft).Column 
Cells(Target.Row, LC + 1).Formula = Format(Now(), "yyyyMMddhhmmss") 

Application.EnableEvents = True 

End Sub 
Verwandte Themen