Tăng tốc độ code VBA

  • Thread starter Thread starter kyo
  • Ngày gửi Ngày gửi
Liên hệ QC

kyo

Nguyễn Khắc Duy
Thành viên danh dự
Tham gia
4/6/06
Bài viết
901
Được thích
2,716
Nhân dịp tham khảo tài liệu trong sách Professional Excel Development cũng như các chủ đề có trong các topic dưới đây, kyo giới thiệu thêm một vài cách nữa giúp tối ưu hóa code VBA của các bạn.
http://www.giaiphapexcel.com/forum/showthread.php?21361-Tăng-tốc-cho-code-VBA-của-bạn
http://www.giaiphapexcel.com/forum/showthread.php?15663-Thủ-thuật-nhằm-tăng-tốc-chương-trình

1. Không sử dụng Option Compare Text.

Code 1

PHP:
Option Compare Text
Sub thunghiem()
         If “GPE” = “gpe” then msgbox “True”
End Sub

Code 2

PHP:
Sub thunghiem()
         If Ucase(“GPE”) = Ucase(“gpe”) then msgbox “True”
End Sub

Thêm dòng Option Compare Text vào đầu module sẽ khiến cho VBA không thể phân biệt được giữa chữ thường và chữ hoa (“GPE” = “gpe”). Tuy nhiên, trong đa số trường hợp, cách làm này chỉ làm lãng phí thời gian không cần thiết. Thay vì vậy, bạn nên sử dụng Option Compare Binary (hoặc đơn giản là không làm gì cả vì đây là mặc định) và rồi sau đó sử dụng StrComp, InStr, Ucase,… và rất nhiều các hàm khác để phục vụ mục đích của bạn.

2. Sử dụng phép tính dưới dạng Integer bất cứ khi nào có thể.

Cách 1

Cách 2

Ở cách thứ hai, chắc chắn phép tính sẽ được thực hiện nhanh hơn.

3. Trong đa số trường hợp, duyệt mảng sẽ nhanh hơn rất nhiều so với duyệt từng giá trị bằng vòng lặp.

4. Nếu có thể, hãy sử dụng Dictionary thay vì Collection

5. Không sử dụng If gpe=True Then, chỉ cần sử dụng If gpe Then

Nếu biến của bạn là kiểu dữ liệu Boolean, bạn không cần phải so sánh nó với True vì như thế chỉ làm lãng phí thêm tài nguyên.

6. Không sử dụng IIf()

IIf() là một hàm rất hay và tiện lợi khi chọn lựa giữa 2 lựa chọn. Tuy nhiên, nó thật sự còn chậm hơn cả việc bạn sử dụng If…Else…End If do nó phải cân nhắc cả hai lựa chọn là True hay False.

7. Sử dụng If…ElseIf…Else…End If thay vì Select Case

Tuy rằng Select Case rất tiện lợi và lại dễ nhìn nhưng nó lại chậm hơn so với việc sử dụng cấu trúc If…ElseIf…Else…End If.

8. Sử dụng hàm PAGE.SETUP XML thay vì đối tượng PageSetup

Code chạy chậm:

PHP:
With Sheet1.PageSetup
.LeftHeader = “Hello”
.RightHeader = “World”
End With

Code chạy nhanh

PHP:
Sheet1.Activate
ExecuteExcel4Macro “PAGE.SETUP(““&LHello &RWorld””)”

9. Hãy kiểm tra các thuộc tính trước khi sử dụng.

Chẳng hạn, bạn có Range.Font.Bold=True thì việc bạn lại thiết lập cho nó bằng True nữa là không cần thiết và sẽ khiến cho chương trình của bạn chậm lại. Do đó, luôn kiểm tra và bảo đảm rằng chỉ thay đổi các thuộc tính khi cần thiết.

10. Sử dụng Exit bất cứ khi nào có thể nhằm giảm lượng tính toán cho máy.

11. Sử dụng Option Explicit.

Khi bạn sử dụng Option Explicit, bạn sẽ phải khai báo toàn bộ biến và như vậy sẽ giảm thiểu số lượng biến phát sinh không rõ nguyên nhân khiến cho chương trình của bạn chạy chậm và còn nặng hơn.

12. Đừng sử dụng Timer.

