在计算依赖公式之前处理worksheet_change事件

时间:2015-09-29 05:42:37

标签: excel-vba excel-formula vba excel

我有一个用例,其中有一个用于用户输入的单元格,以及一系列具有依赖于该单元格的公式的其他单元格。我的目的是在计算公式之前清理数据。这些公式可能非常昂贵,因此我希望尽可能防止它们在垃圾数据上进行计算。所以我想要一些vba代码检查输入并在公式计算被触发之前清理它。我设置了一个Worksheet_Change事件来处理用户输入,但不幸的是,似乎甚至在输入Worksheet_Change()之前计算了依赖单元格。无论如何,我能实现我想要的目标吗?

1 个答案:

答案 0 :(得分:0)

你可以试试这个:

首先,从Manual菜单上的Calculation Options选择Formulas,关闭自动计算。

然后在清理代码的末尾添加此行,以使工作簿计算:

Application.Calculate

这将在Excel执行计算之前更新所有具有新清除值的公式(因为自动计算已关闭)。

如果您担心用户重新开启自动计算,从而减慢计算速度,您可以添加此更多行以尽快将其关闭:

Application.Calculation = xlCalculationManual

注意:也许这是反社交的,因为我认为Excel中的自动计算选项是整个实例,因此会影响用户'其他电子表格。您可以使用Workbook_Open事件中的一些代码来解决此问题,以记住Application.Calculation属性的状态,然后将其关闭(如上所述),然后在{{1}中使用一些代码} event再次恢复它。建议用户确保他们在Excel实例中单独使用您的工作簿,以确保不会对他们造成任何不便!

修改:就在最后一个注释中,最好使用Workbook_CloseWorkbook_Activate代替Workbook_DeactivateWorkbook_Open

使用它,这是代码,进入你的Workbook_Close对象。

ThisWorkbook

此代码包含一些Public previousCalculationState As XlCalculation Private Sub Workbook_Activate() previousCalculationState = Application.Calculation Application.Calculation = xlCalculationManual End Sub Private Sub Workbook_Deactivate() Application.Calculation = previousCalculationState End Sub Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Debug.Print "before clean: G6 = " & Range("G6").Value ' this shows that G6 has the old value, before calc ' your cleaning code to go here, which can use Sh and Target to find out which cell changed Application.Calculate Application.Calculation = xlCalculationManual Debug.Print "after clean: G6 = " & Range("G6").Value ' this shows that G6 has the new value, after calc Debug.Print End Sub ,假设您在每张工作表的单元格G6中都有一个公式,并且证明您的清洁代码在计算公式之前发生。