Giúp code lọc nhanh Siêu tốc độ (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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

Lần chỉnh sửa cuối:
Trước khi xài dao fẩu thuật, bạn xài thử lưỡi lam này xem sao:

PHP:
Option Explicit
Sub LocKhoanNgayVaCa()
 Dim Arr()
 Dim Rws As Long, J As Long, Tmr As Double, Col As Byte, W As Long
 Dim fDat As Date, lDat As Date
 Dim NV As String
 
 Tmr = Timer()
 Rws = [b4].CurrentRegion.Rows.Count
 Arr() = [A4].Resize(Rws, 5).Value
 fDat = [i3].Value:     lDat = [i4].Value
 NV = [i5].Value
 ReDim dArr(1 To UBound(Arr()), 1 To 5)
 [n4].CurrentRegion.Offset(2).ClearContents
 For J = 1 To UBound(Arr())
    If (Arr(J, 1) >= fDat And Arr(J, 1) <= lDat) And Arr(J, 5) = NV Then
        W = W + 1
        For Col = 1 To 5
            dArr(W, Col) = Arr(J, Col)
        Next Col
    End If
 Next J
 If W Then
    [m4].Resize(W, 5).Value = dArr()
    [i1].Value = Timer() - Tmr
 End If
End Sub
 
Upvote 0
code của anh nhanh chóng mặt luôn. Chổ nhân viên có 3 lựa chọn anh nhé ( Tất cả,ca1, ca2) khi em chọn Tất cả thì ca 1 ca 2 đều lấy hết. Anh sữa lại Code giúp em. Cảm ơn anh

Trước khi xài dao fẩu thuật, bạn xài thử lưỡi lam này xem sao:

PHP:
Option Explicit
Sub LocKhoanNgayVaCa()
 Dim Arr()
 Dim Rws As Long, J As Long, Tmr As Double, Col As Byte, W As Long
 Dim fDat As Date, lDat As Date
 Dim NV As String
 
 Tmr = Timer()
 Rws = [b4].CurrentRegion.Rows.Count
 Arr() = [A4].Resize(Rws, 5).Value
 fDat = [i3].Value:     lDat = [i4].Value
 NV = [i5].Value
 ReDim dArr(1 To UBound(Arr()), 1 To 5)
 [n4].CurrentRegion.Offset(2).ClearContents
 For J = 1 To UBound(Arr())
    If (Arr(J, 1) >= fDat And Arr(J, 1) <= lDat) And Arr(J, 5) = NV Then
        W = W + 1
        For Col = 1 To 5
            dArr(W, Col) = Arr(J, Col)
        Next Col
    End If
 Next J
 If W Then
    [m4].Resize(W, 5).Value = dArr()
    [i1].Value = Timer() - Tmr
 End If
End Sub
 
Upvote 0
(1) Trong cột [E:E] (nhân viên có C2 & Ca2; Vậy thì không bao giờ lọc được C2 (vì không có trong DS lọc)

(2) Tao macro sự kiện tại [I5] mà mần thôi.

Thay vì câu lệnh:
Mã:
[COLOR=#000000][COLOR=#007700]If ([/COLOR][COLOR=#0000BB]Arr[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]J[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700]) >= [/COLOR][COLOR=#0000BB]fDat [/COLOR][COLOR=#007700]And [/COLOR][COLOR=#0000BB]Arr[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]J[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700]) <= [/COLOR][COLOR=#0000BB]lDat[/COLOR][COLOR=#007700]) And [/COLOR][COLOR=#0000BB]Arr[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]J[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]5[/COLOR][COLOR=#007700]) = [/COLOR][COLOR=#0000BB]NV Then
Ta chuyển thành
PHP:
If (Arr(J, 1) >= fDat And Arr(J, 1) <= lDat) And Arr(J, 5) = Target.Value Then

Chúc thành công![/COLOR][/COLOR]
 
Upvote 0
(1) Trong cột [E:E] (nhân viên có C2 & Ca2; Vậy thì không bao giờ lọc được C2 (vì không có trong DS lọc)

(2) Tao macro sự kiện tại [I5] mà mần thôi.

Thay vì câu lệnh:
Mã:
[COLOR=#000000][COLOR=#007700]If ([/COLOR][COLOR=#0000BB]Arr[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]J[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700]) >= [/COLOR][COLOR=#0000BB]fDat [/COLOR][COLOR=#007700]And [/COLOR][COLOR=#0000BB]Arr[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]J[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]1[/COLOR][COLOR=#007700]) <= [/COLOR][COLOR=#0000BB]lDat[/COLOR][COLOR=#007700]) And [/COLOR][COLOR=#0000BB]Arr[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]J[/COLOR][COLOR=#007700], [/COLOR][COLOR=#0000BB]5[/COLOR][COLOR=#007700]) = [/COLOR][COLOR=#0000BB]NV Then [/COLOR][/COLOR]

Ta chuyển thành
PHP:
If (Arr(J, 1) >= fDat And Arr(J, 1) <= lDat) And Arr(J, 5) = Target.Value Then

Chúc thành công!

Nếu sửa lại NV Then thành Target.Value Then thì lỗi luôn Đại ka ChanhTQ@ ơi ???
 
Upvote 0
Không báo lỗi, nhưng kết quả chưa thỏa hết các iêu cầu;

Chuyện này dành cho tác giả bài viết thử sức thôi;
 
Upvote 0
Không báo lỗi, nhưng kết quả chưa thỏa hết các iêu cầu;

Chuyện này dành cho tác giả bài viết thử sức thôi;

cảm ơn các bạn giúp mình. Tại vì mính biết VBA sơ sơ nên cũng không biết viết làm sao. Nhưng mà mình Nói ý tưởng cho các bạn viết như thế này

Nếu NV= Tất cả thì And ( tu ngay, den ngay )
Ngược lai thì And ( Tu ngay, den ngay , Nhan vien )
 
Upvote 0
Không báo lỗi, nhưng kết quả chưa thỏa hết các iêu cầu;

Chuyện này dành cho tác giả bài viết thử sức thôi;

Em mò như mò Cua giờ code ok rối . mấy anh chị xem giúp em như vậy ok chưa

Sub LocKhoanNgayVaCa()
Dim Arr()
Dim J As Long, Col As Byte, W As Long
Dim fDat As Date, lDat As Date
Dim NV As String

Arr() = Range("A4:E32").Value ' input
fDat = [i3].Value: lDat = [i4].Value
NV = [i5].Value
ReDim dArr(1 To UBound(Arr()), 1 To 5)
[n4].CurrentRegion.Offset(2).ClearContents

For J = 1 To UBound(Arr())

If Len(NV) <> 6 Then
If (Arr(J, 1) >= fDat And Arr(J, 1) <= lDat) And Arr(J, 5) = NV Then
W = W + 1
For Col = 1 To 5
dArr(W, Col) = Arr(J, Col)
Next Col
End If
Else
If (Arr(J, 1) >= fDat And Arr(J, 1) <= lDat) Then
W = W + 1
For Col = 1 To 5
dArr(W, Col) = Arr(J, Col)
Next Col
End If

End If
Next J

Range("m4").Resize(W, 5).Value = dArr() ' output
End Sub
 
Upvote 0
2úa được ấy chứ!

; Ta có thể căn cứ vô chữ cái đầu của từ được chọn.
 
Upvote 0
Em mò như mò Cua giờ code ok rối . mấy anh chị xem giúp em như vậy ok chưa
bạn kha báo 1 biến:DK As Boolean
sau đó gán biến DK
Mã:
If Len(NV) <> 6 Then
  dk=(Arr(J, 1) >= fDat And Arr(J, 1) <= lDat) And Arr(J, 5) = NV
else
  dk=(Arr(J, 1) >= fDat And Arr(J, 1) <= lDat)
end if

sau đó chỉ cần 1 if

If dk Then
...
 
Lần chỉnh sửa cuối:
Upvote 0
@minhtuan55,

Ông tướng này viết gần 200 bài rồi còn ném code ra bài viết. Cho vào thẻ CODE hoặc PHP.
 
Upvote 0
@minhtuan55,

Ông tướng này viết gần 200 bài rồi còn ném code ra bài viết. Cho vào thẻ CODE hoặc PHP.

Ông ta ném ra cho bạn đọc chứ ông ta đâu có đọc đâu mà cần phải cải tiến. Tại bạn muốn "nâng cao tinh thần học hỏi nhau" thì phải chấp nhận vậy.
(hồi đó tôi cũng từng bảo người viết "sửa chỗ... rồi nói chuyện tiếp" thì bị một số thành viên khác chửi là chảnh. Thực sự tôi thấy bài nào dùng font lớn và bôi đậm toàn thể là khong thèm đọc đến dòng thứ 2, cố đọc loạn thị mất)
 
Upvote 0
Ông ta ném ra cho bạn đọc chứ ông ta đâu có đọc đâu mà cần phải cải tiến. Tại bạn muốn "nâng cao tinh thần học hỏi nhau" thì phải chấp nhận vậy.
(hồi đó tôi cũng từng bảo người viết "sửa chỗ... rồi nói chuyện tiếp" thì bị một số thành viên khác chửi là chảnh. Thực sự tôi thấy bài nào dùng font lớn và bôi đậm toàn thể là khong thèm đọc đến dòng thứ 2, cố đọc loạn thị mất)
Em cảm ơn anh. /-*+/ /-*+/

Em thì bị chửi là "...kẻ cả" các kiểu luôn nhưng mà hổng có sao, hổng "ngán" ạ.

Chúc anh một tối vui và ngon giấc!
 
Upvote 0
Mã:
If Len(NV) <> 6 Then
  dk=(Arr(J, 1) >= fDat And Arr(J, 1) <= lDat) And Arr(J, 5) = NV
else
  dk=(Arr(J, 1) >= fDat And Arr(J, 1) <= lDat)
end if

Viết như vầy đọc rõ hơn
Mã:
dk = (Arr(J, 1) >= fDat And Arr(J, 1) <= lDat) [COLOR=#008000]' điều kiện này chính[/COLOR]
If Len(NV) <> 6 Then dk = dk And (Arr(J, 5) = NV) [COLOR=#008000]' nếu len <> 6 thì thêm điều kiện phụ[/COLOR]
 
Upvote 0
Viết như vầy đọc rõ hơn
Mã:
dk = (Arr(J, 1) >= fDat And Arr(J, 1) <= lDat) [COLOR=#008000]' điều kiện này chính[/COLOR]
If Len(NV) <> 6 Then dk = dk And (Arr(J, 5) = NV) [COLOR=#008000]' nếu len <> 6 thì thêm điều kiện phụ[/COLOR]
cám ơn bạn, vừa gọn vừa dể hiểu
 
Upvote 0
tiện thể có chủ đề này mọi người giúp đỡ em vấn đề trong file này nhé
vấn đề là mình cần 1 hàm lọc dữ liệu (trả về mảng dữ liệu sau khi lọc) hơi bị đa năng nên mong mọi người giúp đỡ
trong file chỉ là 1 góc trong vô vàn cách lọc, theo em thấy thì cái góc này chắc là lọc chậm nhất trong các cách nên nêu ra
bỏ qua AutoFilter của excel nhé
trong file là cách em tự binh biến
nếu mọi người có tuyệt chiêu gì mong được chỉ giáo
link Media
 
Upvote 0
tiện thể có chủ đề này mọi người giúp đỡ em vấn đề trong file này nhé
vấn đề là mình cần 1 hàm lọc dữ liệu (trả về mảng dữ liệu sau khi lọc) hơi bị đa năng nên mong mọi người giúp đỡ
trong file chỉ là 1 góc trong vô vàn cách lọc, theo em thấy thì cái góc này chắc là lọc chậm nhất trong các cách nên nêu ra
bỏ qua AutoFilter của excel nhé
trong file là cách em tự binh biến
nếu mọi người có tuyệt chiêu gì mong được chỉ giáo
link Media

tạm liếc qua thế này

1) VBA:chấp nhận dùng class là chậm so với module thường (đối với dạng vấn đề đang xử lý của bạn) - chỉ thuận lợi cho người viết code (khi viết và chỉnh sửa) mà thôi - cái này phải suy nghĩ đánh đổi tốc độ và thuận lợi
2) Dictionary trong class của bạn là vô ích làm chậm đi quá trình (vì Dic.Add STT..., mà STT thì luôn khác nhau rui, đầu cần Dic làm chi??)
3) khi tìm với Tất cả (col Tìm=0) thì thuật toán cần xem lại: nên phân biệt number và Text (cái này chưa cần với ví dụ của bạn - vì toàn Text)
4) Việc tìm ra rồi lại list lại STT sau đó mới cho vào mảng, cũng làm chậm đi (cái này chắc không đáng kể)

Cải thiện được 4 điều trên thì code sẽ nhanh lên nhiều
 
Lần chỉnh sửa cuối:
Upvote 0
1) chấp nhận dùng class là chậm so với module thường - chỉ thuật lợi cho người viết code (khi viết và chỉnh sửa) mà thôi - cái này phải suy nghĩ đánh đổi tốc độ và thuận lợi
cái này thì mình không biết, chủ yếu để trong class vì sau này cho vô Addins rồi mình thấy nếu viết function trong module thì lúc mình test code thì nó hay chạy mấy cái function trong module (không biết nguyên nhân)
2) Dictionary trong class của bạn là vô ích làm chậm đi quá trình (vì Dic.Add STT..., mà STT thì luôn khác nhau rui, đầu cần Dic làm chi??)
4) Việc tìm ra rồi lại list lại STT sau đó mới cho vào mảng, cũng làm chậm đi (cái này chắc không đáng kể)
Dictionary đó mình dùng để lấy dòng thỏa điều kiện để sau đó thêm vào mảng, vì không biết được kích thước mảng kết quả nên chỉ khi hoàn thành mới khai báo và gán lại mới được, nếu có cách khác hay hơn không làm ảnh hưởng đến tốc độ thì ok, mình cứ tưởng sử dụng Dic là tốc độ "bàn thờ" rồi chứ
3) khi tìm với Tất cả (col Tìm=0) thì thuật toán cần xem lại: nên phân biệt number và Text (cái này chưa cần với ví dụ của bạn - vì toàn Text)
cái này mình không biết làm sao cho tổng quát hơn được nên chỉ mới nghĩ ra như thế
 
Upvote 0
cái này thì mình không biết, chủ yếu để trong class vì sau này cho vô Addins rồi mình thấy nếu viết function trong module thì lúc mình test code thì nó hay chạy mấy cái function trong module (không biết nguyên nhân)
Khó hiểu,
Nếu cần thì đặt Private Sub/Function - để hạn chế phạm vi sử dụng hàm hay sub đó, cần nữa thì chỉ rõ tên module trong khi gọi sub/fun

Dictionary đó mình dùng để lấy dòng thỏa điều kiện để sau đó thêm vào mảng, vì không biết được kích thước mảng kết quả nên chỉ khi hoàn thành mới khai báo và gán lại mới được, nếu có cách khác hay hơn không làm ảnh hưởng đến tốc độ thì ok, mình cứ tưởng sử dụng Dic là tốc độ "bàn thờ" rồi chứ

Khi dùng Dic.Add key, ... --> Dic phải dò tìm xem key đó đã trùng hay chưa (trong Add method sẽ phải làm việc đó) - khi số lương keys lớn thì việc dò tìm dĩ nhiên là chậm hơn là không dò tìm rồi (dù DIC có siêu tốc hay không siêu tốc thì cũng chi phí thời gian đáng kể bị lãng phí),
Trong bài của bạn nên đổi thành dùng Array 1 chiều lưu chỉ số i

cái này mình không biết làm sao cho tổng quát hơn được nên chỉ mới nghĩ ra như thế
trên tôi đã gợi ý bạn nên phân tách ra number và text là 1 cách ... Nhưng bài ví dụ hiện tại của bạn toàn text nên không ảnh hường
------------

1 lưu ý mới nữa là

5) đối với sub LOAD Data:

