仅当特定Excel单元格在“公式重新计算”上更改时调用函数

时间:2012-09-27 23:43:45

标签: excel vba excel-vba

据我所知,当工作表中的任何单元格的值在公式重新计算时发生更改时,将调用Worksheet_Calculate

有没有办法让我只需要在特定细胞更改公式重新计算时调用函数

2 个答案:

答案 0 :(得分:2)

要在更改特定单元格时发生某些事情,您需要在文件Worksheet_Change(byval target as Range)中嵌入相关的选择更改事件。当您的单元格更改时,我们可以重新计算工作表,如下所示:

Private Sub Worksheet_Change(byval target as range)

    If target.address = Range("YourCell").Address Then Application.Calculate

End Sub

现在您要做的是在其余时间关闭计算。如果您只想关闭单张纸上的计算(而不是整个文件),则需要在激活时关闭计算,并在取消激活时关闭计算,例如。

Private Sub Worksheet_Activate

Application.Calculation = xlCalculationManual

End Sub

Private Sub Worksheet_Deactivate

Application.Calculation = xlCalculationAutomatic

End Sub

当然,您重新计算的要求可能比上述示例复杂得多。首先,您可以在相关工作表上打开文件,在这种情况下,您应该使用Workbook_Open事件来检测工作表,并相应地设置计算

然后你可能有几个细胞可能需要某种计算。大概你想要关闭计算的原因是文件运行得太慢了。如果是这样,并且您正在识别所有输入单元格,则可以使用代码输入输出。一种方法是使用本指南输入公式entering formulas in Excel Visual Basic。然后,您可以使用计算值替换公式,例如Range("YourCell") = Range("YourCell").Value ...所以停止不断增长的表格中的公式数量

答案 1 :(得分:1)

让我看看我是否正确地解释了你的问题。您想知道如果特定单元格(或单元格组)发生更改,是否可以仅启动宏。

答案是肯定的。稍微调整Ed的代码。

Private Sub Worksheet_Change(byval target as range)

    If Not Intersect(target.address, Range("YourCells")) is Nothing Then 
       MyMacro()
    End If

End Sub

我认为你使用“功能”会让人失望。这就是为什么Ed的答案如此精细。

确定。您可能正确地陈述了您的问题,而您只是想提高效率。在这种情况下,Ed的答案可以解决您的直接问题,但是当您更改其他单元格时,会导致电子表格无法自动计算。