Giúp code lọc nhanh Siêu tốc độ

Liên hệ QC

minhtuan55

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
23/3/16
Bài viết
705
Được thích
52
Mình muốn lọc theo điều kiện Từ ngày , đến ngày và theo nhân viên ( tất cả,ca1,c2)
Mình muốn lọc theo dạng Mảng để xữ lý cho nhanh. Ví dụ như Để tài ở đây
https://www.giaiphapexcel.com/forum/showthread.php?122365-Gi%C3%BAp-code-L%E1%BB%8Dc-t%C3%AAn-h%C3%A0ng-N%E1%BA%BFu-tr%C3%B9ng-C%E1%BB%99ng-d%E1%BB%93n-S%E1%BB%91-L%C6%B0%E1%BB%A3ng
Code cực kỳ nhanh của tác giả
hoamattroicoi'
Hiện tại mình đang dùng code AdvancedFilter Khi dữ liệu lớn code chạy rất Chậm.Xin chân thành cảm ơn !
 

File đính kèm

  • Giup code loc theo dieu kien.xls
    18 KB · Đọc: 132
Lần chỉnh sửa cuối:
ArrDataU đó mình để phuc vụ cho việc tìm kiếm mà không phân biệt chữ hoa chữ thường ấy.
cái này tôi viết lại dòng đỏ ở bải trên rui, vì nhầm

còn ý phía sau mình không hiểu

Ý tôi là không cần phải lọc riêng các cột dữ liệu theo ArrCotDuLieu trước, mà cứ chuyển ArrData0 gốc cùng ArrCotDuLieu vào code Filter - vì ta không cần phải lọc riêng trước vậy, vì sau cũng phải nhặt (filter) theo điều kiện chọn - khi đó chỉ nhặt các cột theo ArrCotDuLieu là được. ==> tiết kiệm thời gian của LOAD Data nhiều,

Việc loadData sẽ chạy 1 lần đầu tiên dùng nhiều lần - thì tùy bạn cân nhắc ý trên
 
Upvote 0
Ý tôi là không cần phải lọc riêng các cột dữ liệu theo ArrCotDuLieu trước, mà cứ chuyển ArrData0 gốc cùng ArrCotDuLieu vào code Filter - vì ta không cần phải lọc riêng trước vậy, vì sau cũng phải nhặt (filter) theo điều kiện chọn - khi đó chỉ nhặt các cột theo ArrCotDuLieu là được. ==> tiết kiệm thời gian của LOAD Data nhiều,
đã hiểu ý sau, vậy thì phải truyền thêm tham số ArrCotDuLieu vào code lọc dữ liệu lại, đẻ viết lại rồi test lại thế nào
cảm ơn bạn nhiều nhe ^^
 
Upvote 0
Nếu để nguyên code, bạn bỏ qua đo thời gian LOAD DATA
Mã:
Sub LocCach1()
Sheets("OUT").Range("B5").Value = ""
LoadData
DoThoiGianDIC 1
End Sub
Sub LocCach2()
Sheets("OUT").Range("B5").Value = "T" & ChrW(202) & "N G" & ChrW(7888) & "C"
LoadData
DoThoiGianDIC 2
End Sub

Chuyển (move) loaddata từ sub LOC lên trên 2 sub LocCach1, LocCach1 - để không đo thời gian LoadData ==> bạn sẽ thấy với LocCach1 thời gian giảm chỉ còn =40% thời gian cũ; bạn sẽ thấy với LocCach2 thời gian giảm chỉ còn =25% thời gian cũ
Điều này chứng tỏ LOAD Data chiếm quá nhiều thời gian: 60-75% của tổng thời gian

Nên nếu tính cả thời gian LoadData thì nhanh hay chậm là do LoadDATA quyết định phần nhiều .. . (sửa cái đuôi cáo này đi, hoặc là chấp nhận do loaddata nên chạy lần đầu chậm, sau sẽ nhanh không lo --> bài toán nhỏ kiểu này không quan trong thuật toán Filter nữa đã giải quyết, vì chưa châm được điếu thuốc thì code đã xong, lo chi lăn tăn chuyện thời gian)
------------------------
Sau đó tôi thử bỏ Dictionary trong clsFilter
sử dụng Array một chiều thì thời gian giảm thêm khoảng 15-20% (cách 1) và 5-10% (với cách 2) nữa so với khi dùng DIC

