2010-05-27 21 views
6

điểm là những gì làm sau đây:bao nhiêu thiết lập các thuộc tính tăng tốc độ Excel của bạn vĩ mô: Application.ScreenUpdating, Application.DisplayAlerts

Application.ScreenUpdating = False 
Application.DisplayAlerts = False 

nó thực sự tiết kiệm nhiều thời gian?

+3

DisplayAlerts không liên quan đến nhanh như thế nào chương trình chạy, nó sẽ chỉ ngăn chặn Excel cảnh báo mặc định (ví dụ khiến để xác nhận xóa bảng), mà bạn có thể hoặc không muốn ngăn chặn. (Tôi đoán về mặt kỹ thuật nó sẽ làm cho nó chạy nhanh hơn vì sẽ không có hộp thoại, nhưng bạn biết những gì tôi có ý nghĩa). – goggin13

Trả lời

5

Đồng ý.

Tôi thấy rằng khi bạn tắt ScreenUpdating, Calculation, tốt nhất là nên suy nghĩ về cách thực hiện càng nhiều công việc (viết, đọc, sự kiện, ...) càng ít càng tốt cho số điện thoại ScreenUpdating. Điều này sẽ tăng tốc độ hoạt động đồng thời cung cấp cho người dùng trải nghiệm tốt hơn và dễ chịu hơn. Ví dụ: giả sử bạn muốn ghi một số dữ liệu vào trang tính càng nhanh càng tốt.Bạn có thể làm điều này:

For Each row In rowDic.Keys() 
    ' turn off updating 
    for item in rowDic.Key(row) 
     ... do some writes 
    Next    
    ' turn on updating 
Next 

hoặc để đi nhanh hơn bạn có thể làm điều này:

' turn off updating 
For Each row In rowDic.Keys() 
    for item in rowDic.Key(row) 
     ... do some writes 
    Next    
Next 
' turn on updating 

Tương tự như vậy, khi ghi dữ liệu, đó là nhanh nhất để viết khối lớn hơn, thời gian ít hơn. do đó, số lượng viết lý tưởng, nếu có, là một. Bạn có thể thực hiện việc này bằng cách xử lý Range dưới dạng 2D array[rows,cols]. Tôi đã tìm thấy những điều sau đây để có hiệu quả:

' turn off updates 

' Organise data in ram so that it fits the range for which it is meant 
Dim two_d_arr (rows,cols) 
loadDataFromSource two_d_arr 

Dim destinationRange as Range 
destinationRange = Sheets(someSheet).Range(someRange).Value = two_d_arr 

Redim two_d_arr(0,0) ' !!! RELEASE MEMORY 
' turn on updates 

Ở đây, không có vòng, điều này sẽ tối ưu hóa thời gian mỗi công việc của cá nhân trong CPU mà kết quả trong thời gian xử lý nhanh hơn và lần lượt dường như làm cho excel làm việc bình thường (không sụp đổ).

HTH,

F

4

Tuyệt đối. Tôi đã có một vĩ mô dài chạy vài năm trước, mất gần một phút để chạy. Tôi đặt ScreenUpdating thành false và kết thúc sau chưa đầy 5 giây.

Chỉ cần đảm bảo bạn đặt lại ScreenUpdating thành true khi bạn đã chạy macro xong.

+5

Cũng đừng quên thiết lập ScreenUpdating trở lại như là bước đầu tiên trong bất kỳ mã lỗi handeling bạn có –

13

Tùy thuộc vào số lượng bạn đang cập nhật trên màn hình như một phần mã của bạn, (số lượng ô được cập nhật) và số lượng trang tính, số lượng trang/ô tham chiếu đến trang tính đang cập nhật và có bao nhiêu công thức có trong toàn bộ bảng tính.

Mỗi khi bạn thay đổi một số thứ trong trang tính, Excel tính lại tất cả các công thức. Vì vậy, nếu mã của bạn không cập nhật quá nhiều trang tính/ô nhưng sổ làm việc của bạn có nhiều công thức thì việc tắt cập nhật màn hình có thể không giúp bạn chút nào.

Một điều nữa cần xem xét về tính hiệu quả là tính toán Tính toán, đặt thành xlCalculationManual để tắt tính năng tự động trả lại và biến nó trở lại xlCalculationAutomatic ở cuối.

Application.Calculation = xlCalculationManual 

Một điều nữa để conside là sự kiện, nếu một hoặc nhiều hơn những tấm có Worksheet_Chnage hoặc Worksheet_Calculate xử lý sự kiện mỗi thay đổi mã của bạn đang làm sẽ kích hoạt chúng và mã của bạn cần phải chờ đợi cho đến khi họ trở về. Vì vậy, tắt nó đi trong mã của bạn.

Application.EnableEvents = False 

Trong hầu hết các mã của tôi, tôi susally sử dụng này

On Error GoTo lblError 
Dim bEvents As Boolean, iCalc As Integer, bScrnUpd As Boolean 
bEvents = Application.EnableEvents 
iCalc = Application.Calculation 
bScrnUpd = Application.ScreenUpdating 
Application.EnableEvents = False 
Application.Calculation = xlCalculationManual 
Application.ScreenUpdating = False 

'-----------------------My code 

Application.EnableEvents = bEvents 
Application.Calculation = iCalc 
Application.ScreenUpdating = bScrnUpd 
Exit Sub 

'reset them even if you are exiting due to error 
lblError: 
Application.EnableEvents = bEvents 
Application.Calculation = iCalc 
Application.ScreenUpdating = bScrnUpd 
Debug.print Err.Description 
+1

Câu trả lời hoàn hảo (đây phải là câu trả lời được chấp nhận). Ví dụ tuyệt vời về "trường học giải thích đầy đủ hơn": các ví dụ và bản mẫu cho thấy làm thế nào để giảm thiểu tác động của mã của người dùng đối với người dùng. –

5

Việc cải thiện screenUpdating phụ thuộc phần lớn vào cách macro của bạn được viết. Nó sẽ được đặc biệt hữu ích với những macro khủng khiếp được thực hiện bởi máy ghi âm, đầy đủ không cần thiết "chọn" và "kích hoạt".

3

tôi sẽ không sử dụng những cho 'tốc độ' nhưng đối với 'chức năng'

Khi bạn không muốn người dùng xem các cập nhật màn hình:

Application.ScreenUpdating = False 

Khi bạn không muốn người dùng xem mọi tin nhắn thừa từ ứng dụng:

Application.DisplayAlerts = False 

Đặc biệt sau này vì không ai muốn bị bludgeoned đến chết với những thông điệp yêu cầu nếu bạn 'thực sự' muốn cập nhật, thêm hoặc xóa r ecords. Tôi thích bảo vệ người dùng khỏi những thứ như vậy.

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