Không cập nhật màn hình, tắt chế độ tự động tính toán sẽ cho tốc độ tốt hơn
Trong VBA, việc đình chỉ cập nhật màn hình sẽ cho tốc độ rất nhanh. Khi chúng ta xử lý dữ liệu trên excel, chúng ta thấy màn hình cứ giật giật.
Việc thiết định hủy cập nhật màn hình sẽ tăng tốc xử lý của excel.
Tuy nhiên nó cũng có nhược điểm, người dùng không nhìn thấy tiến trình xử lý của VBA (vì màn hình đứng yên) thì có vẻ sẽ sốt ruột.
Do đó chúng ta cân nhắc, nếu việc thực thi quá mất thời gian, thì vẫn nên dừng cập nhật màn hình để tăng tốc xử lý.
Ngoài ra chúng ta còn có kìm chế sự kiện.
Khi macro xử lý dữ liệu, thay đổi giá trị trên cells, thì worksheet sẽ phải phát hiện sự kiện đó và xử lý. Việc kiềm chế sự kiện tức là không cho worksheet bắt sự kiện, sẽ làm cho macro thực thi nhanh hơn. Tuy nhiên cũng có vấn đề là, trong khi macro thực hiện xử lý dữ liệu thì các sự kiện nếu phát sinh sẽ không được xử lý. Nhưng thông thường, khi xử lý dữ liệu, chúng ta không mấy quan tâm tới việc này. Đây chỉ là điều chú ý nho nhỏ cho các bạn biết mà thôi.
Tiếp theo chúng ta nói tới việc tự động tính toán. Chẳng hạn như trên bảng tính có chứa các công thức chẳng hạn. Nhưng chú ý rằng, dù bảng tính không có chứa công thức, thì tính năng tự động tính toán vẫn hoạt động dò tìm xem có công thức nào hay không. Do đó, để tăng tốc độ xử lý của macro, chúng ta cũng nên tắt nó đi.
Như vậy để tăng tốc độ xử lý của macro, ta sẽ xây dựng một hàm, gọi là Focus (nghĩa là tập trung), ý nghĩa là để cho macro tập trung làm công việc của mình mà không bị gây phiền hà bởi những sự kiện không cần thiết.
Sau đây chúng ta sẽ cùng nhau kiểm chứng:
Chú ý là copy cả code của thủ tục Focus vào Module của các bạn nữa nhé.
Bây giờ tôi sẽ thực thi thủ tục tangtocdo với các tình huống như sau:
Trong đó ○ nghĩa là tôi giữ nguyên nó trong thủ tục Focus. X nghĩa là tôi bỏ nó ra khỏi thủ tục Focus.
Các bạn thấy sự khác biệt về thời gian hoàn thành chưa?
Kết quả của code trên:
Nguồn:
Trong VBA, việc đình chỉ cập nhật màn hình sẽ cho tốc độ rất nhanh. Khi chúng ta xử lý dữ liệu trên excel, chúng ta thấy màn hình cứ giật giật.
Việc thiết định hủy cập nhật màn hình sẽ tăng tốc xử lý của excel.
Mã:
Application.ScreenUpdating = False
'đoạn code xử lý dữ liệu
Application.ScreenUpdating = True
Do đó chúng ta cân nhắc, nếu việc thực thi quá mất thời gian, thì vẫn nên dừng cập nhật màn hình để tăng tốc xử lý.
Ngoài ra chúng ta còn có kìm chế sự kiện.
Khi macro xử lý dữ liệu, thay đổi giá trị trên cells, thì worksheet sẽ phải phát hiện sự kiện đó và xử lý. Việc kiềm chế sự kiện tức là không cho worksheet bắt sự kiện, sẽ làm cho macro thực thi nhanh hơn. Tuy nhiên cũng có vấn đề là, trong khi macro thực hiện xử lý dữ liệu thì các sự kiện nếu phát sinh sẽ không được xử lý. Nhưng thông thường, khi xử lý dữ liệu, chúng ta không mấy quan tâm tới việc này. Đây chỉ là điều chú ý nho nhỏ cho các bạn biết mà thôi.
Mã:
Application.EnableEvents = False
'đoạn code xử lý dữ liệu
Application.EnableEvents = True
Mã:
Application.Calculation = xlCalculationManual
'đoạn code xử lý dữ liệu
Application.Calculation = xlCalculationAutomatic
Mã:
Sub Focus(ByVal Flag As Boolean)
With Application
.EnableEvents = Not Flag
.ScreenUpdating = Not Flag
.Calculation = IIf(Flag, xlCalculationManual, xlCalculationAutomatic)
End With
End Sub
Mã:
Sub tangtocdo()
Call Focus(True)
t = Timer()
For i = 1 To 255
For j = 1 To 255
With Sheet1.Cells(i, j)
.Value = i * j
.Interior.Color = RGB(i, j, Int(i + j / 2))
End With
Next j, i
Debug.Print Timer() - t
Call Focus(False)
End Sub
Bây giờ tôi sẽ thực thi thủ tục tangtocdo với các tình huống như sau:
EnableEvents | ○ | X | ○ | ○ |
ScreenUpdating | ○ | ○ | X | ○ |
Calculation | ○ | ○ | ○ | X |
Time | 7.3125 | 8.875 | 44 | 8.882 |
Các bạn thấy sự khác biệt về thời gian hoàn thành chưa?
Kết quả của code trên:
Bạn cần đăng nhập để thấy hình ảnh
Nguồn:
Bạn cần đăng nhập để thấy link