Giúp em tạo gợi ý trong combobox sau khi đã lọc danh sách duy nhất trong combobox đó

Liên hệ QC

ecx

Thành viên mới
Tham gia
20/3/13
Bài viết
5
Được thích
1
Nho anh chi viet giup em doan code goi y sau khi nhap 1 vai ky tu vao combobox sau khi em da loc danh sach duy nhat trong combobox do a
 

File đính kèm

  • 1. Quyet toan - Copy.xlsm
    706.7 KB · Đọc: 182

File đính kèm

  • GPE ok.xlsb
    339.8 KB · Đọc: 164
Tìm theo từ gần nhất theo cột A. Tôi chỉ lấy code trên diển đàn rồi sửa lại cho phù hợp thôi. chứ tôi không rành cho lắm.
Anh không hiểu ý em rồi ạ. Trong file em đính kèm thì combobox đó đã lọc ra danh sách duy nhất trong sheet fin19 rồi ạ, giờ em cần là khi nhập vào 1 ký tự nào đó thì list danh sách trong combobox chỉ hiện thị gới ý theo ký tự nhập vào thôi ạ
 
Thử xem.
Toàn bộ code trong Form.
Mã:
Option Explicit

Private data()

Private Sub ComboBox2_Enter()
    If ComboBox2.Tag = "1" Then ComboBox2.List = data
End Sub

Private Sub ComboBox2_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim r As Long, count As Long, strValue As String, result()
    If ComboBox2.Tag <> "1" Then Exit Sub
    strValue = ComboBox2.text
    ComboBox2.Clear
    If strValue <> "" Then
        strValue = "*" & LCase(strValue) & "*"
        ReDim result(1 To 1, 1 To UBound(data, 1) + 1)
        For r = 0 To UBound(data, 1)
            If LCase(data(r)) Like strValue Then
                count = count + 1
                result(1, count) = data(r)
            End If
        Next r
        If count Then
            ReDim Preserve result(1 To 1, 1 To count)
            ComboBox2.Column = result
        End If
    Else
        ComboBox2.List = data
    End If
    If ComboBox2.ListCount Then ComboBox2.DropDown
End Sub

Private Sub UserForm_Initialize()
Dim lastRow As Long, r As Long, text As String, Arr, dic As Object
    With ThisWorkbook.Worksheets("fin19")
        lastRow = .Cells(Rows.count, "A").End(xlUp).Row
        If lastRow = 2 Then
            ReDim Arr(1 To 1, 1 To 1)
            Arr(1, 1) = .Range("A2").Value
        ElseIf lastRow > 2 Then
            Arr = .Range("A2:G" & lastRow).Value
        End If
        If IsArray(Arr) Then
            Set dic = CreateObject("Scripting.Dictionary")
            dic.comparemode = vbTextCompare
            For r = 1 To UBound(Arr, 1)
                text = Arr(r, 1)
                If text <> "" And Not dic.exists(text) Then dic.Add text, ""
            Next r
            If dic.count Then
                data = dic.keys()
                ComboBox2.Tag = "1"
            End If
            Set dic = Nothing
        End If
    End With
End Sub
 
Tìm theo từ gần nhất theo cột A. Tôi chỉ lấy code trên diển đàn rồi sửa lại cho phù hợp thôi. chứ tôi không rành cho lắm.
Thử xem.
Toàn bộ code trong Form.
Mã:
Option Explicit

Private data()

Private Sub ComboBox2_Enter()
    If ComboBox2.Tag = "1" Then ComboBox2.List = data
End Sub

Private Sub ComboBox2_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Dim r As Long, count As Long, strValue As String, result()
    If ComboBox2.Tag <> "1" Then Exit Sub
    strValue = ComboBox2.text
    ComboBox2.Clear
    If strValue <> "" Then
        strValue = "*" & LCase(strValue) & "*"
        ReDim result(1 To 1, 1 To UBound(data, 1) + 1)
        For r = 0 To UBound(data, 1)
            If LCase(data(r)) Like strValue Then
                count = count + 1
                result(1, count) = data(r)
            End If
        Next r
        If count Then
            ReDim Preserve result(1 To 1, 1 To count)
            ComboBox2.Column = result
        End If
    Else
        ComboBox2.List = data
    End If
    If ComboBox2.ListCount Then ComboBox2.DropDown
End Sub

Private Sub UserForm_Initialize()
Dim lastRow As Long, r As Long, text As String, Arr, dic As Object
    With ThisWorkbook.Worksheets("fin19")
        lastRow = .Cells(Rows.count, "A").End(xlUp).Row
        If lastRow = 2 Then
            ReDim Arr(1 To 1, 1 To 1)
            Arr(1, 1) = .Range("A2").Value
        ElseIf lastRow > 2 Then
            Arr = .Range("A2:G" & lastRow).Value
        End If
        If IsArray(Arr) Then
            Set dic = CreateObject("Scripting.Dictionary")
            dic.comparemode = vbTextCompare
            For r = 1 To UBound(Arr, 1)
                text = Arr(r, 1)
                If text <> "" And Not dic.exists(text) Then dic.Add text, ""
            Next r
            If dic.count Then
                data = dic.keys()
                ComboBox2.Tag = "1"
            End If
            Set dic = Nothing
        End If
    End With