+ có những biến và dòng code thừa - như ArrDataU vô ích chú ý này xem lại thì thấy ArrDataU có cần dùng không phải vô ích - tuy thế có cần upcase trước thế hay không?

+ có nên chăng phải lọc trước dữ liệu của Data gốc không?, sao không nghĩ phương án chuyển thẳng Data gốc cùng ArrCotDuLieu vào thẳng code Filter (hiện trong class) để xử lý (vì trước sau ta cũng phải nhặt dữ liệu theo điều kiện Filter) -- như thế bỏ hẳn được đoạn For i for j ngốn nhiều resource (time and memory) này (khi dữ liêu lớn (số dòng ở đây) thì mỗi FOR duyệt sẽ làm tăng chi phí thời gian là đáng kể)

-----------
Suy nghĩ cải thiện 5 điều đó thì code mới dần nhanh được, có thể còn nhiều cái khác nữa - vì tôi mới đọc lướt lướt qua.
 
Lần chỉnh sửa cuối:
Upvote 0
Khi dùng Dic.Add key, ... --> Dic phải dò tìm xem key đó đã trùng hay chưa (trong Add method sẽ phải làm việc đó) - khi số lương keys lớn thì việc dò tìm dĩ nhiên là chậm hơn là không dò tìm rồi (dù DIC có siêu tốc hay không siêu tốc thì cũng chi phí thời gian đáng kể bị lãng phí),
Trong bài của bạn nên đổi thành dùng Array 1 chiều lưu chỉ số i
Cái này thì có thể sửa được, thì ra Dic phải tìm nữa mới Add vô (mất thời gian chỗ này), thế mà cứ tưởng nó ok rồi.
trên tôi đã gợi ý bạn nên phân tách ra number và text là 1 cách ... Nhưng bài ví dụ hiện tại của bạn toàn text nên không ảnh hường
cái này thì chưa biết giải quyết thế nào rồi, vì nếu tách text với Nunber ra thì phải thêm 1 bước kiểm tra nữa, liệu như thế có nhanh hơn không, vì dự tính là hàm tổng quát nên dữ liệu nó không ổn định như thế
5) đối với sub LOAD Data:
+ có những biến và dòng code thừa - như ArrDataU vô ích
+ có nên chăng phải lọc trước dữ liệu của Data gốc không, sao không nghĩ phương án chuyển thẳng Data gốc cùng ArrCotDuLieu vào thẳng code Filter (hiện trong class) để xử lý (vì trước sau ta cũng phải nhặt dữ liệu theo điều kiện Filter) -- như thế bỏ hẳn được đoạn For i for j ngốn nhiều resource (time and memory) này (khi dữ liêu lớn (số dòng ở đây) thì mỗi FOR duyệt sẽ làm tăng chi phí thời gian là đáng kể)
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.
code LoadData mình dự định là chỉ chạy 1 lần đầu, những lần sau đó thì ko phải chạy lại (nên sẽ đỡ thời gian cho những lần chạy sau)- sẽ đặt điều kiện để nhận biết khi nào vùng dữ liệu thay đổi để Load lại, còn không thì không phải load
còn ý phía sau mình không hiểu
ps: Cảm ơn bạn đã quan tâm, vì đây là code ban đầu viết nên chưa lường hết các vấn đề nên vẫn còn chậm như thế, mong được sự hỗ trợ từ bạn để cải thiện tốc độ hơn
 
