WorksheetChangeEvents函数是否有可能在运行自身时错过事件?

时间:2018-08-18 06:59:21

标签: excel vba

我正在为VBA中的工作表更改事件功能背后的机制苦苦挣扎。我编写了以下脚本:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim NewPrice, OldPrice
Dim intersection As Range
Set intersection = Intersect(Target, Range("B:B"))
OldPrice = Target.Value

If Not intersection Is Nothing Then
    Application.EnableEvents = False

    With Target
        NewPrice = .Value
        Application.Undo
        OldPrice = .Value
        .Value = NewPrice
    End With

    *Do something* 
    Application.EnableEvents = True
End Sub

宏需要运行0.04秒。尽管这非常低,但Range(“ B:B”)中几乎有200个值。所有这些单元格代表股票的报价数据,因此它们变化很大。

问题1 :当此宏运行时(例如,由于单元格B4的更改而引发),并且在运行时,列B中的另一个单元格发生了变化,会发生什么?此宏会再次运行,更重要的是,每次单元格更改时,都会运行该宏吗?

问题2 :B列中的其他单元格会首先发生变化吗?因为我的宏包含以下几行

Application.EnableEvents = False
Do something
Application.EnableEvents = True

这些行是必需的,因为脚本会导致循环。

我在官方文档(https://docs.microsoft.com/en-us/office/vba/api/Excel.Worksheet.Change)中找不到答案

提前谢谢

1 个答案:

答案 0 :(得分:1)

您可以在运行代码时使用Application.EnableEvents = False帮助触发Worksheet_Change事件。因此,回答您的问题:

Application.EnableEvent设置为False时,单元格的更改将触发Worksheet_Change事件的另一次运行。并且,您仍然可以更改单元格值。只需尝试添加类似Cells(1,2).value = "Test"的行,而不要执行任何操作并使用F8循环代码。

旁注:您错过了End if:)