==================
vì trên đã viết
(sửa cái đuôi cáo này đi, hoặc là chấp nhận do loaddata nên chạy lần đầu chậm, sau sẽ nhanh không lo --> bài toán nhỏ kiểu này không quan trong thuật toán Filter nữa đã giải quyết, vì chưa châm được điếu thuốc thì code đã xong, lo chi lăn tăn chuyện thời gian)

Nên tôi sẽ dừng vấn đề ở đây, vì cải thiện thêm Thuật toán Filter cũng không có ích gì đáng kể
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu để nguyên code, bạn bỏ qua đo thời gian LOAD DATA
Mã:
Sub LocCach1()
Sheets("OUT").Range("B5").Value = ""
LoadData
DoThoiGianDIC 1
End Sub
Sub LocCach2()
Sheets("OUT").Range("B5").Value = "T" & ChrW(202) & "N G" & ChrW(7888) & "C"
LoadData
DoThoiGianDIC 2
End Sub

Chuyển (move) loaddata từ sub LOC lên trên 2 sub LocCach1, LocCach1 - để không đo thời gian LoadData ==> bạn sẽ thấy với LocCach1 thời gian giảm chỉ còn =40% thời gian cũ; bạn sẽ thấy với LocCach2 thời gian giảm chỉ còn =25% thời gian cũ
Điều này chứng tỏ LOAD Data chiếm quá nhiều thời gian: 60-75% của tổng thời gian

Nên nếu tính cả thời gian LoadData thì nhanh hay chậm là do LoadDATA quyết định phần nhiều .. . (sửa cái đuôi cáo này đi, hoặc là chấp nhận do loaddata nên chạy lần đầu chậm, sau sẽ nhanh không lo --> bài toán nhỏ kiểu này không quan trong thuật toán Filter nữa đã giải quyết, vì chưa châm được điếu thuốc thì code đã xong, lo chi lăn tăn chuyện thời gian)
------------------------
Sau đó tôi thử bỏ Dictionary trong clsFilter
sử dụng Array một chiều thì thời gian giảm thêm khoảng 15-20% (cách 1) và 5-10% (với cách 2) nữa so với khi dùng DIC

đã sửa lại bỏ hoàn toàn loadData, không dùng dic
mà sao nó cũng không nhanh hơn được bao nhiêu hết chênh lệch 1 - > 2s (lọc theo cột chỉ định- lọc tất cả các cột)
nó vẫn chậm bác à
link
 
Upvote 0
đã sửa lại bỏ hoàn toàn loadData, không dùng dic
mà sao nó cũng không nhanh hơn được bao nhiêu hết chênh lệch 1 - > 2s (lọc theo cột chỉ định- lọc tất cả các cột)
nó vẫn chậm bác à
link
Kết quả đúng chưa?
Nếu xác nhận đúng rui, thì tôi thử xem cải thiện được gì không?
 
Upvote 0
Kết quả đúng chưa?
Nếu xác nhận đúng rui, thì tôi thử xem cải thiện được gì không?
kết quả đúng rồi bác. lạ cái là lúc code lung tung nó chạy có 700 (0.7s) mà sau khi thêm chú thích bố trí thụt dòng cho đẹp thì nó lên tới 1000 (1s). chả hiểu sao
mà 1s đó là chỉ mới lọc theo 1 điều kiện là số 4, còn nếu là bê tông thì nó tìm "bê" rồi "tông", là x2 thời gian lận
 
Upvote 0
kết quả đúng rồi bác. lạ cái là lúc code lung tung nó chạy có 700 (0.7s) mà sau khi thêm chú thích bố trí thụt dòng cho đẹp thì nó lên tới 1000 (1s). chả hiểu sao
mà 1s đó là chỉ mới lọc theo 1 điều kiện là số 4, còn nếu là bê tông thì nó tìm "bê" rồi "tông", là x2 thời gian lận

