[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

Chỗ nào Unload form thì đổi lại thành form Hide thôi
 
Upvote 0
Mình thử đổi thanh form. Hide rồi thì lần sau mở lên ngay lập tức nhưng không hiểu sao mình nhập text ở ô tìm kiếm form nó cứ lag lag.

Thử mấy cách rồi mà ko ăn thua, ko biết có phải do máy ko nữa.
 
Upvote 0
Kg phải do máy hay load form. Bạn debug vào txt change, các hàm Filterxxx gì đấy mà xem tại sao lag
 
Upvote 0
Bạn giúp mình với, mình ko rành lắm. Mình edit đc mấy code cơ bản thôi. Còn cái này bó tay á.
 
Upvote 0
Ráng đọc, debug, cố hiểu đi bạn, vậy mới lên tay nghề được
 
Upvote 0
Oài, mình dân tay ngang mà, khi nào cần cái gì mới lên gg tìm code thôi bạn. Được cái đọc hiểu tiếng anh sơ sơ nên edit đc mấy cái code đơn giản. Chứ ko phải dân chuyên hay muốn học vba nè bạn hjx.
 
Upvote 0
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.
Bạn xem thử
 

File đính kèm

Upvote 0
Lỗi đơ đơ, lag máy là do sub loc() viết và được call chưa tốt đó bạn à. Bạn cố động não viết lại nó, call nó hợp lý đi.
Gợi ý:
1.
Mã:
   dl = Sheet2.Range("A4:C1403").Value
   ReDim darr(1 To UBound(dl), 1 To 3)
Mỗi khi sub loc() đươc call, nó phải lấy lại dữ liệu từ sheet2. Nếu sau này sheet2 vùng dữ liệu này phình to ra nữa thì càng chậm.
2. Vẫn còn code Unload Me
 
Upvote 0
Lỗi đơ đơ, lag máy là do sub loc() viết và được call chưa tốt đó bạn à. Bạn cố động não viết lại nó, call nó hợp lý đi.
Gợi ý:
1.
Mã:
   dl = Sheet2.Range("A4:C1403").Value
   ReDim darr(1 To UBound(dl), 1 To 3)
Mỗi khi sub loc() đươc call, nó phải lấy lại dữ liệu từ sheet2. Nếu sau này sheet2 vùng dữ liệu này phình to ra nữa thì càng chậm.
2. Vẫn còn code Unload Me
Theo mình thấy nó bị chậm là do nó load từng phần tử trong mảng vào listbox, mình đã thay thế bằng cách add toàn bộ mảng vào listbox.list. Tốc độ mình nghĩ nó cũng có cải thiện hơn kha khá. Ko biết bạn còn cách nào tối ưu hơn nữa không, xin chia sẻ để mọi người cũng tham khảo. Cám ơn bạn.
 
Upvote 0
Hì hì, mình chỉ biết nói cái miệng thôi bạn, giờ lười code rồi ;)
 
Upvote 0
Mình rành về code thì nói như bạn đc, chứ mình biết mô tê gì đâu mà cố. Hjx
Lỗi đơ đơ, lag máy là do sub loc() viết và được call chưa tốt đó bạn à. Bạn cố động não viết lại nó, call nó hợp lý đi.
Gợi ý:
1.
Mã:
   dl = Sheet2.Range("A4:C1403").Value
   ReDim darr(1 To UBound(dl), 1 To 3)
Mỗi khi sub loc() đươc call, nó phải lấy lại dữ liệu từ sheet2. Nếu sau này sheet2 vùng dữ liệu này phình to ra nữa thì càng chậm.
2. Vẫn còn code Unload Me
 
Upvote 0
Đây sẽ là câu trả lời dành cho bạn:

Chỉ cần khởi tạo biến toàn cục ở Code Userform , và khởi tạo sớm khi UserForm load
với thủ tục UserForm_Initialize() thì các biến được khởi tạo sẽ tồn tại cho đến khi UserForm Unload

Lỗi ở code của bạn dẫn đến chậm:
1. Sự kiện LB_KeyUp và TB_Change chọn 1 trong 2, không thì phải tắt EventsEnable
2. Quá trình hiển thị ListBox ra Form không đồng nhất.
3. ActiveCell (mỗi lần gọi là một lần khởi tạo lại lệnh gọi) khác với With ActiveCell (một lần gọi duy nhất)

PHP:
Dim dl, udl&, udl2%, tdl(), temp1$, temp2$, Rng As Range
Option Compare Text
Private Sub CommandButton1_Click()
  With Rng
    .Offset(0, 1).Value = temp2
    .Value = temp1
  End With
  Unload Me
End Sub
Private Sub LB_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  With Rng
    .Offset(0, 1).Value = LB.List(LB.ListIndex, 1)
    .Value =LB.List(LB.ListIndex, 0)
  End With
  Unload Me
End Sub
Private Sub TB_Change()
  Call GetData(TB.Value)
End Sub

Private Sub LB_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  AddTemp
End Sub

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

