我对Macro有一个相当简单的问题。在其中,我将一个公式分配给一个单元格。我想首先不计算它,只有在宏的其他部分完成后才进行计算。我以为我会做这样的事情:
Application.Calculation = xlCalculationManual
Cells(StartRow, 4 + i).Formula = "FORMULA"
...
Application.Calculation = xlCalculationAutomatic
但这不起作用。它会停止自动计算,但不会停止该单元格 - 它在分配公式后仍然执行计算。有没有办法跳过它?
澄清这个的确切原因:在我的实际代码中,我将一个公式分配给一个循环中的一组单元格。每次我将它分配给一个单元格 - 它会计算它。我想我是否会首先分配它们然后进行计算 - 它会更快。事实上是。因此,我不是在循环中分配它,而是将其分配给第一个单元格,然后进行自动填充。自动填充公式等到我启用自动计算后,我得到一个更快的宏。然而,仍然计算出初始的贡献,这使得宏几乎慢了两倍。
答案 0 :(得分:7)
例如:
Sub dural()
With Range("A1")
.Value = "'=1+2"
MsgBox " "
.Value = .Value
End With
End Sub
答案 1 :(得分:3)
@Alex,您可以将计算延迟为@Gary答案。但是,你问这个问题是因为你需要“SPEED to CYCLE through cells”,同时分配一个公式,对吗?
如果是,从我的角度来看,如果你 NOT 使用公式,直到 ALL 公式在excel表中分配,你将获得大量的速度。
过程是:首先将所有公式放入VBA字符串数组中,然后再使用例如Range("B1:B100").Formula = ArrayWithFormulas
。在该示例中,您将同时分配100个公式,而不会在其间重新计算。
如果使用数组将所有单元格写入1而不是逐个单元格写入,您将看到SPEED的大幅提升! (如果要经过很多单元格,请不要使用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技巧,但是应用于范围,而不是单个单元格。为此启动公式'
,如'=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列的其他公式等)和只有少量列,那么你可以记住一个较短的版本之前的代码:
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
...
希望这有帮助!