Hình như dùng VBA kết hợp công thức như thế là nhanh nhất rồi. Nên chuyển qua tìm theo mã chắc nhanh hơn 1 chút.NHG đã viết:Mình có một bảng chọn khách hàng nhưng với dữ liệu khoảng 6000 dòng thì nó chạy quá chậm, các bạn xem rôi cải tiến giúp mình cho nó chạy nhanh hơn nhé
NHG đã viết:Mình có một bảng chọn khách hàng nhưng với dữ liệu khoảng 6000 dòng thì nó chạy quá chậm, các bạn xem rôi cải tiến giúp mình cho nó chạy nhanh hơn nhé
Góp ý thêm với NHG và Mr OkebabMr Okebab đã viết:nh chỉ có ý kiến xíu (có thể chẳng liên quan đến câu hỏi) :
Mấy lời góp ý!
- Dùng Instr là đúng rồi, tuy nhiên thay vì Listbox, ta nên dùng Listview thì đẹp hơn nhiều
- Không nên dùng sự kiện TB_change mà nên dùng AfterUpdate, vì cứ thay đổi là . . . chạy trong khi nhập chưa xong
- Nên có 2 cột là MÃ và TÊN, từ đó sẽ có 2 hướng là tìm theo MÃ và theo TÊN. Vừa đẹp lại vừa chuyên nghiệp
- Sao lại cứ phải kết thúc từ hàng 2000 ?? Nên dùng Sheet3.Range("B65000").End(xlUp).Row để xác định dòng cuối cùng
- Danh mục không nên có cột STT, chẳng để làm gì mà lại gây nặng máy
- Sử dụng hàm TRIM trước khi tìm kiếm vừa có lợi lại vừa chẳng lợi, không có nó thì tốt hơn.
- ...................................
Thân!
Xin cảm ơn bác về sự chia sẻ này, để em thử xem sao. Tuy nhiên nếu có thể thì bác thử cho mấy dòng code VD được không ạ !!phamduylong đã viết:Góp ý thêm với NHG và Mr Okebab
Dùng Instr để so sánh chuỗi trong For Next buộc For Net phải phải duyệt toàn bộ cac dòng dù tìm không có. Nên thay bằng Find trong Do ... Loop, nó sẽ chỉ ngay đến ô có chuỗi cần tìm nếu có. Tìm không có thì kết thúc. Nếu có 3 ô có chuỗi cần tìm, nó chỉ lặp 3 lần.
phamduylong đã viết:Sự kiện TB_change làm chậm quá trình nhập, nhưng có cái ưu là người nhập không nhớ chính xác vẫn có thể tìm được nhờ xem vào list gõ tiếp ký tự kế. Còn AfterUpdate mà không nhớ chính xác thì chịu thua vì nó không hiện lên dòng nào gợi nhớ lại tên.
Không nên để cho nó tìm cả cột mã và tên, như vậy sẽ lâu hơn (em chưa hình dung hết cái lệnh Find của bác), ta có thể tạo ra 2 Textbox để làm việc này hoặc tạo 1 textbox và 1 Group Option Button gồm 2 nút để tìm theo mã hoặc theo tên.phamduylong đã viết:Không cần tách 2 ô MÃ, TÊN. TextBox MÃTÊN cho phép nhập mã hoặc tên (nhớ cái nào nhập cái đó), viết code cho nó tìm cả 2 cột mã và tên.
Bắt Find tìm cả 2 cột B,C. Tìm thấy đưa vào list. Nhập ký tự đầu tìm rất nhiều, từ ký tự 2, 3 số dòng trong list giảm đáng kể. Có thể thấy được tên cty hoặc mã muốn tìm.Mr Okebab đã viết:Xin cảm ơn bác về sự chia sẻ này, để em thử xem sao. Tuy nhiên nếu có thể thì bác thử cho mấy dòng code VD được không ạ !!
Private Sub TB_change()
Dim rng As String, rng1 As String, rng2 As String, strFind As String
Dim r As Integer, i As Integer
Sheets("DM.KH").Select
Chon.Default = True
Thoat.Cancel = True
LB.Clear
strFind = LCase(Trim(TB.Text))
rng1 = "$B$5"
rng = ""
On Error Resume Next
i = 0
Do
rng2 = Columns("B:C").Find(What:=strFind, After:=Range(rng1)).Address
If Err.Number > 0 Or rng2 = rng Then
Exit Do
End If
rng1 = rng2
If rng = "" Then rng = rng2
If r <> Range(rng2).Row Then
r = Range(rng2).Row
LB.AddItem Cells(r, 2)
LB.List(i, 1) = Cells(r, 3)
i = i + 1
End If
Loop
End Sub
phamduylong đã viết:Bắt Find tìm cả 2 cột B,C. Tìm thấy đưa vào list. Nhập ký tự đầu tìm rất nhiều, từ ký tự 2, 3 số dòng trong list giảm đáng kể. Có thể thấy được tên cty hoặc mã muốn tìm.
Mã:Private Sub TB_change() Dim rng As String, rng1 As String, rng2 As String, strFind As String Dim r As Integer, i As Integer Sheets("DM.KH").Select Chon.Default = True Thoat.Cancel = True LB.Clear strFind = LCase(Trim(TB.Text)) rng1 = "$B$5" rng = "" On Error Resume Next i = 0 Do rng2 = Columns("B:C").Find(What:=strFind, After:=Range(rng1)).Address If Err.Number > 0 Or rng2 = rng Then Exit Do End If rng1 = rng2 If rng = "" Then rng = rng2 If r <> Range(rng2).Row Then r = Range(rng2).Row LB.AddItem Cells(r, 2) LB.List(i, 1) = Cells(r, 3) i = i + 1 End If Loop End Sub
Đúng là khổ vì bảng mã. Từ 2005 nhà nước đã quy định font chuẩn nhưng không biết bao giờ mới chấm dứt nhiều bảng mã. Trường hợp này phải ngâm cứu tìm giải pháp.NHG đã viết:Cũng với bài toán như trên, nhưng trong lần này các bạn nghiên cứu trong trường hợp File dùng Font TCVN3 nhé, mình nhận thấy hầu hết các ký tự đều tìm đc nhưng riêng tên khách hàng nào có chứa vần “ả” thì sẽ không tìm đc (các bạn thử gõ tên Hải vào texbox mà xem, trong Listbox sẽ không hiện ra khách hàng đấy đâu), mới lại texbox không phân biệt đc “đ” và “Đ”
Không đc, mình muốn dùng bộ gõ TCVN3 cơ, vì tất cả các File + PM kế toán của mình đều dùng bộ gõ đấy, các bạn thử nghiên cứu xem có cách nào khác không?
Nếu vậy bạn không nên dùng Ucase nữa, vì Font TCVN là loại Font 1 byte, vì vậy dùng hàm này sẽ không chính xác.NHG đã viết:Texbox cũng là TCVN3, Listbox cũng là TCVN3 cơ mà các bạn, có liên quan gì đến Unicode đâu
Đúng là không liên quan, nhưng Unicode hiển thị đúng, còn TCVN3 có một số ký tự không hiện được. Ví dụ được >đợc. Không biết mìinh gõ đúng hay sai !NHG đã viết:Texbox cũng là TCVN3, Listbox cũng là TCVN3 cơ mà các bạn, có liên quan gì đến Unicode đâu
Private Sub UserForm_Initialize()
LB.ColumnCount = 4
LB.ColumnWidths = "80 pt;229.95 pt;120 pt;70 pt"
End Sub
Private Sub TB_change()
...........................................
If r <> Range(rng2).Row Then
r = Range(rng2).Row
LB.AddItem Cells(r, 2)
LB.List(i, 1) = Cells(r, 3)
LB.List(i, 2) = Cells(r, 4)
LB.List(i, 3) = Cells(r, 5)
........................................
End Sub
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 1
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 2