Private Sub AddTemp()
  temp1 = LB.List(LB.ListIndex, 0)
  temp2 = LB.List(LB.ListIndex, 1)
End Sub

Private Sub GetData(FindText$)
  Dim i&, k&, j%, tmp()
  DM.LB.Clear
  For i = 1 To udl
    If dl(i, 1) <> "" Then
      If dl(i, 1) Like "*" & FindText & "*" _
      Or dl(i, 2) Like "*" & FindText & "*" Then
        k = k + 1
        For j = 1 To udl2
          tdl(k, j) = dl(i, j)
  Next: End If :End If: Next
  If k > 0 Then GoSub MakeList
  Exit Sub
MakeList:
  ReDim tmp(1 To k, 1 To udl2)
  For i = 1 To k
    For j = 1 To udl2
      tmp(i, j) = tdl(i, j)
  Next j , i
  DM.LB.List = tmp
Return
End Sub
 
Upvote 0
Mình fix giùm bạn Zandy đây, cũng tàm tạm, ương ương à, không ưng ý lắm, bạn Zandy test lại, xem nó còn lag nữa hay không
Ghét cái redim của ông nội VB/VBA này quá, không redim array nhỏ hơn khi mãng nhiều chiều.
Nhớ hồi còn code, có viết 1 dll bằng Visual C++, support các hàm UDF cho VB/VBA, trong đó nhớ có hàm redim smaller cho array của VB/VBA
 

File đính kèm

Upvote 0
Cảm ơn mọi người rất nhiều. Công việc bận quá nên chỉ lên đây rep comt của mọi người thôi, chưa có time để test code của mọi người nữa.
Khi nào check xong mình sẽ review lại code của từng người luôn.
 
Upvote 0
Cái này có nhược điểm là khi db_click ở ô nào thì sau khi chọn nó sẽ trả giá trị bắt đầu từ ô đó. Nên sửa lại theo hướng mình db_click vào bất cứ chỗ nào trên bảng là nó hiện tìm kiếm, còn khi chọn xong giá trị thì kết quả trả về bắt đầu từ cột A mới hợp lý. Vì các cột từ C trở đi tôi nghĩ bạn còn có nhiều thông tin cần điền

Mình góp ý chút như vậy. 219390
 
Upvote 0
Mình chỉnh lại "chút chút" theo yêu cầu bạn DarKLov3, bạn down lại, test thử xem sao. Có fix 1 bug nhỏ và 1 vài optmize nhỏ
 

File đính kèm

Lần chỉnh sửa cuối:
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ì.
Mình chỉnh lại "chút chút" theo yêu cầu bạn DarKLov3, bạn down lại, test thử xem sao. Có fix 1 bug nhỏ và 1 vài optmize nhỏ
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:

Đây sẽ là câu trả lời dành cho bạn:

Chỉ cần khởi tạo biến toàn cục ở Code Userform , và khởi tạo sớm khi UserForm load
với thủ tục UserForm_Initialize() thì các biến được khởi tạo sẽ tồn tại cho đến khi UserForm Unload

Lỗi ở code của bạn dẫn đến chậm:
1. Sự kiện LB_KeyUp và TB_Change chọn 1 trong 2, không thì phải tắt EventsEnable
2. Quá trình hiển thị ListBox ra Form không đồng nhất.
3. ActiveCell (mỗi lần gọi là một lần khởi tạo lại lệnh gọi) khác với With ActiveCell (một lần gọi duy nhất)

PHP:
Dim dl, udl&, udl2%, tdl(), temp1$, temp2$, Rng As Range
Option Compare Text
Private Sub CommandButton1_Click()
  With Rng
    .Offset(0, 1).Value = temp2
    .Value = temp1
  End With
  Unload Me
End Sub
Private Sub LB_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
  With Rng
    .Offset(0, 1).Value = LB.List(LB.ListIndex, 1)
    .Value =LB.List(LB.ListIndex, 0)
  End With
  Unload Me
End Sub
Private Sub TB_Change()
  Call GetData(TB.Value)
End Sub

Private Sub LB_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  AddTemp
End Sub

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

Private Sub AddTemp()
  temp1 = LB.List(LB.ListIndex, 0)
  temp2 = LB.List(LB.ListIndex, 1)
End Sub

Private Sub GetData(FindText$)
  Dim i&, k&, j%, tmp()
  DM.LB.Clear
  For i = 1 To udl
    If dl(i, 1) <> "" Then
      If dl(i, 1) Like "*" & FindText & "*" _
      Or dl(i, 2) Like "*" & FindText & "*" Then
        k = k + 1
        For j = 1 To udl2
          tdl(k, j) = dl(i, j)
  Next: End If :End If: Next
  If k > 0 Then GoSub MakeList
  Exit Sub
MakeList:
  ReDim tmp(1 To k, 1 To udl2)
  For i = 1 To k
    For j = 1 To udl2
      tmp(i, j) = tdl(i, j)
  Next j , i
  DM.LB.List = tmp
Return
End Sub
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!
 
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
 
Upvote 0
Web KT

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

Back
Top Bottom