【问题标题】:Excel VBA Timestamp not updatingExcel VBA时间戳未更新
【发布时间】:2017-03-28 12:09:17
【问题描述】:

我正在构建一个工作表,它将跟踪我们传入的预告片并将该信息放在仪表板上。我有 VBA 设置,当用户将 A 列中的单元格从此处更改为已关闭时,它会将该行复制到下一张将保留预告片历史记录的工作表。

我的问题是完成页面上的 VBA 时间戳在复制该行时没有更新。我知道 vba 可以工作,因为我可以更改已完成工作表上的预告片编号,它将触发 vba 并出现时间戳。但是当从仪表板表复制该行时,我需要显示该时间戳。

我是否遗漏了一些我需要打开以帮助触发时间戳的东西?

谢谢

编辑-对不起,我没有添加代码。这是我在已完成工作表上的时间戳

Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("C2:C10000")) Is Nothing Then Exit Sub
If Target.Count > 1 Then Exit Sub
If Target = "" Then Exit Sub

With Application
    .ScreenUpdating = False
    .EnableEvents = False
    With Cells(Target.Row, 10)
        .Value = Now
        .NumberFormat = "mm/dd/yyyy hh:mm:ss"
    End With
    .EnableEvents = True
    .ScreenUpdating = True
End With

End Sub

我的仪表板页面的代码将复制该行

Private Sub Worksheet_Change(ByVal Target As Range)

If Intersect(Target, Range("A2:A5000")) Is Nothing Then Exit Sub
If Target.Count > 1 Then Exit Sub
If Target = "" Then Exit Sub

Dim NR As Long

With Application
    .EnableEvents = False
    .ScreenUpdating = False
    Select Case Target.Value
        Case "Closed"
          Range("A" & Target.Row & ":z" & Target.Row).Copy _
          Worksheets("Completed").Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
          Target.EntireRow.Delete Shift:=xlUp
    End Select
    .EnableEvents = True
    .ScreenUpdating = True
End With

End Sub

【问题讨论】:

  • 您缺少的一件事是我们可以帮助您的源代码。我们很好,但不是精灵。请发布您的源代码,我们将能够更好地为您提供帮助。
  • 我不太确定您的期望是什么?当您复制一行时,谁或什么应该更改 Completed 表上的任何内容?显然,要复制一行的 sub 包括行 .EnableEvents = False。所以,另一个潜艇不会运行。这很好。因此,如果您想在复制该行之后更改工作表 Completed 上的任何内容,那么我建议您将该位包含在复制该行的 sub 中。
  • 您说您正在复制一行,但如果目标范围内有 >1 个单元格,则宏退出(如果 Target.Count > 1 Then Exit Sub)。很可能它不会因此而触发。
  • @Flephal 它不会运行,因为事件被禁用。
  • @Flephal 你说过EnableEvents = False is required。然而,这正是 OP 想知道的:为什么该事件没有触发和更新日期。上述帖子中的 second Worksheet_Change 将一行从“主工作表”复制到“已完成”工作表,然后 first Worksheet_Change 应该更新日期(在它被第二个Worksheet_Change 复制之后)。但这不会发生,因为在第二个 Worksheet_Change 运行时事件被禁用。

标签: vba excel timestamp


【解决方案1】:

这是我想出的解决方案。我不明白为什么需要两个工作表功能就足够了。将此代码放在仪表板工作表中,它将复制并粘贴到已完成的工作表中。我在代码中添加了一些内容。首先,错误处理,如果出现错误并且.EnableEvents = False 是执行的最后一行之一,则后续事件不会触发,您不会对自己满意。我还添加了一些End If,您的代码中似乎缺少这些。我在代码中添加了一些 cmets,以便您了解我在哪里进行了更改。

Private Sub Worksheet_Change(ByVal Target As Range)
  On Error GoTo ErrorHandler

If Intersect(Target, Range("A2:A5000")) Is Nothing _
   Then Exit Sub
If Target.Count > 1 Then
   Exit Sub
End If

If Target = "" Then
   Exit Sub
End If

Dim NR As Long
With Application
  .EnableEvents = False
  .ScreenUpdating = False
  Select Case Target.Value
    Case "Closed"
      Range("A" & Target.Row & ":z" & Target.Row).Copy _
      Worksheets("Completed").Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
      'get the last cell used.
      Set lastCell = Worksheets("Completed").Range("A" & Rows.Count).End(xlUp)
      'new line of code
      lastCell.Offset(0, 10).Value = Now
      lastCell.Offset(0, 10).NumberFormat = "mm/dd/yyyy hh:mm:ss"
      Target.EntireRow.Delete Shift:=xlUp
   End Select
  .EnableEvents = True
  .ScreenUpdating = True

End With

Exit Sub
ErrorHandler:
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    MsgBox "You have encountered an error. Please notify admin"
End Sub

【讨论】:

  • 我希望您不介意我编辑了您的解决方案,但是您错误地从原始帖子中复制了 OffSet。那里的偏移量是 10 列而不是 1 列。另外,我在原帖中添加了NumberFormat
  • @Ralph,我的坏 Ralph,感谢您的更新。我认为大多数原始帖子都有该信息,或者我只是错误地复制了信息。感谢更新!
  • @Miguel 代码太棒了!谢谢! Ralph 和 Flephal,也感谢你们的帮助!
  • @RabidWookie 很高兴为您提供帮助。干杯!不要忘记将其标记为已回答!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 2017-01-22
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多