Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel VBA工作表中的静态时间戳\u更改事件_Vba_Excel - Fatal编程技术网

Excel VBA工作表中的静态时间戳\u更改事件

Excel VBA工作表中的静态时间戳\u更改事件,vba,excel,Vba,Excel,我正在创建一个日志,当数据最初输入到单元格C时,它会自动将时间戳填充到单元格D中。不幸的是,我遇到了麻烦 当我在单元格C中输入数据时,我能够在单元格D中获得时间戳,但是如果我对单元格C进行任何更改,时间戳将再次更新 我需要使它正常工作,以便只有当单元格C为空时,时间戳才会在单元格D中更改 如果数据已经输入到单元格C,并且时间戳已经加载到单元格D,并且我需要修改单元格C中的内容,我不希望时间戳单元格D发生更改 希望这是有道理的。VBA代码如下: Private Sub Worksheet_Chan

我正在创建一个日志,当数据最初输入到单元格C时,它会自动将时间戳填充到单元格D中。不幸的是,我遇到了麻烦

当我在单元格C中输入数据时,我能够在单元格D中获得时间戳,但是如果我对单元格C进行任何更改,时间戳将再次更新

我需要使它正常工作,以便只有当单元格C为空时,时间戳才会在单元格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

任何指导都将不胜感激

似乎很简单。我错过什么了吗?在更新之前,只需检查以确保单元格为空即可

With rCell.Offset(0, 1)
    If .Value <> "" Then
        .Value = Now
        .NumberFormat = "hh:mm:ss AM/PM mm/dd/yyyy"
    End If
End With

在C列中键入值时,如果D列中没有时间戳,则以下内容会将时间戳放入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

此例程将处理多个单元格作为目标;通常情况下,当将多行数据粘贴到列C中时。它进一步将交集限制为工作表的UsedRange属性,以便在执行行删除之类的操作时最小化处理。

当前代码显示了一种情况,即从列D中删除时间戳,尽管出现这种情况时会出现逻辑错误的请详细说明在每种可能出现的情况下你希望发生什么;1.D列中没有时间戳,C列中没有值。2。D列中有时间戳,C.3列中没有值。D列或C列中没有值。4。C&D两列中的值。嗨,Jeped,让我试着解释一下我想做得更好一点的地方。我正在创建一个日志模板来运行停机调用。列C的标题为偶数细节,最初为空。当大修期间发生任何值得注意的事情时,团队成员会将其输入C列。当有人将数据输入C列中的空白单元格时,我希望在D列中显示时间戳。如果有人对C列中的条目进行更正,我不希望D列中的时间戳更新。如果他们删除了C列中的所有数据,那么我希望时间戳消失。不应该发生。如果C中有数据,那么D应该填充一个时间戳。2.不应该发生。时间戳仅在数据输入C.3时出现。两列都应为空4。数据将显示在C列中,时间戳将显示在D列中。嗨,John,当输入您的建议时,时间戳完全没有出现。非常感谢您的及时回复!请原谅我的无知,但我对VBA没有太多经验,所以我不确定我应该把这个添加放在哪里。它替换了您在问题中引用的一个。嗯,当我替换它并尝试运行它时,我得到一个编译错误:子或函数未定义。然后突出显示第一个IsBlank是的,应该是IsEmpty,而不是IsBlank。我改变了上面的逻辑。吉普,你是个野兽。非常感谢您的帮助!我已经插入了新代码,它正在按预期工作!我对VBA很陌生,不知道你能否给我指一个学习基础知识的好地方。再次感谢你,你是最棒的!