bạn tìm kiểu này lâu là phải

bê tông 750L

sẽ thành tìm

*b*ê*
*t*ô*n*g*
*7*5*0*L*

xem lại cách ghép các dấu *
 
Upvote 0
kết quả đúng rồi bác. lạ cái là lúc code lung tung nó chạy có 700 (0.7s) mà sau khi thêm chú thích bố trí thụt dòng cho đẹp thì nó lên tới 1000 (1s). chả hiểu sao
mà 1s đó là chỉ mới lọc theo 1 điều kiện là số 4, còn nếu là bê tông thì nó tìm "bê" rồi "tông", là x2 thời gian lận

Chênh lệch nhau chút là do lúc ý máy tính của bạn đang tắc tịt, không phải đo hoàn toàn giống nhau đâu giao động 200/1000-300/1000s là bình thường
 
Upvote 0
bạn tìm kiểu này lâu là phải

bê tông 750L

sẽ thành tìm

*b*ê*
*t*ô*n*g*
*7*5*0*L*

xem lại cách ghép các dấu *
tại muốn tìm kiếm đa năng nên mới làm vậy bác ạ, kiểu nào cũng phải dùng like thì dùng * * * cho nó phê.
ví dụ như "trách nhiệm hữu hạn", với "TNHH" thì chỉ cần gõ "tnhh" nó cũng tìm được 2 cái ấy
 
Upvote 0
Chênh lệch nhau chút là do lúc ý máy tính của bạn đang tắc tịt, không phải đo hoàn toàn giống nhau đâu giao động 200/1000-300/1000s là bình thường
vừa tắt KAP với giả lập Android chạy thử lọc tất cả cột thì 1s, còn chỉ định cột thì 0.5s (trung bình), chắc vậy là nhanh rồi, để cải tiến thêm nhiều điều kiện với cách lọc nữa ^^
-------------------------
xem kỹ lại, hóa ra lọc có 35k dòng mới đc thời gian đó :v, 65k dòng chắc phải gấp dôi thời gian rồi @@
 
Lần chỉnh sửa cuối:
Upvote 0
vừa tắt KAP với giả lập Android chạy thử lọc tất cả cột thì 1s, còn chỉ định cột thì 0.5s (trung bình), chắc vậy là nhanh rồi, để cải tiến thêm nhiều điều kiện với cách lọc nữa ^^
-------------------------
xem kỹ lại, hóa ra lọc có 35k dòng mới đc thời gian đó :v, 65k dòng chắc phải gấp dôi thời gian rồi @@

Thử cái cũ này vậy

Chạy lần 1 cũng nhanh (chấp nhận được)
Từ lần 2 , 3... thì nhanh hơn nhiều

Thử ở máy đó xem bao nhiêu thời gian?
 

File đính kèm

  • locdulieu65000dong.zip
    1.6 MB · Đọc: 60
Upvote 0
Thử cái cũ này vậy

Chạy lần 1 cũng nhanh (chấp nhận được)
Từ lần 2 , 3... thì nhanh hơn nhiều

Thử ở máy đó xem bao nhiêu thời gian?
thử tìm kiếm bằng từ "lu tĩnh" xem sao bác.
kết quả nó ra cả lu rung => sai (lọc theo C2: lọc theo tên gốc)
giờ lọc tầm 1s (tìm 1 từ hay 2 từ cũng thế)
đề tài lọc này thì sôi nổi quá, còn đề tài lọc bên đây ế nhệ, có 2 người +-+-+-+
 
Lần chỉnh sửa cuối:
Upvote 0
thử tìm kiếm bằng từ "lu tĩnh" xem sao bác.
kết quả nó ra cả lu rung => sai (lọc theo C2: lọc theo tên gốc)