Upvote 0
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

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

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
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 - 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 là đúng rồi
vậy xem như chấp nhận thòi gian đó đi, giờ tới việc xử lý lọc duy nhất (sẽ xử lý dự liệu khi loadData) nếu dùng kiểu gán mảng như bác thì ko thể lọc được, hay là dùng cả 2 cách LoadData đối với từng trường hợp nhỉ
------------
như bác nói thì nó mất thời gian ở việc LoadData ban đầu với dán dữ liệu sau khi làm vậy xử lý 2 vấn đề này chắc là ok
 
Lần chỉnh sửa cuối:
Upvote 0
vậy xem như chấp nhận thòi gian đó đi, giờ tới việc xử lý lọc duy nhất (sẽ xử lý dự liệu khi loadData) nếu dùng kiểu gán mảng như bác thì ko thể lọc được, hay là dùng cả 2 cách LoadData đối với từng trường hợp nhỉ
------------
như bác nói thì nó mất thời gian ở việc LoadData ban đầu với dán dữ liệu sau khi làm vậy xử lý 2 vấn đề này chắc là ok

2 Vấn đề đó không xử lý được đâu, load data là bắt buộc rui, xuất kết quả cũng không nhanh hơn được nữa ... - tuy thế thực tế không có cơ sở dữ liệu đến 65000 dòng đâu mà lo, khoảng 5000 dòng thì 2 thời gian này lại không đáng kể để xử lý nữa