Dùng Timer vừa chậm nhưng độ chính xác lại kém hơn so với các hàm API. Bạn có thể tham khảo chi tiết tại đây: http://www.giaiphapexcel.com/forum/showthread.php?4916-Cách-đo-tốc-độ-thực-hiện-của-một-thủ-tục-hoặc-hàm

13. Trong trường hợp so sánh ANSI, sử dụng Asc(“x”)=y thay vì Chr$(y)=”x”.

14. Khi sử dụng Select Case, hãy đưa phương án có nhiều khả năng đúng nhất lên hàng đầu.

PHP:
Select Case gpe
        Case 1
           ...
        Case 2
           ...
        Case 3
           ...
        .................
        Case 20
           ...
End Select

VBA không thông minh như bạn tưởng đâu, nó sẽ duyệt qua từng trường hợp một. Giả sử với chương trình ở bên trên, nếu đáp án đúng của bạn là Case 20, chắc chắn chương trình của bạn sẽ chậm đi nhiều do VBA sẽ phải duyệt qua từ Case 1, 2, 3 ... đến 20.

15. Tránh phải sử dụng kiểu dữ liệu số thực.

Chỉ sử dụng khi thật cần thiết. Bên cạnh đó, kiểu dữ liệu Currency sẽ chạy nhanh hơn Single dù cho nó có nặng hơn.
 
Lần chỉnh sửa cuối:
Làm cha mẹ, không ai là không muốn đứa con tinh thần của mình được sạch sẽ & tươm tất

(/ậy mình xin đề nghị bạn vấn đề sau:

/-(ãy viết bài tổng quan về các lỗi hay gặp trong VBA & cách khắc fục.

Còn vấn đề tăng tốc thì mình thấy nó rất hữu dụng;

/(/hưng (lại nhưng!) với những thói hư do không được tiếp thu 1 cách bài bản, trường lớp mà khi viết code, nhiều người trong chúng ta (& tôi không ngoại lệ) thường ậm ừ cho qua.

Cũng biết là đáng hư & đáng đánh lắm; Nhưng sửa ngay cũng không fải dễ!

Một lần nữa xin rất cảm ơn tác giả & còn cảm ơn nhiều lần hơn, nếu đề xuất của mình thành hiện thực!
 
Upvote 0
(/ậy mình xin đề nghị bạn vấn đề sau:

/-(ãy viết bài tổng quan về các lỗi hay gặp trong VBA & cách khắc fục.

Còn vấn đề tăng tốc thì mình thấy nó rất hữu dụng;

/(/hưng (lại nhưng!) với những thói hư do không được tiếp thu 1 cách bài bản, trường lớp mà khi viết code, nhiều người trong chúng ta (& tôi không ngoại lệ) thường ậm ừ cho qua.

Cũng biết là đáng hư & đáng đánh lắm; Nhưng sửa ngay cũng không fải dễ!

Một lần nữa xin rất cảm ơn tác giả & còn cảm ơn nhiều lần hơn, nếu đề xuất của mình thành hiện thực!

Đó là một chủ đề rất hay và kyo xin ghi nhận ý kiến và sẽ cố gắng viết chủ đề đó trong thời gian sớm nhất.
Bên cạnh việc dựa trên những tài liệu trên diễn đàn và trên Internet, kyo mong rằng mọi người có thể đóng góp những kinh nghiệm tối ưu tốc độ code của mình vào trong topic này như một kinh nghiệm nhằm giúp cho những người đi sau có thể tránh vấp phải được không?

Chẳng hạn như gần đây kyo được học thêm của chú Tuấn ndu là

Thay vì sử dụng

PHP:
If a = 1 and b = 2 Then ..............

Nên sử dụng
PHP:
If a = 1 Then
    If b = 2 Then .................
End If


Khi sử dụng thế này, trong trường hợp không thỏa điều kiện, chương trình sẽ chỉ xét 1 điều kiện và do đó sẽ chạy nhanh hơn là xét cả 2 điều kiện một lúc.
 
Upvote 0
Khi sử dụng thế này, trong trường hợp không thỏa điều kiện, chương trình sẽ chỉ xét 1 điều kiện và do đó sẽ chạy nhanh hơn là xét cả 2 điều kiện một lúc.
Mình nghĩ chỉ nên dùng cách này khi hàm kiểm tra phải lặp đi lặp lại hoặc quá phức tạp. Nếu việc kiểm tra chỉ thực hiện duy nhất 1 lần ngoài vòng lặp thì không cần thiết, tránh rối code
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom