通过创build时间戳来追踪更改

原始代码(Excel VBA)我发现工作正常跟踪一列:

Private Sub Worksheet_Change(ByVal Target As Range) 'Update 20140722 Dim WorkRng As Range Dim Rng As Range Dim xOffsetColumn As Integer Set WorkRng = Intersect(Application.ActiveSheet.Range("P:P"), Target) xOffsetColumn = 2 If Not WorkRng Is Nothing Then Application.EnableEvents = False For Each Rng In WorkRng If Not VBA.IsEmpty(Rng.Value) Then Rng.Offset(0, xOffsetColumn).Value = Date Rng.Offset(0, xOffsetColumn).NumberFormat = "dd-mm-yyyy" Else Rng.Offset(0, xOffsetColumn).ClearContents End If Next Application.EnableEvents = True End If End Sub 

我想跟踪两列。 下面,你会发现新添加的代码。 它不起作用,即使我改变了Dim(通过添加ab)之后的variables名称。 简单地复制粘贴旧代码,然后只更改从P:P到S:S的范围,而xOffsetColumn也不起作用。

 Private Sub Worksheet_Change_b(ByVal Target As Range) 'Update 20140722 Dim WorkRngb As Range Dim Rngb As Range Dim xOffsetColumnb As Integer Set WorkRngb = Intersect(Application.ActiveSheet.Range("S:S"), Target) xOffsetColumnb = 3 If Not WorkRngb Is Nothing Then Application.EnableEvents = False For Each Rngb In WorkRngb If Not VBA.IsEmpty(Rngb.Value) Then Rngb.Offset(0, xOffsetColumnb).Value = Date Rngb.Offset(0, xOffsetColumnb).NumberFormat = "dd-mm-yyyy" Else Rngb.Offset(0, xOffsetColumnb).ClearContents End If Next Application.EnableEvents = True End If End Sub 

对原始Worksheet_Change事件macros的这种修改应兼顾这两个列,包括将多个值粘贴到包含一列或两列的范围中。

 Private Sub Worksheet_Change(ByVal Target As Range) 'Update 20150930 If Not Intersect(Target, Union(Columns("P"), Columns("S"))) Is Nothing Then On Error GoTo bm_Safe_Exit Application.EnableEvents = False Dim rng As Range For Each rng In Intersect(Target, Union(Columns("P"), Columns("S"))) If Not VBA.IsEmpty(rng) Then rng.Offset(0, 2 - CBool(rng.Column = 19)) = Date rng.Offset(0, 2 - CBool(rng.Column = 19)).NumberFormat = "dd-mm-yyyy" Else rng.Offset(0, 2 - CBool(rng.Column = 19)).ClearContents End If Next rng End If bm_Safe_Exit: Application.EnableEvents = True End Sub 

为了简单的偏移量,我只是简单地回溯了P列到N列的两列。我不确定为什么第二个事件macros样本只能移回P列; 我不认为你打算重写P列的值

Application.ActiveSheet.Range("P:P")列引用是不必要的,并且如果事件macros是由更改其中一个值而另一个工作表持有ActiveSheet属性的代码触发的,则可能是非常危险的。 工作表代码页默认是私有的; 模块代码页是默认公开的。 您可以引用单元格和范围,而无需在工作表代码表中显式声明它们的父代,而这是模块代码表上的错误编码实践。

我也将时间戳的值从“ Date更改为“ Now 。 单元格格式将仍然只显示date,但如果您需要它,您也将有时间。