- gán kiểu mảng của mảng vẫn lọc và xử lý tốt nhé nó gần giống mảng 2 chiều thui

----------
chú ý bài trước
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
File này ứng dụng đầy đủ mảng trong mảng, có chặn trường hợp khi giá trị tìm là "" thì không lọc mà gán toàn bộ dữ liệu xuống

Xem cách thức sử dụng mảng ArrData0 rồi áp dụng sang lọc duy nhất của bạn

Đây là cách load Data nhanh nhất, Thuật toán lọc cũng đã cải tiến thông qua sTXT và phân biệt rõ trường hợp theo upperX

Tắt hết các ứng dụng khác, chạy excel trong sạch chỉ mở file lọc - bạn thử chạy xem có thấy dưới 1s không?
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
File này ứng dụng đầy đủ mảng trong mảng, có chặn trường hợp khi giá trị tìm là "" thì không lọc mà gán toàn bộ dữ liệu xuống

Xem cách thức sử dụng mảng ArrData0 rồi áp dụng sang lọc duy nhất của bạn

Đây là cách load Data nhanh nhất, Thuật toán lọc cũng đã cải tiến thông qua sTXT và phân biệt rõ trường hợp theo upperX

Tắt hết các ứng dụng khác, chạy excel trong sạch chỉ mở file lọc - bạn thử chạy xem có thấy dưới 1s không?
OK, để em xem thử. up trước file lên cái đã. có gì bác sửa ngay trên file đó. vì ngồi nguyên hôm nay để ráp vô file chính rồi, hàm chính là LocDuLieu, còn mấy hàm khác sửa thoải mái
 