Như thế là ô phải chứa cả đủ 2 chữ "lu và tĩnh" ah? (nếu đúng thế thì không cần tách chữ chỉ cần *lu*tĩnh* là đạt, không cần arrTxt đâu??)
Bạn tự sửa lại đi, sửa chỗ ArrTxt đó FOR k ==> chỉnh biến OK như cũ nhé (phần Else có False) là được,
nếu cần tôi sửa cho
thay XuLyDieuKien0 thành MỚI như sau

Mã:
Private Function XuLyDieuKien0(ByVal MangDuLieu As Variant, ByVal GiaTri As Variant, ByVal CotDo As Byte, ByVal ViTriBatDau As Byte)
    Dim Ok As Boolean
    Dim STT As Long, i As Long, j As Long, k As Long
    If CotDo = 0 Then
        'duyet qua tu dong dau den dong cuoi
        For i = LBound(MangDuLieu, 1) + ViTriBatDau To UBound(MangDuLieu, 1)
            'duyet tu cot dau den cot cuoi
            For j = LBound(MangDuLieu, 2) + ViTriBatDau To UBound(MangDuLieu, 2)
                Ok = True
                For k = LBound(Arrtxt) To UBound(Arrtxt)
                    If Not (MangDuLieu(i, j) Like Arrtxt(k)) Then Ok = False: Exit For
                Next k
                If Ok Then ' neu thoat dieu kien thi them dong vao mang
                    nF = nF + 1
                    aIndex(nF) = i
                    GoTo DongTieptheo1 'thoat vong lap duyet qua dong ke tiep
                End If
            Next j
DongTieptheo1:
        Next i
    Else
        'duyet qua tu dong dau den dong cuoi
        For i = LBound(MangDuLieu, 1) + ViTriBatDau To UBound(MangDuLieu, 1)
            'duyet tu cot dau den cot cuoi
            Ok = True
            For k = LBound(Arrtxt) To UBound(Arrtxt)
                If Not (MangDuLieu(i, CotDo) Like Arrtxt(k)) Then Ok = False: Exit For
            Next k
            If Ok Then ' neu thoat dieu kien thi them dong vao mang
                nF = nF + 1
                aIndex(nF) = i
                GoTo DongTiepTheo2 'thoat vong lap duyet qua dong ke tiep
            End If
DongTiepTheo2:
        Next i
    End If
End Function
Hiện chỉ tìm
*bê*
*tông*

còn muốn từng ký tự *b*ê* ... thì bạn sửa lại ==> nhưng tôi nghĩ không cần vì nếu thế nó sẽ tìm thành các từ ví dụ có cụm từ "bài yên thông " cũng nhặt vào
 
Lần chỉnh sửa cuối:
Upvote 0
thử tìm kiếm bằng từ "lu tĩnh" xem sao bác.
kết quả nó ra cả lu rung => sai (lọc theo C2: lọc theo tên gốc)
giờ lọc tầm 1s (tìm 1 từ hay 2 từ cũng thế)
đề tài lọc này thì sôi nổi quá, còn đề tài lọc bên đây ế nhệ, có 2 người +-+-+-+

Thử thấy tốc độ có cải thiện?

Như thế là ô phải chứa cả đủ 2 chữ "lu và tĩnh" ah? (nếu đúng thế thì không cần tách chữ chỉ cần *lu*tĩnh* là đạt, không cần arrTxt đâu??) - cái này bạn phải thống nhất cách tìm,

Có 1 trong 2 chữ có được không, hay trong 1 cell phải có đủ cả 2 chữ?

 
Lần chỉnh sửa cuối:
Upvote 0
Thử thấy tốc độ có cải thiện?

Như thế là ô phải chứa cả đủ 2 chữ "lu và tĩnh" ah? (nếu đúng thế thì không cần tách chữ chỉ cần *lu*tĩnh* là đạt, không cần arrTxt đâu??) - cái này bạn phải thống nhất cách tìm,

Có 1 trong 2 chữ có được không, hay trong 1 cell phải có đủ cả 2 chữ?

