Tăng tốc cho Text box trong Form khi nhập trong ô tìm kiếm!

Liên hệ QC

MinhCong

Thành viên gắn bó
Tham gia
28/5/09
Bài viết
1,645
Được thích
1,806
Nghề nghiệp
Xây dựng Cầu đường
Khi mở Form hỗ trợ nhập liệu lên, trong ô Tìm theo tên, Tôi muốn nhập chữ "Đ" hoặc "Đào" thì nó chờ hơi lâu và màn hình nháy nháy, các Anh, Chị có hướng nào giúp cho nó bớt nháy và tìm kiếm nhanh hơn không? Đoạn code của nó như sau:
Mã:
Private Sub TextBox1_Change()
  Dim Clls As Range, Temp As Variant, i As Long
  Application.ScreenUpdating = False
  ListBox1.RowSource = ""
  With Sheets("Capnhat").Range(Sheets("Capnhat").[B3], Sheets("Capnhat").[D65536].End(xlUp))
    Temp = .Value
    .Sort .Cells(2, 2), 1, Header:=xlGuess
    .AutoFilter 2, IIf(Len(Trim(TextBox1.Value)) = 0, "=", TextBox1.Value & "*")
    ListBox1.Clear
    For Each Clls In .Offset(1).Resize(, 1).SpecialCells(12)
      ListBox1.AddItem (Clls)
      ListBox1.List(i, 1) = Clls(, 2)
      ListBox1.List(i, 2) = Clls(, 3)
      Cells(ActiveCell.Row, 2) = "=COUNTIF(R5C4:RC[2],RC[2])&RC[1]"
      Cells(ActiveCell.Row, 11) = "=RC[-7]&RC[-3]"
      i = i + 1
    Next
    .AutoFilter
    .Value = Temp
  End With
  Application.ScreenUpdating = True
End Sub
 

File đính kèm

Khi mở Form hỗ trợ nhập liệu lên, trong ô Tìm theo tên, Tôi muốn nhập chữ "Đ" hoặc "Đào" thì nó chờ hơi lâu và màn hình nháy nháy, các Anh, Chị có hướng nào giúp cho nó bớt nháy và tìm kiếm nhanh hơn không? Đoạn code của nó như sau:
Mã:
Private Sub TextBox1_Change()
Dim Clls As Range, Temp As Variant, i As Long
Application.ScreenUpdating = False
ListBox1.RowSource = ""
With Sheets("Capnhat").Range(Sheets("Capnhat").[B3], Sheets("Capnhat").[D65536].End(xlUp))
Temp = .Value
.Sort .Cells(2, 2), 1, Header:=xlGuess
.AutoFilter 2, IIf(Len(Trim(TextBox1.Value)) = 0, "=", TextBox1.Value & "*")
ListBox1.Clear
For Each Clls In .Offset(1).Resize(, 1).SpecialCells(12)
ListBox1.AddItem (Clls)
ListBox1.List(i, 1) = Clls(, 2)
ListBox1.List(i, 2) = Clls(, 3)
Cells(ActiveCell.Row, 2) = "=COUNTIF(R5C4:RC[2],RC[2])&RC[1]"
Cells(ActiveCell.Row, 11) = "=RC[-7]&RC[-3]"
i = i + 1
Next
.AutoFilter
.Value = Temp
End With
Application.ScreenUpdating = True
End Sub


Tôi học và copy trên GPE, và làm ra cái file sau đây; Bạn tải về tham khảo thử.
 

File đính kèm

Upvote 0
Cảm ơn Anh đã chia sẻ file rất hay, nhưng ý của Em là muốn khi nhập vào ô text box trong Form hỗ trợ nhập liệu nó sẽ lọc ra toàn bộ những tên bắt đầu bằng chữ Mình vừa nhập, VD: Nhập chữ "Đ" thì sẽ sort ra 1 list có tên chữ "Đ" bắt đầu, ta chọn tên hạng mục sẽ tự động cập nhật vào Nhật ký. Nhờ Anh xem có hướng giúp tăng tốc độ tìm kiếm lên với File Em gởi lên được không?
 
Upvote 0
Khi mở Form hỗ trợ nhập liệu lên, trong ô Tìm theo tên, Tôi muốn nhập chữ "Đ" hoặc "Đào" thì nó chờ hơi lâu và màn hình nháy nháy, các Anh, Chị có hướng nào giúp cho nó bớt nháy và tìm kiếm nhanh hơn không? Đoạn code của nó như sau:
Cái vụ này hình như dùng afterupdate sẽ tiện hơn.
Theo mình thì nên dùng AdFi sẽ vàn gán sang vùng tmp sẽ tốt hơn AutoFilter.
Bạn tham khảo bài của anh Sealand về listview có ứng dụng rất hay về vấn đề này.
Còn tôi thì dùng thêm 1 nút tìm, khi nhập vài ký tự đại diện, then nhấn Tìm.
 
Upvote 0
Cái vụ này hình như dùng afterupdate sẽ tiện hơn.
Theo mình thì nên dùng AdFi sẽ vàn gán sang vùng tmp sẽ tốt hơn AutoFilter.
Bạn tham khảo bài của anh Sealand về listview có ứng dụng rất hay về vấn đề này.
Còn tôi thì dùng thêm 1 nút tìm, khi nhập vài ký tự đại diện, then nhấn Tìm.
Bạn có thể giúp Mình được không? Đoạn code trên Mình chép của Anh NDU về sử dụng, chứ code Mình chưa rành lắm.
 
