Worksheet_Change事件中的Excel VBA静态时间戳

时间:2017-03-10 23:40:09

标签: excel vba excel-vba

我正在创建一个日志,当数据最初输入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

任何指导都将不胜感激。

2 个答案:

答案 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属性,以便在执行行删除等操作时最小化处理。