nếu có 1 trong 2 thì như thế tìm không chính xác rồi bác, tìm "lu tĩnh" mà nó có cả "lu rung" thì trật lất rồi.
chắc là cái giá trị đó phải đổi lại thành "*lu*tĩnh*" như thế tìm kết quả giống AutoFilter.
hay bác có facebook không? kết bạn bàn về thuật toán trên đó trao đổi nhanh hơn.
share file qua lại cũng dễ.
-----------------------------
cách bác làm là load dữ liệu cho lần chạy đầu, còn mấy lần sau không phải load lại nên đỡ được chỗ đó, còn file mới của mình thì không load gì cả, xử lý ngay trên dữ liệu gốc nên chắc vì lí do đó mà nó lên đến 1s
việc load dữ liệu cho lần chạy đầu lợi 1 cái xử lý những lần sau nhanh hơn, mà bác đặt cho việc kiểm tra isArray có vẻ không ổn, nếu sửa lại số dòng ít đi thì lúc đó nó vẫn lẫy dữ liệu cũ <= sửa lại chỗ này
còn chưa kể cột xuất dữ liệu "1|2|3|4|5|6" đẹp rạng ngời thế này nữa
sửa lại thành "4|3|5|6|2|1|||3" là còn tốn thời gian thêm cho việc nó xử lý cột xuất dữ liệu, "||" <= bỏ trống 1 cột
 
Lần chỉnh sửa cuối:
Upvote 0
nếu có 1 trong 2 thì như thế tìm không chính xác rồi bác, tìm "lu tĩnh" mà nó có cả "lu rung" thì trật lất rồi.
chắc là cái giá trị đó phải đổi lại thành "*lu*tĩnh*" như thế tìm kết quả giống AutoFilter.
hay bác có facebook không? kết bạn bàn về thuật toán trên đó trao đổi nhanh hơn.
share file qua lại cũng dễ.
-----------------------------
cách bác làm là load dữ liệu cho lần chạy đầu, còn mấy lần sau không phải load lại nên đỡ được chỗ đó, còn file mới của mình thì không load gì cả, xử lý ngay trên dữ liệu gốc nên chắc vì lí do đó mà nó lên đến 1s
việc load dữ liệu cho lần chạy đầu lợi 1 cái xử lý những lần sau nhanh hơn, mà bác đặt cho việc kiểm tra isArray có vẻ không ổn, nếu sửa lại số dòng ít đi thì lúc đó nó vẫn lẫy dữ liệu cũ <= sửa lại chỗ này
còn chưa kể cột xuất dữ liệu "1|2|3|4|5|6" đẹp rạng ngời thế này nữa
sửa lại thành "4|3|5|6|2|1|||3" là còn tốn thời gian thêm cho việc nó xử lý cột xuất dữ liệu, "||" <= bỏ trống 1 cột

Các vấn đề đó bạn phải chọn lựa thôi, cần đọc lại số liệu nào thì chuyển IF kiểm tra tồn tại ArrData0 hay chưa vào luôn LOAD, vẫn đọc lại ArrCotDL thì tùy

