@ Alex, bạn có thể trì hoãn việc tính toán như câu trả lời @Gary. Tuy nhiên, bạn đã đặt câu hỏi bởi vì bạn cần "TỐC ĐỘ tới CYCLE qua các ô" trong khi gán công thức, phải không?
Nếu có, từ quan điểm của tôi, nếu bạn là KHÔNG sử dụng các công thức cho đến khi ALL các công thức được giao trong bảng excel, bạn sẽ đạt được rất nhiều tốc độ bằng cách viết tất cả các công thức tại một khi sử dụng một mảng (một bước trong VBA).
Quy trình là: trước tiên đặt tất cả các công thức vào một chuỗi VBA của chuỗi và sau đó sử dụng ví dụ Range("B1:B100").Formula = ArrayWithFormulas
. Trong ví dụ đó, bạn đang gán 100 công thức cùng một lúc, không tính toán lại ở giữa.
Bạn sẽ thấy một cải tiến lớn trong SPEED nếu sử dụng một mảng để viết tất cả các ô ở những ô thay vì viết ô bằng ô! (Đừng lặp lại bằng cách sử dụng cells(r,c+i)
nếu bạn có nhiều ô để đi qua). Dưới đây là một ví dụ:
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
Nếu bạn muốn thêm chậm trễ vào công thức mới, bạn có thể sử dụng thủ thuật @Gary nhưng áp dụng cho một phạm vi chứ không phải vào một ô đơn lẻ.Cho rằng bắt đầu các công thức với một '
như '=1+2
và thêm đoạn mã sau vào cuối file:
'... 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
ngoái, một Snipped nhỏ: nếu công thức của bạn đang ở trong một sự sắp xếp ngang (có nghĩa là một công thức cho cột A, khác cột B, vv) và chỉ một số ít các cột, sau đó bạn có thể giữ trong tâm trí một phiên bản ngắn hơn của mã theo thời gian:
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.
Cuối cùng, bạn có thể sử dụng phương pháp .FormulaR1C1
thay vì .Formula
trong tất cả các mã trước ví dụ, nếu bạn muốn một cách dễ dàng để sử dụng các tham chiếu tương đối trong công thức của bạn ...
Hy vọng điều này sẽ hữu ích!
chỉ là một ý tưởng để thử: bạn có thể giữ công thức trong một số ô ẩn - và trong macro của bạn chỉ PasteSpecial công thức? Với một chút may mắn hoạt động tương tự như tính năng tự động điền và chỉ tính toán ở cuối ... –