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:
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

  • LocDL65000_code.xlsb
    65.2 KB · Đọc: 56
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
    532.1 KB · Đọc: 6
  • z4532572386599_857bbe30058d533bf1e8d8f71d6e909f.jpg
    z4532572386599_857bbe30058d533bf1e8d8f71d6e909f.jpg
    69 KB · Đọc: 10
  • z4532572374889_e5dfc25304c20fe94eb36a0f15d2bd46.jpg
    z4532572374889_e5dfc25304c20fe94eb36a0f15d2bd46.jpg
    95.1 KB · Đọc: 11
Upvote 0
Web KT

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

Back
Top Bottom