- 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
Code 2
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:
Code chạy nhanh
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.
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.
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
a = (low + high) / 2
Cách 2
a = (low + high) \ 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: