EnableCalculation和xlCalculationManual / Automatic之间的切换有什么区别?

时间:2015-06-23 08:31:41

标签: excel vba

假设我有一个我的工作簿想要更新,除非专门调用更新过程。也就是说,我想停止任何形式和类型的自动更新 - 我不希望公式更新,我不希望任何数据连接更新。

应用这两者有什么区别?

Private Sub Workbook_Open()
    Application.Calculation = xlCalculationManual
End Sub

VS

Private Sub Workbook_Open()
    Worksheet(1).EnableCalculation = False    
End Sub

工作簿只有1张。

MSDN表示当EnableCalculation设置为false时,您无法请求重新计算。这是否意味着按下F9或数据选项卡上的刷新按钮不起作用(这是理想的)?

假设EnableCalculation 阻止所有重新计算请求,其中xlCalculation只是在手动/自动模式之间切换,那么这是正确的吗?

2 个答案:

答案 0 :(得分:1)

您可以使用BeforeRefresh事件及其Cancel参数来防止刷新。这些事件不会自动暴露,因此您必须创建自定义类模块并声明QueryTable变量WithEvents。在CQTEvents类中

Private WithEvents mqt As QueryTable
Private mbPreventRefreshes As Boolean

Public Property Let PreventRefreshes(ByVal bPreventRefreshes As Boolean): mbPreventRefreshes = bPreventRefreshes: End Property
Public Property Get PreventRefreshes() As Boolean: PreventRefreshes = mbPreventRefreshes: End Property
Public Property Set qt(ByVal qt As QueryTable): Set mqt = qt: End Property
Public Property Get qt() As QueryTable: Set qt = mqt: End Property

Private Sub qt_BeforeRefresh(Cancel As Boolean)

    Cancel = Me.PreventRefreshes

End Sub

我将Cancel参数设置为该类的另一个属性。您需要实例化该类,将其保留在范围内,并将事件连接起来。

Sub MyUninteruptableProcedure()

    Dim clsQtEvents As CQtEvents

    Set clsQtEvents = New CQtEvents
    Set clsQtEvents.qt = Sheet1.ListObjects(1).QueryTable
    clsQtEvents.PreventRefreshes = True

    'do uninteruptable stuff

    Set clsQtEvents = Nothing 'unhook the events

End Sub

答案 1 :(得分:0)

我无法为此获得可行的直接修复,因此解决方法是将表单保​​护与未锁定的单元格结合使用以允许编辑但不允许外部数据更新。

当可以安全地提取更新时,VBA会取消保护。