[HELP] Lưu tạm thông tin Form đã load cho lần mở sau?

Liên hệ QC

Congtunho

Thành viên mới
Tham gia
16/12/17
Bài viết
48
Được thích
6
Giới tính
Nam
Chào cả nhà!

Em có tìm được trên mạng 1 file có form tìm kiếm.
Mọi thứ Ok nếu như data tìm kiếm ít. Nhưng nếu như data lớn vài nghìn dòng thì khi form load sẽ mất vài giây.
Không biết là có cách nào để form load data xong sẽ lưu tạm vào bộ nhớ để khi đóng form lần sau mở lại sẽ nhanh hơn không ạ?
Em có đính kèm file ở dưới ạ.
Nhấp đúp hoặc chuột phải ở sheet Nhan Ma sẽ hiện form lên.

Mong cả nhà hỗ trợ em với.
 

File đính kèm

Mình nghĩ data mà lên hàng triệu dòng thì chắc phải chục năm nữa á bác. Mà chục năm nữa thì mình ko cần xài file này nữa rồi.
À, file của bạn có 1 nhược điểm nhỏ là khi data có thay đổi thì form nó ko load lại, phải lưu file đóng đi mở lại thì form mới load data mới.
 
Upvote 0
Mình tính trước các câu hỏi của bạn rồi
Nếu mình sai thì bạn sửa, modidy code mình ra sao ?
 
Upvote 0
Modify được thì nói làm chi nữa bạn hehe mình đã nói là code của bạn cao siu quá. Đọc có hiểu gì mấy đâu. Nhưng mà để mình mò, dù sao vẫn cảm ơn bạn rất nhiều. Nhiệt tình quá mức.
 
Upvote 0
File của bạn mình thử cho data lên 20k dòng thấy vẫn load nhanh. Hay quá bạn ạ! Chỉ có điều mình ko rành code nên không biết được bạn tối ưu nó kiểu gì.

File của bạn tốc độc load ngang với bạn khanhhero, nhưng mà nhìn vào code thấy bạn chỉnh sửa hầu như 80% code luôn, bỏ luôn cả modul có sẵn, chèn vào trong listbox luôn. Không nghĩ bạn lại bỏ nhiều thời gian như vậy để edit lại file của mình. Cảm ơn bạn rất nhiều.
Đọc 2 file này mình thấy mỗi cái có 1 cái hay riêng dù không hiểu nhiều lắm, mình nghĩ là có thể gộp lại cái hay của 2 file này.

Cảm ơn 2 bạn rất nhiều! Công việc của mình cần dùng cái này nhiều lắm luôn :)
Bài đã được tự động gộp:


Mình không hiểu code lắm nên mình chỉ xài file mới so sánh được tốc độ thôi.
Cảm ơn bạn đã góp ý nha!

Không biết nếu mình học code thì khoảng bao lâu có thể master đc nhỉ? Tự dưng thấy khoái code ghê gớm!
2 phút cho việc đọc code, 5 phút cho việc code và debug
 
Upvote 0
Cho mình hỏi thêm 1 xíu nữa nha!
Làm sao để khi form được load lên thì con trỏ chuột tự động nhấp vào ô tìm kiếm vậy?
Bài đã được tự động gộp:

2 phút cho việc đọc code, 5 phút cho việc code và debug
Haiz đối với cao thủ thôi bạn, không rành code như mình thì đó là điểu ko tưởng :)
 
Upvote 0
Bạn lên vài chục ngàn dòng, hay triệu dòng thì mới thấy được.
Chỉ sợ listbox của Msform chịu kg nổi thôi
Triệu dòng là nó hết luôn cái file excel rồi anh ơi :D
Bài đã được tự động gộp:

Cho mình hỏi thêm 1 xíu nữa nha!
Làm sao để khi form được load lên thì con trỏ chuột tự động nhấp vào ô tìm kiếm vậy?

Dùng sự kiện Userform_Initialize
 
Upvote 0
Chỉ mình rõ luôn đi bạn hehe mình biết dùng như nào đâu.
ĐÂY LÀ CODE HIỆN CÓ
Private Sub UserForm_Initialize()
dl = ThisWorkbook.Worksheets("DMDVKH").[mm].Value
udl = UBound(dl): udl2 = UBound(dl, 2)
ReDim tdl(1 To udl, 1 To udl2)
DM.LB.List = dl
TB.Value = ""
Set Rng = selection(1, 1)
End Sub

SỬA LẠI THÀNH:
Private Sub UserForm_Initialize()
dl = ThisWorkbook.Worksheets("DMDVKH").[mm].Value
udl = UBound(dl): udl2 = UBound(dl, 2)
ReDim tdl(1 To udl, 1 To udl2)
DM.LB.List = dl
TB.Value = ""
TB.setfocus
Set Rng = selection(1, 1)
End Sub
 
Upvote 0
Vậy là chỉ cần thêm dòng
TB.setfocus là xong à. Hay quá bạn.
 
Upvote 0
Mình thử với 10,000 dòng, nó bắt đầu lag rồi. Đã thử optimize hàm FilterData dùng hàm InStr nhưng kg ăn thua
Thử dùng hàm API của shlwapi.dll với 66,000 dòng thử
 
Upvote 0
Với mình, tốc độ như này là đủ dùng rồi bạn. Ko cần nhanh hơn nữa. Vì data của mình chỉ gần 20k dòng thôi. Dự kiến 5 năm nữa lên khoảng 30k dòng.
 
