@ Alex, Sie kann die Berechnung als @Gary-Antwort verzögern. Sie stellten jedoch die Frage, weil Sie "SPEED to CYCLE durch Zellen" benötigen, während Sie eine Formel zuweisen, richtig?
Wenn ja, aus meiner Sicht, wenn Sie NICHT mit den Formeln bis ALL die Formeln in der Excel-Tabelle zugeordnet sind, werden Sie eine viel Geschwindigkeit gewinnen, indem sie alle Formeln schriftlich einmal mit einem Array (ein einzelner Schritt in VBA).
Die Prozedur ist: zuerst legen Sie alle Formeln zu einem VBA-Array von Zeichenfolgen und später zum Beispiel Range("B1:B100").Formula = ArrayWithFormulas
verwenden. In diesem Beispiel ordnen Sie 100 Formeln gleichzeitig zu, ohne dass Sie dazwischen neu berechnen müssen.
Sie werden eine große Verbesserung in SPEED sehen, wenn Sie ein Array verwenden, um alle Zellen auf einen zu schreiben, anstatt Zelle für Zelle zu schreiben! (Schleife nicht mit cells(r,c+i)
, wenn Sie viele Zellen durchlaufen haben). Hier ein Beispiel:
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
Wenn Sie eine zusätzliche Verzögerung in der neuen Formel möchten, dann können Sie @Gary Trick verwenden, aber auf einen Bereich angewendet wird, nicht auf eine einzelne Zelle.Dazu die Formeln mit einem '
wie '=1+2
starten und den folgenden Code am Ende hinzufügen:
'... 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
Last, einem kleinen snipped: wenn Ihre Formeln sind in einer horizontalen Anordnung (Mittel eine Formel für die Spalte A, andere für Spalte B, usw.) und nur eine kleine Anzahl von Spalten, dann können Sie behalten die eine kürzere Version des vorherigen Code in dem Sinne:
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.
Schließlich können Sie die Methode verwenden .FormulaR1C1
statt .Formula
in allen vorherigen Code Beispiele, wenn Sie eine einfache Möglichkeit haben, relative Referenzen in Ihrer Formel zu verwenden ...
Hoffe, das hilft!
nur ein Gedanke zu versuchen: können Sie die Formel in einer versteckten Zelle behalten - und in Ihrem Makro nur PasteSpecial die Formel? Mit ein bisschen Glück funktioniert das ähnlich wie beim Autofill und berechnet erst am Ende ... –