--------------
file kèm sau đây, luôn đọc lại số liệu, mọi lần chạy đều cho tốc độ nhanh như nhau - tốc độ cải thiện đáng kể nhờ đọc dữ liệu nhanh hơn, không phải xử lý mảng to, có tốc độ nhanh nhất trong trường hợp "phân biệt hoa thường"=true
(chỉ đọc các dữ liệu cần lấy, không đọc các dữ liệu ở các cột khác mà không yêu cầu
tốc độ cải thiện đáng kể
tôi cũng vứt bỏ cái Class đi rồi, vì nó vô duyên, không có ý nghĩa gì ở bài này
File kèm không có Sheet DATA (xóa cho nhẹ), bạn phải copy sang

Đây là ví dụ mảng trong mảng - bạn tự ứng dụng và tìm hiểu
 

File đính kèm

  • locdulieu65000dong_boClass_code.xlsb
    84.7 KB · Đọc: 36
Lần chỉnh sửa cuối:
Upvote 0
Các vấn đề đó bạn phải chọn lựa thôi, cần đọc lại số liệu nào thì chuyển IF kiểm tra tồn tại ArrData0 hay chưa vào luôn LOAD, vẫn đọc lại ArrCotDL thì tùy

--------------
file kèm sau đây, luôn đọc lại số liệu, mọi lần chạy đều cho tốc độ nhanh như nhau - tốc độ cải thiện đáng kể nhờ đọc dữ liệu nhanh hơn, không phải xử lý mảng to, có tốc độ nhanh nhất trong trường hợp "phân biệt hoa thường"=true
(chỉ đọc các dữ liệu cần lấy, không đọc các dữ liệu ở các cột khác mà không yêu cầu
tốc độ cải thiện đáng kể
tôi cũng vứt bỏ cái Class đi rồi, vì nó vô duyên, không có ý nghĩa gì ở bài này
File kèm không có Sheet DATA (xóa cho nhẹ), bạn phải copy sang

Đây là ví dụ mảng trong mảng - bạn tự ứng dụng và tìm hiểu
vụ mảng trong mảng này thì mới biết ^^, nếu lấy dữ liệu vô như thế thì lọc mảng theo hàng ngang (thay vì hàng doc- cách cũ) nhỉ.
mới phát hiện ra sau khi lọc xong lúc dán kết quả vào cũng mất thời gian (dữ liệu lớn) chắc tầm 0.2-0.3s (chưa đo thử)
---------------------------
thấy code LoadData bác sửa có vài dòng hình như bị dư, việc lấy ra số cột và số dòng của mảng dữ liệu ở bên trên có rồi bên dưới lại lấy nữa ý.
---------------------------
xem đúng là nó lấy dữ liệu nhanh thật nhưng có 1 vấn đề thế này, đó là lấy dữ liệu khi giá trị dò có giá trị, còn nếu không có giá trị thì không cần dò tìm, chỉ việc dán mảng vào luôn thôi (vậy thì làm sao để dán được mảng kết quả hàng ngang đó cho hàng dọc được?)
---------------------------
lạ ở chỗ này nữa
ví dụ như lọc ở cột công xuất (tại ô giá trị lọc)
khi bỏ trống và lọc (load dữ liệu ban đầu) thì ~2.5s :len(value)=0
khi gõ vào số 4 thì thời gian (ko load dữ liệu lại) thì ~0.5s :len(value)=1
khi gõ vào số 400 thì thời gian (ko load dữ liệu lại) thì ~0.3s :len(value)=3
khi bỏ trống thì thời gian (ko load dữ liệu lại) thì ~2.5s :len(value)=0
thử với lọc ở các cột khác cũng như thế
vậy lý do là sao khi giá trị lọc càng ngắn thì thời gian chạy càng lâu
liệu có phải là tốc độ nó chậm là do lúc dán dữ liệu lớn vào bảng tính thì nó chậm như thế hay vì 1 lý do nào khác
 
Lần chỉnh sửa cuối:
Upvote 0
vụ mảng trong mảng này thì mới biết ^^, nếu lấy dữ liệu vô như thế thì lọc mảng theo hàng ngang (thay vì hàng doc- cách cũ) nhỉ.
mới phát hiện ra sau khi lọc xong lúc dán kết quả vào cũng mất thời gian (dữ liệu lớn) chắc tầm 0.2-0.3s (chưa đo thử)
---------------------------
thấy code LoadData bác sửa có vài dòng hình như bị dư, việc lấy ra số cột và số dòng của mảng dữ liệu ở bên trên có rồi bên dưới lại lấy nữa ý.
---------------------------
xem đúng là nó lấy dữ liệu nhanh thật nhưng có 1 vấn đề thế này, đó là lấy dữ liệu khi giá trị dò có giá trị, còn nếu không có giá trị thì không cần dò tìm, chỉ việc dán mảng vào luôn thôi (vậy thì làm sao để dán được mảng kết quả hàng ngang đó cho hàng dọc được?)
---------------------------

Trường hợp để "" thì là đặc biệt là trường hợp cần tách riêng mà xử lý, gán veo cái là xong, có chi lăn tăn

lạ ở chỗ này nữa
ví dụ như lọc ở cột công xuất (tại ô giá trị lọc)
khi bỏ trống và lọc (load dữ liệu ban đầu) thì ~2.5s :len(value)=0
khi gõ vào số 4 thì thời gian (ko load dữ liệu lại) thì ~0.5s :len(value)=1
khi gõ vào số 400 thì thời gian (ko load dữ liệu lại) thì ~0.3s :len(value)=3
khi bỏ trống thì thời gian (ko load dữ liệu lại) thì ~2.5s :len(value)=0
thử với lọc ở các cột khác cũng như thế
vậy lý do là sao khi giá trị lọc càng ngắn thì thời gian chạy càng lâu
liệu có phải là tốc độ nó chậm là do lúc dán dữ liệu lớn vào bảng tính thì nó chậm như thế hay vì 1 lý do nào khác

Khi càng nhiều dòng thỏa mãn "giá trị tìm" thì chương trình có thể càng nhanh hơn (nếu giá trị tìm nằm ngay ở những cột đầu tiên)- vì tại các dòng không thỏa mãn code cần phải tìm tất cả các cột colDLs nên ngốn thời gian

Túm lại thời gian như thế thỏa mãn bạn chưa, nếu chưa thì cần bàn tiếp hoặc đổi giải pháp khác - vba là code nửa sống nửa chín (không dịch trước, thông dịch sau) tốc độ là điểm yếu của nó + với điểm yếu cố tật của excel là quản lý dữ liệu theo dạng cells đơn lẻ không theo cơ sở dữ liệu cũng như quản lý kém (tốc độ suy giảm) khi dữ liệu lớn và cực lớn --> 2 cái yếu gặp nhau trong bài của bạn ==> yếu toàn tập về mặt tốc độ là đúng rồi.
 
Lần chỉnh sửa cuối:
Upvote 0
Trường hợp để "" thì là đặc biệt là trường hợp cần tách riêng mà xử lý, gán veo cái là xong, có chi lăn tăn



Khi càng nhiều dòng thỏa mãn "giá trị tìm" thì chương trình có thể càng nhanh hơn (nếu giá trị tìm nằm ngay ở những cột đầu tiên)- vì tại các dòng không thỏa mãn code cần phải tìm tất cả các cột colDLs nên ngốn thời gian

Túm lại thời gian như thế thỏa mãn bạn chưa, nếu chưa thì cần bàn tiếp hoặc đổi giải pháp khác - vba là code nửa sống nửa chín (không dịch trước, thông dịch sau) tốc độ là điểm yếu của nó
hình như khi lọc dữ liệu xong nó có nhiều dòng, lúc gán lại vào sheet thì nó cũng bị mất 1 khoản thời gian hay sao ấy.
như bên trên mình nói, khi để trống thì hoàn toàn không lọc gì cả, chỉ việc gán dữ liệu vào mà nó cũng mất hơn 2s, lần nào cũng thế. vấn đề là chỗ này
bác thử file này xem
đó là thời gian chạy lần đầu với mấy lần sau trên máy em
 
Upvote 0
hình như khi lọc dữ liệu xong nó có nhiều dòng, lúc gán lại vào sheet thì nó cũng bị mất 1 khoản thời gian hay sao ấy.
như bên trên mình nói, khi để trống thì hoàn toàn không lọc gì cả, chỉ việc gán dữ liệu vào mà nó cũng mất hơn 2s, lần nào cũng thế. vấn đề là chỗ này
bác thử file này xem
đó là thời gian chạy lần đầu với mấy lần sau trên máy em
gần giống thế này...
thời gian loadata 0,25-0,3s -- luôn luôn thế
code chạy mất khoảng 0.5-0,6s - tùy thuộc vào giá trị tìm
xuất kết quảmất khoảng 0.2-0.3s (ứng với khoảng trên dưới 5000 dòng) - tùy thuộc vào số lượng dòng tìm thấy (nhưng dao động không nhiều)

tất nhiên trường hợp gán cả 65000 dòng thì phải mất time nhất trong xuất kết quả- là đúng rồi (khoảng 0,8-1s)
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom