带有手动计算的Worksheet_Change(Application.Calculation = xlManual)

时间:2018-08-01 22:47:22

标签: excel vba excel-vba

每次用户输入值(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)

有没有办法让此方法“更改”以进行手动计算?)

1 个答案:

答案 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