0

我正在尝试记录从单元格“B2”到单元格“D2”每分钟更改一次的值。当值连续记录到“D2”时,我想在记录到单元格“E”的同时添加日期和时间。在这里,下面是我的代码。

Private Sub Worksheet_Calculate()
    Application.EnableEvents = False
    Me.Range("D" & Me.Rows.Count).End(xlUp).Offset(1).Value = Me.Range("B2").Value
    Application.EnableEvents = True
    
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim targetRng As Range
    Dim rng As Range
    Dim c As Integer
    
    Set targetRng = Intersect(Application.ActiveSheet.Range("D:C"), Target)
    c = 1
    
    If Not targetRng Is Nothing Then
       Application.EnableEvents = False
       For Each rng In targetRng
          If Not VBA.IsEmpty(rng.Value) Then
             rng.Offset(0, c).Value = Now
             rng.Offset(0, c).NumberFormat = "dd/mm/yyyy, hh:mm:ss AM/PM"
          Else
             rng.Offset(0, c).ClearContents
          End If
       Next
    Application.EnableEvents = True
    
    End If
End Sub

似乎每次记录值时,单元格“E”中的日期和时间似乎都不能一起工作。这里有什么解决办法吗?

4

2 回答 2

0

我建议创建一个不受事件直接影响的单独 Sub。为您的目的重写下面的代码。

Private Sub Worksheet_Calculate()
   SharedSheetEvent()
end sub
Private Sub Worksheet_Change(ByVal Target As Range)
   EditingSheet = true
   call SharedSheetEvent()
   editingsheet = false
end sub

global EditingSheet as bool

public Sub SharedSheetEvent()
   if (EditingSheet) Then
      do some stuff
   else 
      do some other stuff
   end if
end sub

于 2021-04-30T07:50:06.357 回答
0

下面的代码将做你想做的事。不需要两个过程,但是如果您不指定工作表,这意味着您让它在 ActiveSheet 上工作,这将是一个失败的大炮。

Private Sub Worksheet_Calculate()

    Dim LastRecord      As Range            ' cell last written to
    Dim NewValue        As Variant          ' current value in B2
    
    Debug.Print "calculate"
    With Worksheets("Sheet1")               ' change to suit
        Set LastRecord = .Cells(.Rows.Count, "D").End(xlUp)
        NewValue = .Cells(2, "B").Value
        
        With LastRecord
            If .Value <> NewValue Then      ' skip if no change
                Application.EnableEvents = False
                .Offset(1).Value = NewValue
                With .Offset(1, 1)
                    .Value = Now()
                    .NumberFormat = "dd/mm/yyyy, hh:mm:ss AM/PM"
                End With
                Application.EnableEvents = True
            End If
        End With
    End With
End Sub

然而,问题不在于代码如何工作,而在于何时工作。我假设 B2 被一个在计时器上工作的程序改变了。它生成的更改不会触发 Worksheet 的 Change 事件。但是,您确实发现它触发了Calculate 事件。这是我的假设,我无法测试它。如果是这样,我的程序将解决您的问题。

我最近使用自己的计时器编写了类似的东西来触发运行我的程序。它只是一个计时器,它以与另一个相同的间隔运行,并且每分钟(例如)检查 B2 是否已更改,如果有更改则记录更改。这样可行。但是,如果您的更新程序触发了Calculate 事件,这看起来是一个更巧妙的想法。

于 2021-04-30T08:33:27.140 回答