代码之家  ›  专栏  ›  技术社区  ›  Shawn Djontz

比较vba。Now vs cell Today公式

vba
  •  0
  • Shawn Djontz  · 技术社区  · 1 年前

    我有一个脚本,每当我输入数据时都会为其添加时间戳,但有时我必须手动更改日期。 问题是,当我必须在自动时间戳和手动日期之间应用一个公式时,例如“if is The same date”,即使格式相同,它也会为相同的日期返回false值。我知道这是脚本设置为“字符串”的问题,但我不知道如何修复它
    例如,我需要做:
    =IF(J2=TODAY();1;0)
    “J2”是带有的自动时间戳。现在通过以下脚本

    Private Sub Worksheet_Change(ByVal Target As Range)
      Const ColumnsToMonitor As String = "k:z"
      Const DateColumn As String = "j"
      Application.EnableEvents = True
      
      
      If Not Intersect(Target, Columns(ColumnsToMonitor)) Is Nothing Then
        Intersect(Target.EntireRow, Columns(DateColumn)).Value = Format(Now, "ddd d/mm")
      End If
           
      Application.EnableEvents = True
    End Sub
    

    如何修复脚本,以便我可以将自动时间戳与=Now与手动日期或=Today公式进行比较

    1 回复  |  直到 1 年前
        1
  •  2
  •   taller    1 年前

    以下代码行用文本填充列J中的单元格( String )而不是日期/值。因此, J2=TODAY() 评估为 False 。快速修复方法是将公式更新为 =IF(J2=TEXT(TODAY(), "ddd d/mm"),1,0) .

    Intersect(Target.EntireRow, Columns(DateColumn)).Value = Format(Now, "ddd d/mm")
    

    我建议更新您的脚本,用实际日期填充J列中的单元格。以下是建议的更改:

    • 设置 Application.EnableEvents = False 作为第一设置。
    • 使用 Date 返回今天的日期,而不是 Now .
    • 对J列应用日期格式以确保一致性。

    应用更改后,您的公式应能正常工作。

    Private Sub Worksheet_Change(ByVal Target As Range)
      Const ColumnsToMonitor As String = "k:z"
      Const DateColumn As String = "j"
      Application.EnableEvents = False
      
      If Not Intersect(Target, Columns(ColumnsToMonitor)) Is Nothing Then
            With Intersect(Target.EntireRow, Columns(DateColumn))
                .Value = Date
                .NumberFormat = "ddd d/mm"
            End With
      End If
           
      Application.EnableEvents = True
    End Sub