我正在为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)中找不到答案
提前谢谢
答案 0 :(得分:1)
您可以在运行代码时使用Application.EnableEvents = False
帮助不触发Worksheet_Change
事件。因此,回答您的问题:
将Application.EnableEvent
设置为False
时,单元格的更改将否触发Worksheet_Change
事件的另一次运行。并且是,您仍然可以更改单元格值。只需尝试添加类似Cells(1,2).value = "Test"
的行,而不要执行任何操作并使用F8
循环代码。
旁注:您错过了End if
:)