Upvote 0
OK, để em xem thử. up trước file lên cái đã. có gì bác sửa ngay trên file đó. vì ngồi nguyên hôm nay để ráp vô file chính rồi, hàm chính là LocDuLieu, còn mấy hàm khác sửa thoải mái

Bạn tự ghép và sửa đi, đợi ai nữa. Tôi đã hết thời gian nghỉ (rất tiếc. có thời gian thì tôi sẽ quay lại bàn thêm nếu bạn muốn)

Xong thì up lên cho mọi người dùng chung phần nào
Đừng như nhiều người giữ khư khư cho riêng mình rồi thương mại, rồi cho free limit, đem đào tạo, hay là mã hóa code thành con giun con dế (dù code nho nhỏ không có đáng xem, vì code mà không giải thích không chia sẻ thì có mã hóa hay không mã hóa cũng gây cho người khác khó hiểu). Dùng 1 mình rồi cũng đến ngày vứt đi mà thôi.

VBA sinh ra là open source rui, Forum sinh ra để chia sẻ rồi - đừng để chính họ lợi dụng làm mất đi những giá trị như thế.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn tự ghép và sửa đi, đợi ai nữa. Tôi đã hết thời gian nghỉ (rất tiếc. có thời gian thì tôi sẽ quay lại bàn thêm nếu bạn muốn)