Upvote 0
Vậy là máy bạn nhanh đó, chứ cái PC mình già nua lắm, mười mấy năm rồi.
Mình hay dùng máy này để remote debug với WinDbg và test tốc độ chương trình
Đã thử lên 70,000 dòng, tốc độ cũng không ưng ý lắm, vẫn còn hơi lag
Do giới hạn của VBA khi copy array = vòng For, không dùng memcpy 1 block như C được.

Edit: Thua, hết cách optimize rồi, không tìm ra hàm nào nhanh hơn hàm StrStrIW nữa.
Chỉ còn cách viết dll = C, viết hàm fast strstr = C hay assembly rồi call từ VBA thôi.

Nội dòng LB.Clear thôi, với dữ liệu lớn nó cũng đã chậm, giựt.
Bản này coi như bảng final, tốc độ tạm chấp nhận được với data lớn.
Test trên máy cực chậm :)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Máy 10 mấy năm mà chạy đc cỡ đó thì cũng quá trâu bò rồi bạn. Lap mình mới mua đc 2 năm, core i5 đời thứ 6, mà xài win 10 nó chạy cũng hơi chậm. Ko mượt như win 7 xưa. Có điều kiện nâng cấp ssd thì may ra.

Điều mình cần mọi người đã support nhiệt tình xong rồi. Rất cảm ơn cả nhà. Khi nào có gì hot mình lại lên hỏi tiếp. Hi vọng bạn sức khỏe dồi dào để support nhiều người như mình.
 
Upvote 0
Mình mới update lại file, các bạn down về test hộ, xem tốc độ có cải thiện chút nào không, chứ mình thì hết cách optimize rồi :)
 
Upvote 0
Mình mới update lại file, các bạn down về test hộ, xem tốc độ có cải thiện chút nào không, chứ mình thì hết cách optimize rồi :)
Theo em thấy nếu muốn nó nhanh thì nên dùng sự kiện keydown bắt enter key, để khi kết thúc nhập liệu tìm kiếm bằng phím enter thì nó mới chạy vòng lặp, như vậy nó sẽ nhanh hơn rất nhiều. Bắt sự kiện change này gõ một ký tự nó lặp một lần, nên tất nhiên là phải lâu rồi. Còn về bản chất vẫn phải truyền vào mảng rồi đưa vào list.
 
Upvote 0
Hì hì, cách bạn thì chỉ là đánh lừa cảm giác của user thôi, chứ bản thân cái hàm lọc đó nó có nhanh hơn đâu. Cuối cùng cũng phải qua hàm lọc
Còn mình thì tập trung vào cải tiến tốc độ cũa hàm lọc.
Trong hàm FilterData của mình, thay vì dùng LB.Clear, mình set ListIndex = -1 và List assign thôi, đã tránh được listbox giựt, đơ 1 cái khi clear
Dùng hàm StrStrIW Unicode thay cho hàm Ansi StrStrIA để tránh được convert dư từ Unicode qua Ansi khi search. Hàm này nhanh hơn nhiều so với Like hay InStr của VB/VBA
Tách biểu thức Or ra thành 2 If để tránh tính toán 2 lần StrStrI trên 1 if.
....
 
Upvote 0
Bài viết tới nay vẫn chưa xong? Có vẻ khó khăn về giải thuật

Tôi nghĩ nên thêm 1 vài kỹ thuật tối ưu hơn 1 tí:
1. Thêm ràng buộc độ dài chuỗi phải lơn hơn bằng (x) mới thực hiện Search (khi data quá lớn).
2. Sau khi text change thì lưu lại mảng đã duyệt để tiếp tục duyệt cho ký tự tiếp theo, length text mà nhỏ hơn (x) thì trở lại từ đầu
PHP:
If Len(Text.Value) < x Then
    Exit Sub
ElseIf Len(Text.Value) = x Then
    Arr = FullArr
Else
    If Len(Text.Value) < LastLenX Then
        Arr = SmallArr2
    Else
        Arr = SmallArr1
    End if
End If

'SmallArr2 Sẽ lưu lại Arr'
'SmallArr1 Sẽ lưu lại Arr đã duyệt'
 
Upvote 0
Hì hì, vẫn sai bạn ơi.
1. Không thể bắt buộc user phải search vơi 1 len yêu cầu
2. Nếu kiểm tra len = x thì buồn buồn tui select 1 vài ký tự nào đó, rồi Ctrl-V chuổi khác vào thì sao, len vẫn không đổi.
3. Đang search 4, 5 ký tự, buồn buồn tui Ctrl-A, delete thì sao ? Hay Ctrl-A, Ctrl-V chuỗi khác ?
 
Upvote 0
Hì hì, vẫn sai bạn ơi.
1. Không thể bắt buộc user phải search vơi 1 len yêu cầu
2. Nếu kiểm tra len = x thì buồn buồn tui select 1 vài ký tự nào đó, rồi Ctrl-V chuổi khác vào thì sao, len vẫn không đổi.
3. Đang search 4, 5 ký tự, buồn buồn tui Ctrl-A, delete thì sao ?
Bác cứ đưa ra các điều kiện mới, thì ta thêm ràng buộc mới, các giải thuật mới. Bác định viết cả một ứng dụng hay giúp đỡ cơ bản cho bạn ấy hay sao mà sung sức thế.
 
Upvote 0
Hì hì, tính tui code xưa giờ cầu toàn, đã không làm thì thôi, làm thì phải tới nơi tới chốn, hết cách mới thôi.
Chứ dỡ dỡ ương, code bậy bạ cho chạy được thôi thì tôi tối kỵ.
File tồn kho của tôi gần 300 000 tấm đá, mỗi tấm 1 mã, còn chạy phà phà trên cái máy cùi này, 70 000 dòng thì ăn thua gì
 
Upvote 0
Web KT

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

Back
Top Bottom