Excel和VBA:在macros中跳过计算公式

我在Macro有一个相当简单的问题。 在这里,我给一个单元格分配一个公式。 我想先不计算它,只有在macros的其他部分完成后才进行计算。 我以为我会做这样的事情:

Application.Calculation = xlCalculationManual Cells(StartRow, 4 + i).Formula = "FORMULA" ... Application.Calculation = xlCalculationAutomatic 

但是这不起作用。 它会停止自动计算,但不会为该单元格执行计算 – 在分配公式之后,它仍会执行计算。 有没有办法跳过它?

为了澄清这个的确切原理:在我的实际代码中,我将一个公式分配给一个循环中的一组单元格。 每次我把它分配给一个单元格 – 它计算它。 我想,如果我先把它们全部分配,然后再做计算,速度会更快。 事实上是这样的 。 因此,不要在一个循环中分配它,而是将其分配给第一个单元格,然后进行自动填充。 自动填充的公式等待,直到我启用自动计算,我得到一个更快的macros。 然而,最初的分配方式仍然是计算出来的,这使得macros几乎减慢了一倍。

  1. 将公式放在单元格中,并使用前缀字符
  2. 继续macros观
  3. “激活”公式

例如:

 Sub dural() With Range("A1") .Value = "'=1+2" MsgBox " " .Value = .Value End With End Sub 

@Alex,你可以延迟计算@Gary的答案。 但是,您提出的问题是因为您需要“通过单元格进行循环加速”,同时指定一个公式,对不对?

如果是的话,从我的angular度来看,如果你没有使用公式,直到所有的公式都分配在Excel表中,你将获得很多的速度,通过使用一个数组一次性写所有的公式(在VBA )。

这个过程是:首先把所有的公式放到一个VBA的string数组中,然后再使用Range("B1:B100").Formula = ArrayWithFormulas 。 在这个例子中,你一次分配100个公式,而不需要重新计算。

如果使用一个数组来写所有的单元格,而不是逐个单元格地写入,你将会看到SPEED的一个大的改进! (不要使用cells(r,c+i)循环cells(r,c+i)如果有很多单元格需要通过的话)。 这里有一个例子:

 Sub CreateBunchOfFormulas() Dim i As Long Dim ARRAY_OF_FORMULAS() As Variant 'Note: Don't replace Variant by String! ReDim ARRAY_OF_FORMULAS(1 To 100, 1 To 1) ' For Vertical use: (1 to NumRows,1 to 1) ' for Horizontal: (1 to 1,1 to NumCols) ' for 2D use: (1 to NumRows,1 to NumCols) 'Create the formulas... For i = 1 To 100 ARRAY_OF_FORMULAS(i, 1) = "=1+3+" & i ' Or any other formula... Next i ' <-- your extra code here... ' (New formulas won't be calculated. They are not in the Excel sheet yet! ' If you want that no other old formula to recalculate use the old trick: ' Application.Calculation = xlCalculationManual ) 'At the very end, write the formulas in the excel at once... Range("B1:B100").Formula = ARRAY_OF_FORMULAS End Sub 

如果你想在新的公式中额外的延迟,那么你可以使用@Gary技巧,但应用于一个范围,而不是单个单元格。 为了开始' like '=1+2的公式并在结尾添加下面的代码:

  '... previous code, but now formulas starting with (') Range("B1:B100").Formula = ARRAY_OF_FORMULAS 'Formulas not calculated yet, until next line is executed Range("B1:B100").Value = Range("B1:B100").Value ' <~~ @Gary's trick End Sub 

最后,一个小的剪切:如果你的公式是在一个水平的安排(意味着一个公式的列A,其他列B等),只有less量的列,那么你可以记住一个较短的版本以前的代码:

 Dim a as Variant 'Note that no () needed a = Array("=1+3","=4+8","=5*A1","=sum(A1:C1)") Range("A1:D1").Formula = ARRAY_OF_FORMULA ' Just a single row ' or... Range("A1:D100").Formula = ARRAY_OF_FORMULA ' If you want to repeat formulas ' in several rows. 

最后,您可以使用方法.FormulaR1C1而不是.Formula在所有以前的代码示例中,如果您想在您的公式中使用相对引用的简单方法…

希望这可以帮助!