Xong thì up lên cho mọi người dùng chung phần nào
Đừng như nhiều người giữ khư khư cho riêng mình rồi thương mại, rồi cho free limit, đem đào tạo, hay là mã hóa code thành con giun con dế (dù code nho nhỏ không có đáng xem, vì code mà không giải thích không chia sẻ thì có mã hóa hay không mã hóa cũng gây cho người khác khó hiểu). Dùng 1 mình rồi cũng đến ngày vứt đi mà thôi.

VBA sinh ra là open source rui, Forum sinh ra để chia sẻ rồi - đừng để chính họ lợi dụng làm mất đi những giá trị như thế.
OK bác, cảm ơn bác nhiều.
mới coi sơ qua đúng là nhanh thật, để tham khảo thêm, cách này thuận lợi hơn vụ loaddata 1 lần kia là cập nhật dữ liệu mới luôn, còn cái kia mấy lần sau ko cập nhật được dữ liệu vào Data nếu có sửa đổi.
lại phải ngồi chỉnh sửa lại cho như ý rồi
cảm ơn bác 2-3 ngày nay ngồi thảo luận với em nhe.
file thì em up lên hết rồi, giấu gì nữa, trừ khi chết link thôi, muốn down thì thoải mái.
sau khi xong sẽ up file hoàn thiện lên (trên dd hay ứng dụng cũng có nhiều cái này rồi)- lọc- dò tìm- nhập liệu nâng cao như Atool- rồi nhập liệu của quanghai (2 chương trình đó mã hóa code hết nên xem chả được, đành viết cái 1 riêng của mình bằng VBA cùi bắp thôi)
 