End Sub
Cảm ơn anh ạ. Đã đúng 99% rồi ạ. Chỉ còn 1 vấn đề là khi em nhập ký tự đầu tiên thì trên ô Combobox không hiển thị ký tự đó ạ. Ví dụ em nhập ký tự N thì ô k hiển thị N lên ạ. Anh xem hình giúp em nhé. Cảm ơn anh
1585745179601.png
 
Cảm ơn anh ạ. Đã đúng 99% rồi ạ. Chỉ còn 1 vấn đề là khi em nhập ký tự đầu tiên thì trên ô Combobox không hiển thị ký tự đó ạ. Ví dụ em nhập ký tự N thì ô k hiển thị N lên ạ. Anh xem hình giúp em nhé. Cảm ơn anh
View attachment 234514
Tôi quên không hướng dẫn.
Hãy chọn ComboBox2 và trong cửa sổ Properties sửa thành MatchEntry = fmMatchEntryNone

combobox2.JPG
 
Chào thầy ạ. Cho em hỏi thuộc tính kia là gì thế ạ
Tôi chỉ hơn bạn mỗi một điểm là tôi chịu khó đọc help thôi.

matchentry.JPG


Theo tôi hiểu thì khi có fmMatchEntryComplete thì khi bạn gõ "n" thì ComboBox sẽ tìm xem trong danh sách có mục nào khớp không, tức mục bắt đầu bằng "n". Nếu tìm thấy mục khớp đầu tiên thì mục đó được chọn trong danh sách, và nội dung mục đó được hiển thị trong phần Edit của combobox. Nhưng do bạn mới chỉ gõ "n" nên nếu mục khớp đầu tiên là "NC002021" thì đoạn "C002021" sẽ được "bôi đen". Làm thế để bạn có thể gõ tiếp "b" để tìm mục khớp với "NB". Nếu "C002021" không được bôi đen thì trỏ văn bản nằm ở sau ký tự "1". Lúc đó nếu gõ "b" thì phần Edit sẽ là "NC002021b". Để có thể gõ "nb" thì bạn phải mất công bôi đen "C002021" rồi gõ "b". combobox "thông minh" nên nó bôi đen "C002021" để bạn có thể gõ tiếp "b" với mục đích tìm mục khớp với "nb".

Khi có fmMatchEntryNone thì không có chuyện tìm khớp "từng phần" như thế nữa. Trong suốt quá trình gõ N, C, 0, 0, 2, 0, 2, 1 mục "NC002021" không được chọn, và ComboBox.ListIndex là -1. Chỉ khi bạn chọn trực tiếp trong danh sách mục "NC002021" thì lúc đó ComboBox.ListIndex mới = vị trí (tính từ 0) của mục "NC002021" trong danh sách.

Trong code cụ thể trong chủ đề thì khi có fmMatchEntryComplete: gõ "n" thì combobox tìm và thấy khớp đầu tiên là "NC002021". Lúc này thì mục "NC002021" trong danh sách sẽ được chọn và nội dung NC002021 sẽ được nhập vào phần Edit. Do có sự kiện KeyUp nên:

- strValue = ComboBox2.text = NC002021
- do ComboBox2.Clear nên cả phần Edit và phần ListBox (danh sách) đều bị xóa.
- tiếp theo code sẽ tìm được và chỉ tìm được 1 mục khớp là NC002021.
- cuối cùng là danh sách tìm thấy chỉ có 1 mục NC002021, nó được hiển thị. Còn phần Edit vẫn trống vì đã bị xóa trước đó, và code không tự nhập NC002021 vào phần Edit.

Với fmMatchNone thì phần Edit luôn là cái đã được gõ đến thời điểm hiện hành. Code sẽ tự tìm tất cả các mục khớp và danh sách đó được code "nhồi" vào ComboBox.

Cũng cần lưu ý chủ thớt là code tìm "n" hay "nb" ở vị trí bất kỳ. Nếu là tìm các mục bặt đầu bằng "n" hay "nb" thì sửa thành
Mã:
strValue = LCase(strValue) & "*"

Thực ra tôi cũng viết nhanh thôi, không suy nghĩ 7 lần. Suy nghĩ 7 lần khi và chỉ khi làm dự án kiếm tiền thôi.
 
Em xin lỗi vì 1 câu hỏi lẽ ra em có thể tự đọc được mà bắt người khác viết dài thế kia. xin lỗi thầy @batman1 nhiều ạ. Cảm ơn thầy
 
Web KT
Back
Top Bottom