每次用户输入值(source1 source2)时,我都希望Excel计算工作表:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Set KeyCells = Worksheet("Calc").Range("R1:R100")
MsgBox "Check!"
Application.EnableEvents = False
If Not Intersect(KeyCells, Range(Target.Address)) Is Nothing Then
' Display a message when one of the designated cells has been changed.
MsgBox "Cell " & Target.Address & " has changed."
'Calculate
Sheets("Calc").Calculate
End If
Application.EnableEvents = True
End Sub
输入值后不会重新计算工作表。甚至,消息框“检查!”永远不会出现。 -为什么呢?
(有关信息:我只能猜测这与将计算设置为“手动”有关:
我在工作簿“ B.xlsm”中有一张带有循环引用的工作表,因此我从工作簿“ A.xlsm”中运行脚本,从中打开工作簿“ B.xlsm”:
Application.Calculation = xlManual
[...]
Set wb = Workbooks.Open(strPath)
有没有办法让此方法“更改”以进行手动计算?)
答案 0 :(得分:1)
我认为蒂姆钉牢了它。
在测试代码的某个时刻,代码停止了;从运行时错误或手动逐行逐步执行。在这两种情况下,您都可能更改了一些内容,迫使其重置,并且它从来没有机会运行最重要的行... Application.EnableEvents = True
。
禁用事件是一种持久状态。
如果其他用户要使用您的代码,确保您有错误处理来恢复它是非常明智的。不幸的是,您在测试时仍然会破坏它。
在发生这种情况时,我使用以下例程(在主模块顶部)对其进行了修复:
Public Sub FixIt()
Application.EnableEvents = True
If Not ActiveWindow Is Nothing Then Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
实际上,我通常将此例程称为功能区/表单上任何按钮的第一行,以确保一切正常进行。
根据您的情况,您可以省略Application.Calculation
行,或将其设置为等于xlManual