Giúp code lọc dữ liệu siêu tốc khoảng 10.000 dòng (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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
Chào cả nhà GPE!
Em đang cần làm 1 đoạn code để lọc dữ liệu khoảng 10.000 dòng trở xuống ( code khi đánh vài ký tự liên quan trong Textbox thì Listbox sẽ hiện ra kết quả ( Trong Form)). Hiện em đang dùng code cũng ở trên diễn đàn
Nhưng nó xứ lý chỉ được 500 dòng là OK mà 10.000 dòng thì như rùa bò luôn. Mong các cao thủ giúp em. XIn chân thành cảm ơn !



Mã:
Sub locnhapkhonewa()
 On Error Resume Next
Dim dl(), i As Long
dl = Sheets("khachhang").Range("K4:K5003").Value 'lay nguon hang hoa
THANHTOAN.ListBox1.Clear
For i = 1 To UBound(dl)
   If dl(i, 1) <> "" Then
      If TV(UCase(dl(i, 1))) Like "*" & TV(UCase(THANHTOAN.TextBox1.Value)) & "*" Then ' dieu kien loc Bo dau tieng viet Chu hoa chu thuong
         THANHTOAN.ListBox1.AddItem dl(i, 1)
      End If
   End If
Next
End Sub



Function TV(ByVal Text As String) As String ' bo dau tieng viet
  Dim CharCode, ResText As String, i As Long, tmp As String
  On Error Resume Next
  tmp = Text
  CharCode = Array(ChrW(7855), ChrW(7857), ChrW(7859), ChrW(7861), ChrW(7863), ChrW(7845), ChrW(7847), _
                   ChrW(7849), ChrW(7851), ChrW(7853), ChrW(225), ChrW(224), ChrW(7843), ChrW(227), ChrW(7841), _
                   ChrW(259), ChrW(226), ChrW(273), ChrW(7871), ChrW(7873), ChrW(7875), ChrW(7877), ChrW(7879), _
                   ChrW(233), ChrW(232), ChrW(7867), ChrW(7869), ChrW(7865), ChrW(234), ChrW(237), ChrW(236), _
                   ChrW(7881), ChrW(297), ChrW(7883), ChrW(7889), ChrW(7891), ChrW(7893), ChrW(7895), ChrW(7897), _
                   ChrW(7899), ChrW(7901), ChrW(7903), ChrW(7905), ChrW(7907), ChrW(243), ChrW(242), ChrW(7887), _
                   ChrW(245), ChrW(7885), ChrW(244), ChrW(417), ChrW(7913), ChrW(7915), ChrW(7917), ChrW(7919), _
                   ChrW(7921), ChrW(250), ChrW(249), ChrW(7911), ChrW(361), ChrW(7909), ChrW(432), ChrW(253), _
                   ChrW(7923), ChrW(7927), ChrW(7929), ChrW(7925))
  ResText = "aaaaaaaaaaaaaaaaadeeeeeeeeeeeiiiiiooooooooooooooooouuuuuuuuuuuyyyyy"
  For i = 0 To UBound(CharCode)
    tmp = Replace(tmp, CharCode(i), Mid(ResText, i + 1, 1))
    tmp = Replace(tmp, UCase(CharCode(i)), UCase(Mid(ResText, i + 1, 1)))
  Next
  TV = tmp
End Function



Private Sub TextBox1_Change()
locnhapkhonewa
End Sub
 
Mình nhập từ 'Chá' thì hiện ra danh sách liệt kê;
Nhưng nhập nối tiếp thêm chữ 'o' thì danh sách trống trơn, là sao ta?
Rõ ràng trước đó trong danh sách hiển thị rất nhiều dòng có từ 'cháo' mà!
Do thiếu dòng lệnh bỏ dấu trong sub
tmp = Up_TV_KhongDau(tmp)
Mã:
Private Sub Add_Data()
  Dim dArr As Variant, tmp As String, key As String, i As Long, j As Integer
  i = Sheets("Sheet1").Range("B65500").End(xlUp).Row
  dArr = Sheets("Sheet1").Range("B4:B" & i).Value
  ReDim Sarr(1 To UBound(dArr), 1 To 2)
  For i = 1 To UBound(dArr)
    tmp = UCase(dArr(i, 1))
    If tmp <> "" Then
      tmp = Up_TV_KhongDau(tmp)
      For j = 1 To Len(tmp)
        key = Mid(tmp, i, 1)
        If dic.Exists(key) Then Mid(tmp, i, 1) = dic.Item(key)
      Next
      Sarr(i, 1) = tmp
      Sarr(i, 2) = dArr(i, 1)
    End If
  Next i
End Sub
 

File đính kèm

Upvote 0
Mình cho là vầy:
Khi nhập vô TextBox từ 'Chá', VBE vẫn đi tìm các từ trong dòng có "cha" & là có tìm thấy;
Nhưng từ 'Cháo' mà ta nhập vô TextBox nó đã bị xóa dấu sắc đi rồi; Nó đi tìm từ "Chao"; Bạn nào thữ thêm từ 'Chao' trong cột dữ liệu xem sao?

Mình thử như thế này:
Nhập chữ 'Cháy' vô 1 ô trang tính & chép lên TextBox, thì nó tìm chữ 'chay' & cả chữ 'cháy'
 
Lần chỉnh sửa cuối:
Upvote 0
Những từ vu vơ không có mục đích, không có ý nghĩa gì thì tìm làm chi vậy?
E góp ý thôi, còn a cho rằng từ áo , ân mà vu vơ thì e chịu rồi. E cho rằng code cần phải chính xác trong đa số trường hợp rồi mới tính đến nhanh. E góp ý chứ ko tranh luận a ạ vì dữ liệu đâu chỉ như thế này, chẳng lẽ ko có người nào tên ân, cửa hàng may mặc nào chẳng có áo và vô vàn trường hợp khác
 
Upvote 0
Cũng chưa rõ tác giả bài đăng có trường/cột cần tìm thuộc dữ liệu loại gì?
Nữa giống tên người, vì có năm sinh
Nhưng nữa khác lại đề là tên hàng hóa

Mô fật, nếu đó là cột/trường họ tên thì mình có cách khác chắc chắn hơn để tìm.
 
Upvote 0
Do thiếu dòng lệnh bỏ dấu trong sub
tmp = Up_TV_KhongDau(tmp)
Mã:
Private Sub Add_Data()
  Dim dArr As Variant, tmp As String, key As String, i As Long, j As Integer
  i = Sheets("Sheet1").Range("B65500").End(xlUp).Row
  dArr = Sheets("Sheet1").Range("B4:B" & i).Value
  ReDim Sarr(1 To UBound(dArr), 1 To 2)
  For i = 1 To UBound(dArr)
    tmp = UCase(dArr(i, 1))
    If tmp <> "" Then
      tmp = Up_TV_KhongDau(tmp)
      For j = 1 To Len(tmp)
        key = Mid(tmp, i, 1)
        If dic.Exists(key) Then Mid(tmp, i, 1) = dic.Item(key)
      Next
      Sarr(i, 1) = tmp
      Sarr(i, 2) = dArr(i, 1)
    End If
  Next i
End Sub
Rất nhanh bác cho hỏi muốn hiển thị thêm cột trong listbox để lấy dữ liệu column trong đó,Vậy phải lam sao bác ?
 
Upvote 0
Ì hí.Dữ liệu của em nhỏ ( khoảng 4 con số 9) nên chung thành với Filter2DArray thôi :D:D:D
 
Upvote 0
Mình cho là vầy:
Khi nhập vô TextBox từ 'Chá', VBE vẫn đi tìm các từ trong dòng có "cha" & là có tìm thấy;
Nhưng từ 'Cháo' mà ta nhập vô TextBox nó đã bị xóa dấu sắc đi rồi; Nó đi tìm từ "Chao"; Bạn nào thữ thêm từ 'Chao' trong cột dữ liệu xem sao?

Mình thử như thế này:
Nhập chữ 'Cháy' vô 1 ô trang tính & chép lên TextBox, thì nó tìm chữ 'chay' & cả chữ 'cháy'
Bài nầy yêu cầu tìm từ gần đúng không xét dấu tiếng Việt, ví dụ "ăn", "ân", "ạn" đều chuyển về "an" và tìm theo từ "an", nên từ gỏ vào Text box " "Chao", "Cháo" code xem là giống nhau

E góp ý thôi, còn a cho rằng từ áo , ân mà vu vơ thì e chịu rồi. E cho rằng code cần phải chính xác trong đa số trường hợp rồi mới tính đến nhanh. E góp ý chứ ko tranh luận a ạ vì dữ liệu đâu chỉ như thế này, chẳng lẽ ko có người nào tên ân, cửa hàng may mặc nào chẳng có áo và vô vàn trường hợp khác
Do đã bỏ dấu tiếng Việt nên khi chỉ gỏ vài ký tự của 1 từ, code sẽ tìm thấy những dòng không có liên quan gì đến mục đích tìm kiếm, nhưng khi số chữ nhiều thì code sẽ nhận dạng và loại bỏ những dòng không liên quan
 
Upvote 0
Rất nhanh bác cho hỏi muốn hiển thị thêm cột trong listbox để lấy dữ liệu column trong đó,Vậy phải lam sao bác ?
Số cột trong Listbox lệ thuộc vào số cột của mảng Arr, hơn 2 cột phải viết lại code, gởi file dữ liệu giả định với các cột cùng yêu cầu sát thực tế viết mới hợp ý được
 
Upvote 0
Số cột trong Listbox lệ thuộc vào số cột của mảng Arr, hơn 2 cột phải viết lại code, gởi file dữ liệu giả định với các cột cùng yêu cầu sát thực tế viết mới hợp ý được
Trong file mình có ghi tiêu đề nhờ bác giúp
 

File đính kèm

Upvote 0
Trong file mình có ghi tiêu đề nhờ bác giúp
Cần làm rỏ thêm:
_ Có loại bỏ dấu tiếng Việt Không
_ Tìm theo 2 cột, điều kiện là cả 2 cùng thỏa hay 1 trong 2
- Số ký tự trung bình 1 ô của từng cột tìm dữ liệu là bao nhiêu ký tự kể cả khoảng trống
 
Upvote 0
Cần làm rỏ thêm:
_ Có loại bỏ dấu tiếng Việt Không
_ Tìm theo 2 cột, điều kiện là cả 2 cùng thỏa hay 1 trong 2
- Số ký tự trung bình 1 ô của từng cột tìm dữ liệu là bao nhiêu ký tự kể cả khoảng trống
_Sẽ là có nếu loại bỏ dấu sẽ nhanh hơn
_1 trong 2 thui bác à
_Trug bình tầm 15 ký tự
 
Upvote 0
Ví dụ gõ b1 hoặc c1 từ textbox sẽ ra b1,c1,d1,e1,f1,g1 trog bảng listbox đó bác
Ví dụ gõ b1 hoặc c1 từ textbox sẽ ra b1,c1,d1,e1,f1,g1 trog bảng listbox đó bác
Vậy là khi gỏ vào Textbox, sẽ dò ở cả 2 cột, nếu phù hợp thì lấy, có khả năng muốn tìm ở cột 1 nhưng cột 2 phù hợp cũng lấy luôn? và ngược lại
 
Upvote 0
Web KT

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

Back
Top Bottom