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

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

我使用以下代码,效果很好。但是,对应该触发此事件的单元格的更改是使用公式而不是单元格中的条目进行的。如果我输入条目,一切都会正常。但如果我使用公式从另一个工作表中获取数据,则不会。例如,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

答案1

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

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

当你观察到单元格的内容实际上没有改变时,这种行为是有道理的。例如,=HR!P27之前包含的单元格公式返回不同的结果后。只有公式的结果发生了变化。正如本例所证实的,Excel 区分了影响单元格内​​容的变化与其输出的变化。

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

答案2

考虑一下 VBA 代码中的 Range("AD:AD"),我想向您建议背后的原因以及解决方案,您如何解决该问题

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

如果范围包含任何公式,然后可以使用计算事件。

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

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

我猜你还没有输入代码本工作簿。需要输入以下代码床单,那么它就可以工作了。

所以结论是使用计算事件。

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

方法 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

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

我确实希望这对你有帮助。

相关内容