除非手动更改单元格,否则Excel工作表更改事件不会触发


4

我使用以下代码,效果很好。但是,应该触发此事件的单元格的更改是使用公式而不是单元格中的条目。如果我输入条目,一切正常。但是,如果我使用公式从另一个工作表中获取数据,则不会。例如,AD中的细胞具有类似的公式 =HR!P27

我错过了什么?

码:

    Private Sub Worksheet_Change(ByVal Target As Range)
    'Update 20140722
    Dim WorkRng As Range
    Dim Rng As Range
    Dim xOffsetColumn As Integer
    Set WorkRng = Intersect(Application.ActiveSheet.Range("AD:AD"), Target)
    xOffsetColumn = -1
    If Not WorkRng Is Nothing Then
        Application.EnableEvents = False
        For Each Rng In WorkRng
           If Not VBA.IsEmpty(Rng.Value) Then
              Rng.Offset(0, xOffsetColumn).Value = Now
              Rng.Offset(0, xOffsetColumn).NumberFormat = "dd-mm-yyyy, hh:mm:ss"
           Else
             Rng.Offset(0, xOffsetColumn).ClearContents
           End If
        Next
        Application.EnableEvents = True
    End If
    End Sub

Answers:


2

返回不同结果的公式不符合对单元格的更改。根据描述 Worksheet_Change 事件,它:

当用户或外部链接更改工作表上的单元格时发生。

当您观察到单元格的内容实际上没有变化时,这种行为是有意义的。例如,包含的单元格 =HR!P27 之前 在公式返回不同的结果后。只有公式的结果发生了变化。在这种情况下,Excel会区分影响单元格内​​容与输出的更改。

如果每次更新公式时都需要运行代码,请考虑使用 Worksheet_Calculate 事件。每次重新计算工作表时都会触发。


我试图这样做,但现在得到一个错误。任何人都可以使用Worksheet_Calculate帮助我正确地写这个吗?
Terrib

你需要问一个 新问题 。如果需要,您可以链接到此问题以提供上下文。
Twisty Impersonator

0

考虑你的VBA代码中的范围(“AD:AD”),我想建议你背后的原因以及你如何解决问题的解决方案

如果范围是 手动刷新 (事实上​​你做了什么),然后是 可以使用Change Event。

如果范围 包含任何公式 那么 可以使用Calculate Event。

如果范围 包含通过外部数据或公式刷新的值 ,然后在Range(“AD”AD“)中输入=(”AD:AD“)和 然后也可以使用计算事件。

这是可能的原因。因此,如果范围被刷新,则AD:AD将自动计算并触发事件。

我猜你还没有输入代码 的ThisWorkbook。 该代码需要输入 ,然后它的工作原理。

所以结论是使用Calculate Event。

下面是两个示例编码方法,帮助您摆脱这种情况。

方法1:

Private Sub Worksheet_Calculate()
    Dim target As Range
    Set target = Range("AD:AD")

    If Not Intersect(target, Range("AD:AD")) Is Nothing Then

    PASTE YOUR VB CODE HERE.

    End If

End Sub

方法2:

只需创建它。

Private Sub Worksheet_Calculate()
   Worksheet_Change Range("AD:AD")
End Sub

注意: 此代码将处理您现有的“工作表更改事件”练习。

我希望这对你有所帮助。


当我尝试这个时,我得到一个错误
Terrib

当我将代码粘贴到您建议的位置时,我得到一个“预期的结束子”错误,该错误指向第4行。“如果不相交(目标,范围(”AD:AD“))是什么,那么.....之后我的所有代码都被粘贴了。
Terrib

将代码放入在Change事件中触发代码的Calculate事件将导致在某些情况下触发Change事件重复。这不太可能是理想的行为。
Twisty Impersonator

@Terrib同时粘贴您的代码只删除Line Private Sub Worksheet_Change和End Sub,实际上您已粘贴整个代码,包括Private Sub ,,,和End Sub。它会工作。
Rajesh S
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.