2017-09-06 62 views
0

所以这是一个普遍问题,我确定之前已经询问过这个问题,但我无法找到很多帮助。如何限制Worksheet_Calculate()仅在计算指定范围时执行

在具有一个工作表范围的Excel说B6:F12是我有在Worksheet_Calculate()子程序有问题的计算结果全部

我的问题是,随着对worksheet_calculate这种非常通用代码子程序

Private Sub Worksheet_Calculate() 
    Dim aCell as Range 
    Dim aRange as Range 
    Set aRange = Range(B6:B12) 
    For Each aCell in aRange 
      SomeFunction(aCell) 
    Next 
End Sub 

这种情况发生在范围C6任何计算:F12通过人气指数发生和不必要的调用SomeFunction(aCell)导致迭代。

如何才能使此场景只发生在范围B6:B12上执行计算?

+0

你可能有更具体一点。也许从您的数据中显示样本。何时进行计算?在你的代码中你有'B6:B12',但在你的问题中你有'C6:F12'和'B6:F12'。 – ShanayL

+0

您是否只在范围'B6:B12'中有值时才运行该函数?如果它是你正在尝试的,使用'如果aCell <>“”然后'或[在单元格或范围更改](https://stackoverflow.com/questions/409434/automatically-execute-an-excel-macro-on单元格更改) – danieltakeshi

+0

单独的计算在所有单元格B6:F12中执行,因此是35个不同的计算。当B6:B12中的计算发生时,我需要调用SomeFunction()。由于它随时都会调用工作表上任何位置的计算,因此SomeFunction()会通过迭代调用。 – Chris

回答

0

您启动FOR循环之前补充一点:

If Not Application.Intersect(ActiveCell, aRange) Is Nothing Then 

这只会触发FOR循环,如果你是在给定范围内

编辑
我的代码设置如下图所示它似乎为我工作:

Private Sub Worksheet_Calculate() 
    Dim oWS As Worksheet: Set oWS = ThisWorkbook.Worksheets("Sheet8") 
    Dim aRange As Range: Set aRange = oWS.Range("F6:F10") 
    If ActiveSheet.Name = oWS.Name Then 
     If Not Application.Intersect(ActiveCell, aRange) Is Nothing Then 
      MsgBox "In range" 
     End If 
    End If 
End Sub 
+0

ActiveCell是属于worksheet_calculate的一部分的受保护变量吗?还是我必须申报? – Chris

+0

对不起,这最终以对象错误1006,因为我在另一个工作表上的单元格中创建一个值,以及有时如果不存在,创建工作表,并假设当它创建工作表和/或创建工作表中的值单元格移动活动单元格并导致此问题。 – Chris