我有一个用例,其中有一个用于用户输入的单元格,以及一系列具有依赖于该单元格的公式的其他单元格。我的目的是在计算公式之前清理数据。这些公式可能非常昂贵,因此我希望尽可能防止它们在垃圾数据上进行计算。所以我想要一些vba代码检查输入并在公式计算被触发之前清理它。我设置了一个Worksheet_Change事件来处理用户输入,但不幸的是,似乎甚至在输入Worksheet_Change()之前计算了依赖单元格。无论如何,我能实现我想要的目标吗?
答案 0 :(得分:0)
你可以试试这个:
首先,从Manual
菜单上的Calculation Options
选择Formulas
,关闭自动计算。
然后在清理代码的末尾添加此行,以使工作簿计算:
Application.Calculate
这将在Excel执行计算之前更新所有具有新清除值的公式(因为自动计算已关闭)。
如果您担心用户重新开启自动计算,从而减慢计算速度,您可以添加此更多行以尽快将其关闭:
Application.Calculation = xlCalculationManual
注意:也许这是反社交的,因为我认为Excel中的自动计算选项是整个实例,因此会影响用户'其他电子表格。您可以使用Workbook_Open
事件中的一些代码来解决此问题,以记住Application.Calculation
属性的状态,然后将其关闭(如上所述),然后在{{1}中使用一些代码} event再次恢复它。建议用户确保他们在Excel实例中单独使用您的工作簿,以确保不会对他们造成任何不便!
修改:就在最后一个注释中,最好使用Workbook_Close
和Workbook_Activate
代替Workbook_Deactivate
和Workbook_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中都有一个公式,并且证明您的清洁代码在计算公式之前发生。