我正在创建一个日志,当数据最初输入Cell C时,它会自动将时间戳填充到Cell D中。不幸的是,我遇到了问题。
当我在Cell C中输入数据时,我能够在Cell D中获取时间戳,但如果我对Cell C进行任何更改,则时间戳会再次更新。
我需要让它起作用,这样如果Cell C为空,时间戳只会在Cell D中改变。
如果数据已经输入到单元格C中,并且时间戳已经加载到单元格D,并且我需要修改单元格C中的内容,我不希望时间戳单元格D发生更改。
希望这是有道理的。 VBA代码如下:
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim rCell As Range
Dim rChange As Range
On Error GoTo ErrHandler
Set rChange = Intersect(Target, Range("C:C"))
If Not rChange Is Nothing Then
Application.EnableEvents = False
For Each rCell In rChange
If rCell > "" Then
With rCell.Offset(0, 1)
.Value = Now
.NumberFormat = "hh:mm:ss AM/PM mm/dd/yyyy"
End With
Else
rCell.Offset(0, 1).ClearContents
End If
Next
End If
ExitHandler:
Set rCell = Nothing
Set rChange = Nothing
Application.EnableEvents = True
Exit Sub
ErrHandler:
MsgBox Err.Description
Resume ExitHandler
End Sub
任何指导都将不胜感激。
答案 0 :(得分:3)
看起来很简单。我错过了什么吗?在更新之前,请检查以确保单元格为空。
With rCell.Offset(0, 1)
If .Value <> "" Then
.Value = Now
.NumberFormat = "hh:mm:ss AM/PM mm/dd/yyyy"
End If
End With
答案 1 :(得分:1)
如果在列C中键入值时,如果没有时间戳,则下面将时间戳放入D列。如果列C中的值被清除,则列D中的任何现有时间戳也将被清除。如果对C列中的条目进行编辑,则不会对现有时间戳进行任何更改。
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Columns("C"), Target.Parent.UsedRange) Is Nothing Then
On Error GoTo Safe_Exit
Application.EnableEvents = False
Dim rng As Range
For Each rng In Intersect(Target, Columns("C"), Target.Parent.UsedRange)
If CBool(Len(rng.Value2)) And Not CBool(Len(rng.Offset(0, 1).Value2)) Then
rng.Offset(0, 1) = Now
ElseIf Not CBool(Len(rng.Value2)) And CBool(Len(rng.Offset(0, 1).Value2)) Then
rng.Offset(0, 1) = vbNullString
End If
Next rng
End If
Safe_Exit:
Application.EnableEvents = True
End Sub
此例程将多个单元格作为Target处理;通常当多行数据粘贴到C列时。它进一步将Intersection限制为工作表的UsedRange属性,以便在执行行删除等操作时最小化处理。