VBA在单元格更改时运行macros,但不是macros

好吧,我不确定这是否容易实现,但我会尝试。

如果一个单元格被改变,我使用这个子程序来执行一些macros:

Private Sub Worksheet_Calculate() Dim target As Range Set target = Range("b4") If Not Intersect(target, Range("b4")) Is Nothing Then Call init End If End Sub 

这工作正常,但我有一个问题。

单元格B4 ,如上面单元格更改子部分中所引用的,其值由一个已命名的dynamic范围确定,并且包含另一个表单上的值列表。 我使用数据validation工具使B4成为带有指定范围内容的下拉列表。

我有另一个macros的目的是更新这个列表。 它所做的是清除当前列表,查询一个数据库并将一堆值输出到该范围中。 麻烦的是,当这个macros运行时,会导致B4的值发生变化(因为B4引用了该范围中的值)。 这反过来导致我的“单元格更改”macros运行抛出错误。

有没有办法来防止“单元格更改”macros运行,而我正在更新它引用的列表?

希望这个问题是有道理的。

您可以通过使用Application.EnableEvents如下所示禁用Worksheet_Calculate事件。 请注意,这将禁用可能出现在Application.EnableEvents = FalseApplication.EnableEvents = True之间的任何WorkSheetWorkBook事件

所以,如果你的其他子版本是这样运行的 – Worksheet_Calculate事件不会触发

 Sub Other_Sub() Application.EnableEvents = False [b4].Value = "10" 'other stuff Application.EnableEvents = True End Sub 

没关系,我已经制定了一个简单的解决scheme:只要把一个条件语句说,如果B4包含错误或空白,不执行“初始化”。

并注意(退出子)或(退出函数)…不要忘记使用Application.EnableEvents = True之前(退出子)或(退出function)命令(如果存在)