Nhờ hỗ trợ code tìm kiếm dữ liệu bằng hộp tìm kiếm

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

S.Ha

Thành viên mới
Tham gia
21/11/23
Bài viết
20
Được thích
2
Chào các bác,
Em đang có một file dữ liệu nhưng do quá lớn nên khi tìm kiếm bằng lọc thông thường không ra kết quả
Em có tham khảo được cách sử dụng Advanced filter nhưng nó đang có một điểm chưa như ý là khi dữ liệu tìm kiếm gần giống nhau nó đề cùng chạy ra

Ví dụ khi tìm kiếm 10001 thì 10001A cũng ra theo kết quả
(em không rõ là do em thao tác sai hay do bản chất của Advanced filter)

Nhờ các bác giúp em code để nó tìm kiếm chính xác theo tên và theo mã hàng với ạ
Em cảm ơn ạ
 

File đính kèm

  • Book1.xlsb
    68.8 KB · Đọc: 18
Đoạn đậm đậm có vẻ không hợp lý.
Đoạn đó là khi sảy ra trường hợp mã nó tương tự nhau, chính là vấn đề mà em gặp phải bác ạ
Vốn dĩ khi em tìm kiếm 10001 nó sẽ ra Bánh mì ( đấy là kết quả chính xác mà em mong muốn)
nhưng nó lại ra cả 10001A vì trong 10001A có chứa từ khóa 10001 ạ
 
Cách ngừa vụ sai này có thể là làm sao cho độ dài mã như nhau (từ đầu đến cuối) trong/đối với file Excel tài lanh.
Còn để mã như vậy thì áp dụng phương thức FIND() với tham biến thích hợp (VBA)
 
Đoạn đó là khi sảy ra trường hợp mã nó tương tự nhau, chính là vấn đề mà em gặp phải bác ạ
Vốn dĩ khi em tìm kiếm 10001 nó sẽ ra Bánh mì ( đấy là kết quả chính xác mà em mong muốn)
nhưng nó lại ra cả 10001A vì trong 10001A có chứa từ khóa 10001 ạ
Cách ngừa vụ sai này có thể là làm sao cho độ dài mã như nhau (từ đầu đến cuối) trong/đối với file Excel tài lanh.
Còn để mã như vậy thì áp dụng phương thức FIND() với tham biến thích hợp (VBA)
Bạn dựa vào bài #4 này mà áp dụng thôi.
 
Thực sự thì thớt muốn cái gì?
Câu hỏi chính cho thớt hiện tại là thớt có biết rằng cái mà thớt cọi là "Mã" thực ra gồm vừa số vừa chuỗi.

Thớt nên quyết định là chình đốn dữ liệu trước rồi hãy code, hay viết code chỉnh dữ liệu luôn một thể.
Dữ liệu sạch sẽ thì code sạch sẽ. Dữ liệu tùm lùm thì code cũng tùm lùm, về sau chả ai đọc nổi.
 
Thực sự thì thớt muốn cái gì?
Câu hỏi chính cho thớt hiện tại là thớt có biết rằng cái mà thớt cọi là "Mã" thực ra gồm vừa số vừa chuỗi.

Thớt nên quyết định là chình đốn dữ liệu trước rồi hãy code, hay viết code chỉnh dữ liệu luôn một thể.
Dữ liệu sạch sẽ thì code sạch sẽ. Dữ liệu tùm lùm thì code cũng tùm lùm, về sau chả ai đọc nổi.
Dữ liệu thực tế bao gồm số và chuỗi bác ạ
cái này không phải của em tự đặt mà mặc định từ phía khách hàng họ đặt và gửi sang
4010233 và 4010233AH là 2 mã khác nhau chứ không phải em làm ví dụ không sạch sẽ đâu bác
Vì nó xuất hiện trường hợp này nên khi dùng Advanced filter lọc mã 4010233 nó sẽ ra cả 2 mã và em mới nhờ các bác giúp đỡ ạ
em bôi màu lên là để đánh dấu trường hợp đặc biệt này
 
