假设我有一个我不的工作簿想要更新,除非专门调用更新过程。也就是说,我想停止任何形式和类型的自动更新 - 我不希望公式更新,我不希望任何数据连接更新。
应用这两者有什么区别?
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只是在手动/自动模式之间切换,那么这是正确的吗?
答案 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会取消保护。