Topic này tớ lập ra để cùng nhau trao đổi về những cách sử dụng phối hợp các công thức của Excel và VBA sao cho CSDL đơn giản và tối ưu tốc độ.
Mấy ngày nay tôi tập coding các hàm để thay thế các Formula Array đang dùng như sau:
Các Formula Array và Defined Function:
{=SUM(IF(MaVL=$H2;IF(maKH=$G$1;IF(Ngay>=$G$2;IF(Ngay<=$G$3;SoL;0);0);0);0))}
Function Tonghop(xMaVL As Range, xMaKH As Range, xNgay As Range, xSo As Range, maVL As String, maKH As String, Ngay1 As Date, Ngay2 As Date)
Dim i As Long
Tonghop = 0
For i = 1 To xMaVL.Rows.Count
If xMaVL(i) = "" Then Exit Function
If (xMaVL(i) = maVL) And (xMaKH(i) = maKH) And (xNgay(i) >= Ngay1) And (xNgay(i) <= Ngay2) _
Then Tonghop = Tonghop + xSo(i)
Next i
End Function
Nếu các Name MaSL, MaKH mở đến 3000 dòng ... trong khi CSDL của tớ có dưới 300 dòng (records), hàm Tonghop chạy nhanh hơn Formula Array. (Nhờ thủ tục Exit Function nên vòng lặp kết thúc khi đến dòng cuối cùng không có dữ liệu). Nhưng nếu dữ liệu lên đến 2000 records thì hàm Tonghop chạy chậm như rùa (máy P4 1.5Gb, RAM 128MB)
Như vậy, theo tớ đánh giá:
- Formula Array chạy nhanh hơn dùng Defined Function trên vòng lặp for đến 10 lần (với cấu hình máy như trên, cùng số dòng).
- Nếu các Name apply sẳn với nhiều dòng trống, Formula Arry sẽ chạy chậm, do đó nên có 1 macro tự động apply các Name trên một vùng có dữ liệu, tránh mở xuống dưới quá nhiều dòng trống không cần thiết.
- Có giải thuật nào tăng tốc cho vòng lặp for trên không? So sánh For với Select? Lệnh Exit For là lệnh kết thúc cả vòng lặp, nhưng nếu muốn bỏ qua vòng hiện tại, và tiếp tục những lần tiếp theo thì dùng lệnh gì?
Mấy ngày nay tôi tập coding các hàm để thay thế các Formula Array đang dùng như sau:
Các Formula Array và Defined Function:
{=SUM(IF(MaVL=$H2;IF(maKH=$G$1;IF(Ngay>=$G$2;IF(Ngay<=$G$3;SoL;0);0);0);0))}
Function Tonghop(xMaVL As Range, xMaKH As Range, xNgay As Range, xSo As Range, maVL As String, maKH As String, Ngay1 As Date, Ngay2 As Date)
Dim i As Long
Tonghop = 0
For i = 1 To xMaVL.Rows.Count
If xMaVL(i) = "" Then Exit Function
If (xMaVL(i) = maVL) And (xMaKH(i) = maKH) And (xNgay(i) >= Ngay1) And (xNgay(i) <= Ngay2) _
Then Tonghop = Tonghop + xSo(i)
Next i
End Function
Nếu các Name MaSL, MaKH mở đến 3000 dòng ... trong khi CSDL của tớ có dưới 300 dòng (records), hàm Tonghop chạy nhanh hơn Formula Array. (Nhờ thủ tục Exit Function nên vòng lặp kết thúc khi đến dòng cuối cùng không có dữ liệu). Nhưng nếu dữ liệu lên đến 2000 records thì hàm Tonghop chạy chậm như rùa (máy P4 1.5Gb, RAM 128MB)
Như vậy, theo tớ đánh giá:
- Formula Array chạy nhanh hơn dùng Defined Function trên vòng lặp for đến 10 lần (với cấu hình máy như trên, cùng số dòng).
- Nếu các Name apply sẳn với nhiều dòng trống, Formula Arry sẽ chạy chậm, do đó nên có 1 macro tự động apply các Name trên một vùng có dữ liệu, tránh mở xuống dưới quá nhiều dòng trống không cần thiết.
- Có giải thuật nào tăng tốc cho vòng lặp for trên không? So sánh For với Select? Lệnh Exit For là lệnh kết thúc cả vòng lặp, nhưng nếu muốn bỏ qua vòng hiện tại, và tiếp tục những lần tiếp theo thì dùng lệnh gì?