Upvote 0
Bạn có thể giúp Mình được không? Đoạn code trên Mình chép của Anh NDU về sử dụng, chứ code Mình chưa rành lắm.
Bạn chờ, mình sẽ làm nhé, dùng find thì chính xác nhưng chậm. Sao bạn không dùng theo mã hiệu, như thế sẽ hay hơn. Tìm theo tên thì thông nhất tìm từ từ bên trái nhé.
 
Upvote 0
Bạn chờ, mình sẽ làm nhé, dùng find thì chính xác nhưng chậm. Sao bạn không dùng theo mã hiệu, như thế sẽ hay hơn. Tìm theo tên thì thông nhất tìm từ từ bên trái nhé.
Mã hiệu không nhớ nỗi Bạn à. Trong file Mình có ẩn 1 sheet Capnhat. Bạn tìm giúp Mình theo cột C của sheet Capnhat nhé!
 
Upvote 0
Mã hiệu không nhớ nỗi Bạn à. Trong file Mình có ẩn 1 sheet Capnhat. Bạn tìm giúp Mình theo cột C của sheet Capnhat nhé!
Bạn sửa lại phần Double Click nhé, thấy cột D sh NhatKy merge nên làm biếng. Không biết có nhanh hơn không. Bạn xem và kiểm lại nhé. Mấy cái vụ address và Intersect này mình ít dùng nên không thạo.
 

File đính kèm

Upvote 0
Mình tham gia 1 chút, vấn đề này dùng Filter là hay hơn cả. Với dữ liệu lớn mình cho rằng tốc độ tối ưu nhất. Khi dùng Filter còn tuỳ biến cho người dùng tìm theo cột nào.
 
Upvote 0
Mình tham gia 1 chút, vấn đề này dùng Filter là hay hơn cả. Với dữ liệu lớn mình cho rằng tốc độ tối ưu nhất. Khi dùng Filter còn tuỳ biến cho người dùng tìm theo cột nào.
Anh có thể viết cho đoạn code được không?

(Cách của ThuNghi cũng tạm ổn rồi, để Mình xem lại sao)
 
Upvote 0
Mình dùng code để lọc hạn chế số dòng còn lại . Bạn nhập thử 1 từ cần tìm xem
 

File đính kèm

Upvote 0
Mình muốn hỏi thêm 1 chút : Tại sao từ cọt D đến cột G lại Merger?

(Nhờ Mod xoá giùm bài này)
 
Lần chỉnh sửa cuối:
Upvote 0
Mình xin phép dùng File của Thu Nghi, mình hoàn thiện thêm các chức năng.
Riêng phần nhập thì mình đoán vậy chứ chả hiểu bạn định làm thế nào cả
 

File đính kèm

Upvote 0
Mình muốn hỏi thêm 1 chút : Tại sao từ cột D đến cột G lại Merger?
Merger là để phòng khi hạng mục công việc nằm vượt chiều rộng từ cột D đến G (Do có in bảng ra)

Bài số #11 của Anh đúng ý Em rồi, tuy nhiên (đơn vị lại điền vào cột Hạng mục công việc, còn Hạng mục công việc lại điền vào cột Mã hiệu).

Anh cho Em hỏi thêm, 2 đoạn code dưới muốn khi chạy nó chỉ ra kết quả thôi, không công thức trong bảng excel thì sửa lại như thế nào?
Mã:
Cells(ActiveCell.Row, 2) = "=COUNTIF(R5C4:RC[2],RC[2])&RC[1]"
    Cells(ActiveCell.Row, 11) = "=RC[-7]&RC[-3]"
 
Upvote 0
Bạn cứ nói rõ bạn định làm thế nào thì dễ tìm phương án giải quyết hơn là gò cố định vào công thức đó.
Riêng 2 công thức bạn thêm 2 dòng vào cuối dạng:
dich=dich.Value
 
Upvote 0
Bạn cứ nói rõ bạn định làm thế nào thì dễ tìm phương án giải quyết hơn là gò cố định vào công thức đó.
Riêng 2 công thức bạn thêm 2 dòng vào cuối dạng:
dich=dich.Value
Em ghi rõ trong File rồi, Anh xem giúp Em nhé!
 

File đính kèm

Upvote 0
Đây là code nhập dữ liệu

Mã:
Sub OK()
If ActiveSheet.CodeName <> "Sheet3" Then Exit Sub
With dich
.Offset(, 1) = Me.ListBox1.Column(0)
.Offset(, 2) = Me.ListBox1
.Offset(, 7) = Me.ListBox1.Column(2)
.Formula = "=COUNTIF(R5C4:RC[2],RC[2])&RC[1]"
.Offset(, 9).Formula = "=RC[-7]&RC[-3]"
.Offset(, -1).Formula = "=IF(len(RC[3])>0,MAX(R5C1:R[-1]C)+1,1)"
.Value = .Value
Set dich = .Offset(1)
End With
End Sub

Riêng cột 1 và 11 phải để công thức vì ô nguồn chưa cập nhật hoặc thay đổi.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom