感谢您阅读我的帖子。我遇到了一个奇怪的(在我看来)行为 Excel中的Worksheet_Calculate事件(Windows 7旗舰版,Excel 2010),让我通过给你一个设置来描述我遇到的问题。
带2张工作簿。 Sheet 2 Cell A1有一个公式= Sheet1!A1,Sheet2的EnableCalculation属性设置为TRUE,而Sheet2对象中有一个Sub
Private Sub Worksheet_Calculate()
i = MsgBox("Value " & Me.Range("A1").Value, vbOKOnly)
End Sub
在Module1中有一个SUB
Public Sub mySub()
Application.EnableEvents = False
ThisWorkbook.Worksheets(2).EnableCalculation = True
ThisWorkbook.Worksheets(2).EnableCalculation = False
Application.EnableEvents = True
End Sub
现在,在Sheet1单元格A1中输入1 - 将显示一个带有“值1”的消息框。接下来,将Sheet2的EnableCalculation属性设置为FALSE,并在Sheet1单元格A1中输入2 - 没有任何反应。现在,在模块1中运行mySub - Sheet2上的Cell A1显示2,Sheet2的EnableCalculation属性设置为FALSE。到现在为止还挺好。现在在Sheet1 Cell A1中输入3 - 显示一个带有“值2”的消息框!
似乎在执行mySub期间触发了一个Calculation事件(即使Application.EnableEvents设置为FALSE)并且存储了值2(其中?)然后在输入3时释放了此事件Sheet1上的单元格A1(即使Sheet2的EnableCalculation设置为FALSE)。任何线索在这里发生了什么以及如何“修复”这种奇怪的行为?
非常感谢。
答案 0 :(得分:0)
来自http://www.decisionmodels.com
'将enablecalculation设置为false然后再返回true将标记工作表上的所有公式为未计算。如果计算模式为自动,则将触发重新计算。所有计算方法,包括Sheet.Calculate但不包括Range.Calculate,将计算工作表上的所有公式。您可以使用此方法作为在工作表而不是工作簿级别模拟Calculatefull的方法。请注意,Sheet.Calculate不会重置未计算的公式标志,因此在切换EnableCalculation属性后,两个Sheet.Calculates将同时执行完整工作表计算。'
这似乎解决了这个问题
Public Sub mySub()
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
ThisWorkbook.Worksheets(2).EnableCalculation = True
ThisWorkbook.Worksheets(2).EnableCalculation = False
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub