2013-08-24 52 views
5

Tôi gặp sự cố khá đơn giản với Macro. Trong đó, tôi gán một công thức cho một ô. Tôi muốn nó không tính toán nó lúc đầu và làm tính toán chỉ sau khi một số phần khác của Macro được hoàn thành. Tôi nghĩ tôi sẽ làm một việc như sau:Excel & VBA: Bỏ qua công thức tính toán trong Macro

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

Nhưng điều đó không hiệu quả. Nó dừng tính toán tự động, nhưng không phải cho ô đó - nó vẫn thực hiện phép tính ngay sau khi tôi gán công thức. Có cách nào để bỏ qua nó không?

Để làm rõ chính xác prupose này: trong mã thực tế của tôi, tôi chỉ định một công thức cho một nhóm các ô trong một chu kỳ. Mỗi lần tôi gán nó vào một ô - nó tính toán nó. Tôi đã tìm ra nếu trước tiên tôi sẽ chỉ định tất cả và sau đó thực hiện phép tính - nó sẽ nhanh hơn. Thực tế là . Vì vậy, thay vì chỉ định nó trong một chu kỳ, tôi gán nó cho ô đầu tiên và sau đó tự động điền. Công thức tự động điền cho đến khi tôi bật tính toán tự động và tôi nhận được macro nhanh hơn nhiều. Tuy nhiên, assignemnt ban đầu vẫn được tính toán làm cho macro gần như gấp đôi.

+0

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 ... –

Trả lời

7
  1. nơi công thức trong tế bào với một nhân vật tiền tố
  2. tiếp tục vĩ mô
  3. "kích hoạt" công thức

ví dụ:

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

Bí quyết tuyệt vời. Tôi hàng ngày học một cái gì đó mới ở đây :) – Vikas

+0

Điều này là thông minh. – enderland

+0

Điều này thật xuất sắc :) – pokrishka

2

@ 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!

+0

Âm thanh thú vị. Cảm ơn! Cho đến nay tôi đã sử dụng đề xuất của Gary khá thành công. Tôi thêm công thức với dấu nháy đơn trong một chu kỳ cho toàn bộ phạm vi và sau đó chạy tất cả chúng với Phạm vi (bất cứ điều gì) .Value = Phạm vi (bất cứ điều gì) .Value – pokrishka

+0

Tốt! Nếu bạn thấy bạn cần phải cải thiện tốc độ, bạn có thể sử dụng ;-) này. Thêm lời khuyên về tốc độ, ở đây: [(1) Excel VBA: Hiệu quả và hiệu suất] (http://www.avdf.com/apr98/art_ot003.html) - [(2) Mã hóa nhanh] (http: // blog .msdn.com/excel/archive/2009/03/12/excel-vba-hiệu năng-mã hóa-best-practices.aspx) - [(3) Thông tin của Microsoft về việc chuyển mảng sang VB] (http: // support. microsoft.com/kb/153090/en-us) –

Các vấn đề liên quan