...
4010233 và 4010233AH là 2 mã khác nhau chứ không phải em làm ví dụ không sạch sẽ đâu bác
...
Chúng không chỉ khác nhau bằng hình thức mà còn khác về thực chất và tính chất.
Nếu bạn không hiểu tôi nói gì thì công việc này trên trình độ của bạn khá xa.

Gửi file có cái Advanced Filter không phân biệt được 4010233 và lên đây 4010233AH.
 
Mình có cái thống kê sau & xin gởi tới chủ bài đăng tham khảo & cho quyết định:

Độ dài Mã​
Số lượng​
13​
86​
12​
0​
11​
1​
10​
4​
9​
643​
8​
2​
7​
399​
6​
9​
5​
1​
Tổng​
1145​
 
Chúng không chỉ khác nhau bằng hình thức mà còn khác về thực chất và tính chất.
Nếu bạn không hiểu tôi nói gì thì công việc này trên trình độ của bạn khá xa.

Gửi file có cái Advanced Filter không phân biệt được 4010233 và lên đây 4010233AH.
Vâng, em gửi file ạ
 

File đính kèm

  • Book1.xlsb
    86.5 KB · Đọc: 13
Thử code sau hên sui.
Mã:
Sub loc()
    Dim i As Long, lr As Long, arr, kq, dk As String, dks As String, T(), T1, b As Integer, k As Integer, j As Integer, a As Integer
    With Sheets("sheet1")
        lr = .Range("A" & Rows.Count).End(xlUp).Row
        If lr < 6 Then Exit Sub
        arr = .Range("a6:G" & lr).Value
        ReDim kq(1 To UBound(arr), 1 To 7)
    End With
    With Sheets("sheet2")
        T1 = .Range("B2:G2").Value
        For i = 1 To 6
            If Len(T1(1, i)) > 0 Then
               dk = dk & "#" & T1(1, i)
               b = b + 1
               ReDim Preserve T(0 To b)
               T(b) = i + 1
            End If
        Next i
        For i = 1 To UBound(arr)
            dks = Empty
            For k = 1 To b
                dks = dks & "#" & arr(i, T(k))
            Next k
            If dk = dks Then
               a = a + 1
               kq(a, 1) = a
               For j = 2 To 6
                   kq(a, j) = arr(i, j)
               Next j
            End If
        Next i
        lr = .Range("B" & Rows.Count).End(xlUp).Row
        If lr > 5 Then .Range("A6:G" & lr).ClearContents
        If a Then .Range("A6:G6").Resize(a).Value = kq
   End With
End Sub
 
Thử code sau hên sui.
Mã:
Sub loc()
    Dim i As Long, lr As Long, arr, kq, dk As String, dks As String, T(), T1, b As Integer, k As Integer, j As Integer, a As Integer
    With Sheets("sheet1")
        lr = .Range("A" & Rows.Count).End(xlUp).Row
        If lr < 6 Then Exit Sub
        arr = .Range("a6:G" & lr).Value
        ReDim kq(1 To UBound(arr), 1 To 7)
    End With
    With Sheets("sheet2")
        T1 = .Range("B2:G2").Value
        For i = 1 To 6
            If Len(T1(1, i)) > 0 Then
               dk = dk & "#" & T1(1, i)
               b = b + 1
               ReDim Preserve T(0 To b)
               T(b) = i + 1
            End If
        Next i
        For i = 1 To UBound(arr)
            dks = Empty
            For k = 1 To b
                dks = dks & "#" & arr(i, T(k))
            Next k
            If dk = dks Then
               a = a + 1
               kq(a, 1) = a
               For j = 2 To 6
                   kq(a, j) = arr(i, j)
               Next j
            End If
        Next i
        lr = .Range("B" & Rows.Count).End(xlUp).Row
        If lr > 5 Then .Range("A6:G" & lr).ClearContents
        If a Then .Range("A6:G6").Resize(a).Value = kq
   End With
End Sub
Em thử thấy nó ra đúng rồi bác ạ
em cảm ơn bác nhiều ạ
 
Web KT
Back
Top Bottom