Upvote 0
Gửi winvista
có vấn đề thế này bác ạ, sau khi xem code của bác. thì khi nó không lọc gì cả (tức là dán toàn bộ vùng dữ liệu vào) thì ở đây là dán vào trang tính => OK nhanh
nhưng mà mình muốn cái kết quả sau khi lọc thì nó trả về mảng để gán lên ListBox, vậy thì như dòng bên trên mình nêu thì phá sản chỗ này- ko thể gán vô listbox được)
hay là gán dữ liệu lên listbox còn cách nào khác chăng, ngoài AddItem và dán thằng 1 mảng đầy đủ vô
 
Upvote 0
Gửi winvista
có vấn đề thế này bác ạ, sau khi xem code của bác. thì khi nó không lọc gì cả (tức là dán toàn bộ vùng dữ liệu vào) thì ở đây là dán vào trang tính => OK nhanh
nhưng mà mình muốn cái kết quả sau khi lọc thì nó trả về mảng để gán lên ListBox, vậy thì như dòng bên trên mình nêu thì phá sản chỗ này- ko thể gán vô listbox được)
hay là gán dữ liệu lên listbox còn cách nào khác chăng, ngoài AddItem và dán thằng 1 mảng đầy đủ vô

Thế thì bạn khai báo lại ArrKQ
và dùng code này trong trường hợp sTXT="**"
Mã:
            ReDim ArrKQ(1 To N0, 1 To nCdl)
            For i = 1 To N0
                For j = 1 To nCdl
                    ArrKQ(i, j) = ArrData0(j)(i, 1)
                Next j
            Next i
trong code Filter đó, để có ArrKQ như mong muốn

Listbox phải gán toàn mảng thì mới nhanh được
 
Lần chỉnh sửa cuối:
Upvote 0
Thế thì bạn khai báo lại ArrKQ
và dùng code này trong trường hợp sTXT="**"
Mã:
            ReDim ArrKQ(1 To N0, 1 To nCdl)
            For i = 1 To N0
                For j = 1 To nCdl
                    ArrKQ(i, j) = ArrData0(j)(i, 1)
                Next j
            Next i
trong code Filter đó, để có ArrKQ như mong muốn

Listbox phải gán toàn mảng thì mới nhanh được
nếu như thế mỗi lần ko có giá trị nó lại chạy 65k dòng, thì chắc là lâu hơn LoadData kiểu cũ rồi
 
Upvote 0
nếu như thế mỗi lần ko có giá trị nó lại chạy 65k dòng, thì chắc là lâu hơn LoadData kiểu cũ rồi

Không lâu hơn đâu, load kiểu cũ , chẳng qua ta chưa kể thời gian LoadData, vì chuyển ArrData0 từ gốc sang lọc riêng cột thì cũng tương đương mà thôi

