我发现原始代码(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 之后更改了变量名称(通过添加 b),它也不起作用。简单地复制粘贴旧代码,然后仅将范围从 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
这个修改是对你原来的工作表_更改 https://msdn.microsoft.com/en-us/library/office/ff839775.aspx事件宏应该处理两列,包括将多个值粘贴到包含一列或两列的范围中。
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 列。我不确定为什么第二个事件宏示例仅移回到 P 列;我认为您无意覆盖 P 列中的值。
The Application.ActiveSheet.Range("P:P")
如果事件宏是由更改其中一个值的代码触发的,而另一个工作表保存该值,则列引用是不必要的,并且存在潜在危险。工作表代码页默认是私有的;模块代码页默认是公共的。您可以引用单元格和范围,而无需在工作表代码表中显式声明其父级,而这在模块代码表中是不好的编码实践。
我还更改了用于时间戳的值Date
to Now
。单元格格式仍然只显示日期,但如果您需要它,您也有时间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)