Tìm kiếm với Code với combobox

Liên hệ QC

Yeuvoyeucon

Thành viên hoạt động
Tham gia
30/10/09
Bài viết
143
Được thích
23
Kính gửi anh chị và các bạn
Em muốn tìm kiếm theo tên hàng. Và khi gõ ký tự thì các tên hàng chứa ký tự đó đều hiện lên hết không phân biệt ở đầu hay ở giữa hay bất kỳ thì làm sao tiếp ạ (Ví dụ gõ ký tự Gi thì sẽ hiện Mien Giong Cu Gieng và My Tom Gio
Em mò trên mạng mà mới làm được thế này ạ. Nhờ GPE trợ giúp ạ.
 

File đính kèm

  • Combobox.xlsb
    20.6 KB · Đọc: 31
Kính gửi anh chị và các bạn
Em muốn tìm kiếm theo tên hàng. Và khi gõ ký tự thì các tên hàng chứa ký tự đó đều hiện lên hết không phân biệt ở đầu hay ở giữa hay bất kỳ thì làm sao tiếp ạ (Ví dụ gõ ký tự Gi thì sẽ hiện Mien Giong Cu Gieng và My Tom Gio
Em mò trên mạng mà mới làm được thế này ạ. Nhờ GPE trợ giúp ạ.
Giống video này bạn nhỉ
Liên kết: https://www.youtube.com/watch?v=6ckANTT1eFU
 
Upvote 0
Kính gửi anh chị và các bạn
Em muốn tìm kiếm theo tên hàng. Và khi gõ ký tự thì các tên hàng chứa ký tự đó đều hiện lên hết không phân biệt ở đầu hay ở giữa hay bất kỳ thì làm sao tiếp ạ (Ví dụ gõ ký tự Gi thì sẽ hiện Mien Giong Cu Gieng và My Tom Gio
Em mò trên mạng mà mới làm được thế này ạ. Nhờ GPE trợ giúp ạ.
Mã:
Private Sub ComboBox1_Change()
    With Me.ComboBox1
    Dim irow&
        irow = Sheet1.Range("A" & Rows.Count).End(3).Row
        '.List = Worksheets("Sheet1").Range("A2:B" & Worksheets("Sheet1").Cells(Rows.Count, "A").End(xlUp)).Value
        '  .ListRows = Application.WorksheetFunction.Min(5, .ListCount)
        '.DropDown
        ' If ListRowsMaximum = 0 Then ListRowsMaximum = Me.ComboBox1.ListRows
    Dim arr(), Res()
        arr = Sheet1.Range("A2:B" & irow).Value
        ReDim Res(1 To UBound(arr, 1), 1 To 1)
        For i = 1 To UBound(arr, 1)
            If arr(i, 2) Like "*" & .Text & "*" Then
                k = k + 1
                Res(k, 1) = arr(i, 2)
            End If
        Next
        .List = Res
        .DropDown
    End With
End Sub
Thử
 
Upvote 0
Mã:
Private Sub ComboBox1_Change()
    With Me.ComboBox1
    Dim irow&
        irow = Sheet1.Range("A" & Rows.Count).End(3).Row
        '.List = Worksheets("Sheet1").Range("A2:B" & Worksheets("Sheet1").Cells(Rows.Count, "A").End(xlUp)).Value
        '  .ListRows = Application.WorksheetFunction.Min(5, .ListCount)
        '.DropDown
        ' If ListRowsMaximum = 0 Then ListRowsMaximum = Me.ComboBox1.ListRows
    Dim arr(), Res()
        arr = Sheet1.Range("A2:B" & irow).Value
        ReDim Res(1 To UBound(arr, 1), 1 To 1)
        For i = 1 To UBound(arr, 1)
            If arr(i, 2) Like "*" & .Text & "*" Then
                k = k + 1
                Res(k, 1) = arr(i, 2)
            End If
        Next
        .List = Res
        .DropDown
    End With
End Sub
Thử
Em cảm ơn anh ạ !
 
Upvote 0
Mã:
Private Sub ComboBox1_Change()
    With Me.ComboBox1
    Dim irow&
        irow = Sheet1.Range("A" & Rows.Count).End(3).Row
        '.List = Worksheets("Sheet1").Range("A2:B" & Worksheets("Sheet1").Cells(Rows.Count, "A").End(xlUp)).Value
        '  .ListRows = Application.WorksheetFunction.Min(5, .ListCount)
        '.DropDown
        ' If ListRowsMaximum = 0 Then ListRowsMaximum = Me.ComboBox1.ListRows
    Dim arr(), Res()
        arr = Sheet1.Range("A2:B" & irow).Value
        ReDim Res(1 To UBound(arr, 1), 1 To 1)
        For i = 1 To UBound(arr, 1)
            If arr(i, 2) Like "*" & .Text & "*" Then
                k = k + 1
                Res(k, 1) = arr(i, 2)
            End If
        Next
        .List = Res
        .DropDown
    End With
End Sub
Thử
Một điều hết sức chú ý khi lọc trên ComboBox, nếu không bỏ thuộc tính này thì khó lọc chính xác được những thứ mình mong muốn.
Trong trường hợp trong hình dưới đây, tôi mới gõ chữ N thì ComboBox nó đã "tài lanh" điền đầy đủ item mà nó gần nhất có chứa ký tự đầu.

1629265617142.png
 
Lần chỉnh sửa cuối:
Upvote 0
Theo lời bác @Hoàng Trọng Nghĩa, phải làm 2 bước:
- Bước 1: cài đặt Combox như hình
- Bước 2: tôi có sửa lại code của bạn @buiquangthuan ở bài #3 một chút
PHP:
Private Sub ComboBox1_Change()
    With Me.ComboBox1
    Dim irow As Integer
        irow = Sheet1.Range("A" & Rows.Count).End(3).Row
        '.List = Worksheets("Sheet1").Range("A2:B" & Worksheets("Sheet1").Cells(Rows.Count, "A").End(xlUp)).Value
        '  .ListRows = Application.WorksheetFunction.Min(5, .ListCount)
        '.DropDown
        ' If ListRowsMaximum = 0 Then ListRowsMaximum = Me.ComboBox1.ListRows
    Dim arr(), Res()
        arr = Sheet1.Range("A2:B" & irow).Value
       
        For i = 1 To UBound(arr, 1)
            'If arr(i, 2) Like "*" & .Text & "*" Then
            If InStr(1, UCase(arr(i, 2)), UCase(.Text)) > 0 Then
                k = k + 1: ReDim Preserve Res(1 To k)
                Res(k) = arr(i, 2)
            End If
        Next
        .List = Res
        .DropDown
    End With
End Sub
Combobox_Properties.jpg
 
Upvote 0
Kính gửi anh chị và các bạn
Em muốn tìm kiếm theo tên hàng. Và khi gõ ký tự thì các tên hàng chứa ký tự đó đều hiện lên hết không phân biệt ở đầu hay ở giữa hay bất kỳ thì làm sao tiếp ạ (Ví dụ gõ ký tự Gi thì sẽ hiện Mien Giong Cu Gieng và My Tom Gio
Em mò trên mạng mà mới làm được thế này ạ. Nhờ GPE trợ giúp ạ.
Bạn thử code dưới đây xem có đúng không?

Mã:
Private Sub ComboBox1_Change()
Dim Lr&, Str$
Dim Rng As Range
Dim Arr(1 To 100, 1 To 2), k&, khoa$

Str = ComboBox1.Value
With Sheets("Sheet11")
    Lr = .Range("A10000").End(xlUp).Row
    Set Rng = .Range("A2:B" & Lr).Find(What:=Str, LookIn:=xlFormulas2, LookAt:=xlPart)
    If Not Rng Is Nothing Then
        khoa = Rng.Address
        Do
            k = k + 1
            Arr(k, 1) = .Range("A" & Rng.Row).Value
            Arr(k, 2) = .Range("B" & Rng.Row).Value
            Set Rng = .Range("A2:B" & Lr).FindNext(Rng)
        Loop Until Rng.Address = khoa
    End If
End With
If k > 0 Then
    With Me.ComboBox1
        .ColumnWidths = "50;100"
        .ListRows = k
        .List = Arr
        .Activate
        .DropDown
    End With
End If
End Sub
 
Upvote 0
Kính gửi anh chị và các bạn
Em muốn tìm kiếm theo tên hàng. Và khi gõ ký tự thì các tên hàng chứa ký tự đó đều hiện lên hết không phân biệt ở đầu hay ở giữa hay bất kỳ thì làm sao tiếp ạ (Ví dụ gõ ký tự Gi thì sẽ hiện Mien Giong Cu Gieng và My Tom Gio
Em mò trên mạng mà mới làm được thế này ạ. Nhờ GPE trợ giúp ạ.
Thử sử dụng File, chỉ với 1 dòng code.
 

File đính kèm

  • Filter với từ gợi nhớ.xlsb
    19.2 KB · Đọc: 33
Lần chỉnh sửa cuối:
Upvote 0
Theo lời bác @Hoàng Trọng Nghĩa, phải làm 2 bước:
- Bước 1: cài đặt Combox như hình
- Bước 2: tôi có sửa lại code của bạn @buiquangthuan ở bài #3 một chút
PHP:
Private Sub ComboBox1_Change()
    With Me.ComboBox1
    Dim irow As Integer
        irow = Sheet1.Range("A" & Rows.Count).End(3).Row
        '.List = Worksheets("Sheet1").Range("A2:B" & Worksheets("Sheet1").Cells(Rows.Count, "A").End(xlUp)).Value
        '  .ListRows = Application.WorksheetFunction.Min(5, .ListCount)
        '.DropDown
        ' If ListRowsMaximum = 0 Then ListRowsMaximum = Me.ComboBox1.ListRows
    Dim arr(), Res()
        arr = Sheet1.Range("A2:B" & irow).Value
      
        For i = 1 To UBound(arr, 1)
            'If arr(i, 2) Like "*" & .Text & "*" Then
            If InStr(1, UCase(arr(i, 2)), UCase(.Text)) > 0 Then
                k = k + 1: ReDim Preserve Res(1 To k)
                Res(k) = arr(i, 2)
            End If
        Next
        .List = Res
        .DropDown
    End With
End Sub
View attachment 264295
Không hiểu tại sao chạy thấy báo lỗi ở dòng .List=Res ;
Vẫn code cũ sửa lại một chút chạy ngon lành:
Mã:
Private Sub ComboBox1_Change()
    With Me.ComboBox1
    Dim irow As Integer
        irow = Sheet1.Range("A" & Rows.Count).End(3).Row
        '.List = Worksheets("Sheet1").Range("A2:B" & Worksheets("Sheet1").Cells(Rows.Count, "A").End(xlUp)).Value
        '  .ListRows = Application.WorksheetFunction.Min(5, .ListCount)
        '.DropDown
        ' If ListRowsMaximum = 0 Then ListRowsMaximum = Me.ComboBox1.ListRows
    Dim arr(), Res()
        arr = Sheet1.Range("A2:B" & irow).Value
       ReDim Res(1 To UBound(arr), 1 To 1)
        For i = 1 To UBound(arr, 1)
            If arr(i, 2) Like "*" & .Text & "*" Then
            'If InStr(1, UCase(arr(i, 2)), UCase(.Text)) > 0 Then
                k = k + 1
                Res(k, 1) = arr(i, 2)
            End If
        Next
        .List = Res
        .DropDown
    End With
End Sub
 
Upvote 0
Không hiểu tại sao chạy thấy báo lỗi ở dòng .List=Res ;
Vẫn code cũ sửa lại một chút chạy ngon lành:
Mã:
Private Sub ComboBox1_Change()
    With Me.ComboBox1
    Dim irow As Integer
        irow = Sheet1.Range("A" & Rows.Count).End(3).Row
        '.List = Worksheets("Sheet1").Range("A2:B" & Worksheets("Sheet1").Cells(Rows.Count, "A").End(xlUp)).Value
        '  .ListRows = Application.WorksheetFunction.Min(5, .ListCount)
        '.DropDown
        ' If ListRowsMaximum = 0 Then ListRowsMaximum = Me.ComboBox1.ListRows
    Dim arr(), Res()
        arr = Sheet1.Range("A2:B" & irow).Value
       ReDim Res(1 To UBound(arr), 1 To 1)
        For i = 1 To UBound(arr, 1)
            If arr(i, 2) Like "*" & .Text & "*" Then
            'If InStr(1, UCase(arr(i, 2)), UCase(.Text)) > 0 Then
                k = k + 1
                Res(k, 1) = arr(i, 2)
            End If
        Next
        .List = Res
        .DropDown
    End With
End Sub
Lỗi là khi bạn đưa vào 1 ký tự không tồn tại trong các từ ở danh sách kia.
Bạn thử đánh z, 0-9 sẽ báo lỗi vì lúc đó k=0 --> Res() chưa có gì
Để khắc phục thì bạn thêm điều kiện kiểm tra k là được:
PHP:
If k Then
    .List = Res
    .DropDown
End If
Code của bạn sẽ nảy sinh vấn đề: xác định kích thước mảng Res dựa trên arr:
- Trường hợp k < ubound(arr), mảng Res() ngoài các kết quả đúng, vẫn có các giá trị không đúng (các phần tử chưa được gán giá trị - khoảng trắng)
- Trường hợp không có giá trị thỏa mãn, mảng Res() vẫn tồn tại và gồm toàn các giá trị không đúng.
 
Upvote 0
Upvote 0
Tác giả dùng combobox và muốn kết quả anh lọc trên sheet trở thành list mới của combobox đó anh. Một dòng code chỉ làm được 1 việc lọc thôi.
1/ Bài 1 chủ Topic diễn giải không rõ ràng, lại không nêu mục đích để làm gì? Họ hỏi đến đâu thì làm đến đấy.
2/ Nếu chủ Topic nêu cụ thể nội dung như bài 2 thì mới góp ý cho họ sử dụng UserForm để tra cứu và nhập liệu vào hóa đơn hoặc báo giá đơn hàng sẽ thuận tiện và nhanh hơn nhiều.
 
Upvote 0
1/ Bài 1 chủ Topic diễn giải không rõ ràng, lại không nêu mục đích để làm gì? Họ hỏi đến đâu thì làm đến đấy.
2/ Nếu chủ Topic nêu cụ thể nội dung như bài 2 thì mới góp ý cho họ sử dụng UserForm để tra cứu và nhập liệu vào hóa đơn hoặc báo giá đơn hàng sẽ thuận tiện và nhanh hơn nhiều.
Tiêu đề, nội dung và cả file mẫu bài 1 đều là combobox mà anh.
 
Upvote 0
Web KT

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

Back
Top Bottom