Hơn nữa đây là bài toán lọc, đâu bài toán cho Gia Trị Lọc="" đâu, thế thì cần gì lọc nữa, nếu cần nữa bạn có thể chặn ngay từ chỗ LoadData nếu giá trị lọc ="" thì chuyển sang bài toán khác, là gán mảng mà thôi , thích chọn cái nào thì chọn, đơn giản vậy
 
Upvote 0
Không ai cho hơn 1000 dòng lên listbox đâu --> vì nó không thực dụng, trên 1000 dòng kéo scroll để xem cũng chết mệt rui,
bạn nên nghĩ bài toán thực tế đi, tránh suy nghĩ quá tự làm khó mình ...
 
Upvote 0
Không ai cho hơn 1000 dòng lên listbox đâu --> vì nó không thực dụng, trên 1000 dòng kéo scroll để xem cũng chết mệt rui,
bạn nên nghĩ bài toán thực tế đi, tránh suy nghĩ quá tự làm khó mình ...
tại còn vấn đề khác nên phải cho nó trả về mảng đầy đủ mới được bác ạ. đã chơi thì chơi cho nó max luôn file 2003 chứ bác, vậy mới tê, chứ dữ liệu ít thì đơn giản quá, không nâng cao tay nghề về thuật toán được.
làm excel thì chỉ có trích lọc là mạnh nên khai thác mọi thuật toán về nó chứ bác.
----------------------------------
có 1 tên trong nghề với em (Sharava36) đang coi bài ^^
 
Upvote 0
tại còn vấn đề khác nên phải cho nó trả về mảng đầy đủ mới được bác ạ. đã chơi thì chơi cho nó max luôn file 2003 chứ bác, vậy mới tê, chứ dữ liệu ít thì đơn giản quá, không nâng cao tay nghề về thuật toán được.
làm excel thì chỉ có trích lọc là mạnh nên khai thác mọi thuật toán về nó chứ bác.
----------------------------------
có 1 tên trong nghề với em (Sharava36) đang coi bài ^^
Em coi để học hỏi thôi. Chứ có giúp gì cho anh được đâu.@$@!^%
 
Upvote 0
Cách làm ra làm sao em đâu có biết. em chỉ biết Copy code rồi paste là ok. Mong ANH CHỈ GIÁO

Mã:
Option ExplicitSub LocKhoanNgayVaCa()
 Dim Arr()
 Dim Rws As Long, J As Long, Tmr As Double, Col As Byte, W As Long
 Dim fDat As Date, lDat As Date
 Dim NV As String
 
 Tmr = Timer()
 Rws = [b4].CurrentRegion.Rows.Count
 Arr() = [A4].Resize(Rws, 5).Value
 fDat = [i3].Value:     lDat = [i4].Value
 NV = [i5].Value
 ReDim dArr(1 To UBound(Arr()), 1 To 5)
 [n4].CurrentRegion.Offset(2).ClearContents
 For J = 1 To UBound(Arr())
    If (Arr(J, 1) >= fDat And Arr(J, 1) <= lDat) And Arr(J, 5) = NV Then
        W = W + 1
        For Col = 1 To 5
            dArr(W, Col) = Arr(J, Col)
        Next Col
    End If
 Next J
 If W Then
    [m4].Resize(W, 5).Value = dArr()
    [i1].Value = Timer() - Tmr
 End If
End Sub
 
Upvote 0
Từ bảng Data em muốn lọc thông số theo variable và unix timestamps và copy sang bảng logsheet qua nút run. Bác nào xem giúp em code sai ở đâu mà em thử ko đc ạ
 

File đính kèm

  • Thongso_Vanhanh.xlsm
    Thongso_Vanhanh.xlsm
    532.1 KB · Đọc: 11
  • z4532572386599_857bbe30058d533bf1e8d8f71d6e909f.jpg
    z4532572386599_857bbe30058d533bf1e8d8f71d6e909f.jpg
    69 KB · Đọc: 13
  • z4532572374889_e5dfc25304c20fe94eb36a0f15d2bd46.jpg
    z4532572374889_e5dfc25304c20fe94eb36a0f15d2bd46.jpg
    95.1 KB · Đọc: 14
Upvote 0

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

Back
Top Bottom