Gõ và chọn tên trong ComboBox hiển thị giá trị trong textbox (1 người xem)

Liên hệ QC

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

Tôi tuân thủ nội quy khi đăng bài

lyvanthang

Thành viên mới
Tham gia
10/6/22
Bài viết
8
Được thích
0
Tôi muốn dùng form để tìm kiếm tên trong sheet1. Form bao gồm 1 combox và textbox. Combobox sẽ được sử dụng để tìm tên, còn textbox sẽ hiển thị mã số thuế.
Sau khi tìm kiếm đúng tên và mã số thuế, click vào button chọn, mã số thuế sẽ tự gán giá trị vào ô đã chọn.
Tôi không rành về code, mong các bạn trên diễn đàn giúp tôi với.
Cám ơn
 

File đính kèm

Bạn thao tác thử theo file;
Có gì cần chỉnh sửa mai ta tiếp tục!
 

File đính kèm

Upvote 0
- Do nhu cầu tìm kiếm ngay khi gõ chữ trong ComboBox trên Userform đối với các comboBox có nhiều dòng dữ liệu nên tôi có viết một cái Class cho nó.
- Nhiều dòng dữ liệu mà dùng chuột kéo lên xuống trong comboBox thì cũng mệt.
- Viết class để có thể dùng cho nhiều cái Combobox trong cùng một Userform.
- Cũng chưa bẫy lỗi gì nhiều nhưng cơ bản cũng đáp ứng được.
Bạn xem file đính kèm.

Screenshot 2025-08-31 at 00.44.05.png

* Bổ sung:
- Còn một kiểu tôi hay làm trong Access là dùng ADO Recordset để lưu nguồn dữ liệu của ComboBox. Recordset này có tính năng rs.Filter nên lọc (tìm kiếm) và gán ngược lại vào comboBox nhanh gọn hơn. Nó cũng lưu trên bộ nhớ như mảng. Tôi cũng chưa test tốc độ xử lý như thế nào.
- Dữ liệu nguồn ít dòng thì khi mở Form là gán nguồn cho comboBox luôn. Nếu dữ liệu nguồn nhiều dòng và lấy qua mạng (SQL server) thì chỉ khi gõ tìm kiếm, tôi mới tạo recordset đã lọc rồi gán cho comboBox. Cách làm này nhằm hạn chế lấy nguồn dữ liệu quá lớn qua mạng cũng như bộ nhớ lưu trữ.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
- Do nhu cầu tìm kiếm ngay khi gõ chữ trong ComboBox trên Userform đối với các comboBox có nhiều dòng dữ liệu nên tôi có viết một cái Class cho nó.
- Nhiều dòng dữ liệu mà dùng chuột kéo lên xuống trong comboBox thì cũng mệt.
- Viết class để có thể dùng cho nhiều cái Combobox trong cùng một Userform.
- Cũng chưa bẫy lỗi gì nhiều nhưng cơ bản cũng đáp ứng được.
Bạn xem file đính kèm.

View attachment 309483
Có nên để chế độ ShowModal = False không anh.
 
Lần chỉnh sửa cuối:
Upvote 0
Có nên để chế độ ShowModal = False không anh.
Cái này tùy ý đồ thiết kế ứng dụng của mỗi người thôi bạn. Như tôi thì chỉ muốn làm mọi thứ trên Userform, Excel sheet chỉ là để lưu dữ liệu nên sẽ không để tương tác trực tiếp nên khóa nó luôn.
 
Upvote 0
- Do nhu cầu tìm kiếm ngay khi gõ chữ trong ComboBox trên Userform đối với các comboBox có nhiều dòng dữ liệu nên tôi có viết một cái Class cho nó.
Rất hữu dụng luôn anh. Em có 1 tý đề xuất nhỏ nhỏ, cho phép mở rộng thêm tìm kiếm không dấu vào luôn ?

PHP:
Private Sub ApplyFilter(ByVal sText As String)
    Dim outArr() As Variant, s As String, searchString As String
    Dim i As Long, j As Long, n As Long, count As Long
    Dim s2 As String

    If IsEmpty(mOriginalList) Then Exit Sub

    n = UBound(mOriginalList, 1)
    searchString = LCase$(sText)

    If LenB(sText) = 0 Then
        mCombo.List = mOriginalList
        Exit Sub
    End If

    'Dem dòng tim thay truoc khi Redim mang
    count = 0
    For i = 1 To n
        s = CStr(mOriginalList(i, mFilterCol - 1))
        s2 = BoDau(s)
        If InStr(1, LCase$(s), searchString, vbTextCompare) > 0 Or InStr(1, LCase$(s2), searchString, vbTextCompare) > 0 Then
            count = count + 1
        End If
    Next

    If count = 0 Then   'Tim khong thay dong nao
        mCombo.Clear
        Exit Sub
    End If

    ReDim outArr(1 To count, 1 To 2)    'Khai bao mang ket qua sau khi loc
    count = 0
    For i = 1 To n
        s = CStr(mOriginalList(i, mFilterCol - 1))
        s2 = BoDau(s)
        If InStr(1, LCase$(s), searchString, vbTextCompare) > 0 Or InStr(1, LCase$(s2), searchString, vbTextCompare) > 0 Then
            count = count + 1
            For j = 1 To UBound(mOriginalList, 2) + 1
                outArr(count, j) = mOriginalList(i, j - 1)
            Next j
            
        End If
    Next
    mCombo.List = outArr
End Sub

Hàm bỏ dấu: https://www.giaiphapexcel.com/diendan/threads/137635/post-880494


PHP:
Function BoDau(Text As String) As String
    Dim AsciiDict   As Object
    Set AsciiDict = CreateObject("scripting.dictionary")
    AsciiDict(192) = "A"
    AsciiDict(193) = "A"
    AsciiDict(194) = "A"
    AsciiDict(195) = "A"
    AsciiDict(196) = "A"
    AsciiDict(197) = "A"
    AsciiDict(199) = "C"
    AsciiDict(200) = "E"
    AsciiDict(201) = "E"
    AsciiDict(202) = "E"
    AsciiDict(203) = "E"
    AsciiDict(204) = "I"
    AsciiDict(205) = "I"
    AsciiDict(206) = "I"
    AsciiDict(207) = "I"
    AsciiDict(208) = "D"
    AsciiDict(209) = "N"
    AsciiDict(210) = "O"
    AsciiDict(211) = "O"
    AsciiDict(212) = "O"
    AsciiDict(213) = "O"
    AsciiDict(214) = "O"
    AsciiDict(217) = "U"
    AsciiDict(218) = "U"
    AsciiDict(219) = "U"
    AsciiDict(220) = "U"
    AsciiDict(221) = "Y"
    AsciiDict(224) = "a"
    AsciiDict(225) = "a"
    AsciiDict(226) = "a"
    AsciiDict(227) = "a"
    AsciiDict(228) = "a"
    AsciiDict(229) = "a"
    AsciiDict(231) = "c"
    AsciiDict(232) = "e"
    AsciiDict(233) = "e"
    AsciiDict(234) = "e"
    AsciiDict(235) = "e"
    AsciiDict(236) = "i"
    AsciiDict(237) = "i"
    AsciiDict(238) = "i"
    AsciiDict(239) = "i"
    AsciiDict(240) = "d"
    AsciiDict(241) = "n"
    AsciiDict(242) = "o"
    AsciiDict(243) = "o"
    AsciiDict(244) = "o"
    AsciiDict(245) = "o"
    AsciiDict(246) = "o"
    AsciiDict(249) = "u"
    AsciiDict(250) = "u"
    AsciiDict(251) = "u"
    AsciiDict(252) = "u"
    AsciiDict(253) = "y"
    AsciiDict(255) = "y"
    AsciiDict(352) = "S"
    AsciiDict(353) = "s"
    AsciiDict(376) = "Y"
    AsciiDict(381) = "Z"
    AsciiDict(382) = "z"
    AsciiDict(258) = "A"
    AsciiDict(259) = "a"
    AsciiDict(272) = "D"
    AsciiDict(273) = "d"
    AsciiDict(296) = "I"
    AsciiDict(297) = "i"
    AsciiDict(360) = "U"
    AsciiDict(361) = "u"
    AsciiDict(416) = "O"
    AsciiDict(417) = "o"
    AsciiDict(431) = "U"
    AsciiDict(432) = "u"
    AsciiDict(7840) = "A"
    AsciiDict(7841) = "a"
    AsciiDict(7842) = "A"
    AsciiDict(7843) = "a"
    AsciiDict(7844) = "A"
    AsciiDict(7845) = "a"
    AsciiDict(7846) = "A"
    AsciiDict(7847) = "a"
    AsciiDict(7848) = "A"
    AsciiDict(7849) = "a"
    AsciiDict(7850) = "A"
    AsciiDict(7851) = "a"
    AsciiDict(7852) = "A"
    AsciiDict(7853) = "a"
    AsciiDict(7854) = "A"
    AsciiDict(7855) = "a"
    AsciiDict(7856) = "A"
    AsciiDict(7857) = "a"
    AsciiDict(7858) = "A"
    AsciiDict(7859) = "a"
    AsciiDict(7860) = "A"
    AsciiDict(7861) = "a"
    AsciiDict(7862) = "A"
    AsciiDict(7863) = "a"
    AsciiDict(7864) = "E"
    AsciiDict(7865) = "e"
    AsciiDict(7866) = "E"
    AsciiDict(7867) = "e"
    AsciiDict(7868) = "E"
    AsciiDict(7869) = "e"
    AsciiDict(7870) = "E"
    AsciiDict(7871) = "e"
    AsciiDict(7872) = "E"
    AsciiDict(7873) = "e"
    AsciiDict(7874) = "E"
    AsciiDict(7875) = "e"
    AsciiDict(7876) = "E"
    AsciiDict(7877) = "e"
    AsciiDict(7878) = "E"
    AsciiDict(7879) = "e"
    AsciiDict(7880) = "I"
    AsciiDict(7881) = "i"
    AsciiDict(7882) = "I"
    AsciiDict(7883) = "i"
    AsciiDict(7884) = "O"
    AsciiDict(7885) = "o"
    AsciiDict(7886) = "O"
    AsciiDict(7887) = "o"
    AsciiDict(7888) = "O"
    AsciiDict(7889) = "o"
    AsciiDict(7890) = "O"
    AsciiDict(7891) = "o"
    AsciiDict(7892) = "O"
    AsciiDict(7893) = "o"
    AsciiDict(7894) = "O"
    AsciiDict(7895) = "o"
    AsciiDict(7896) = "O"
    AsciiDict(7897) = "o"
    AsciiDict(7898) = "O"
    AsciiDict(7899) = "o"
    AsciiDict(7900) = "O"
    AsciiDict(7901) = "o"
    AsciiDict(7902) = "O"
    AsciiDict(7903) = "o"
    AsciiDict(7904) = "O"
    AsciiDict(7905) = "o"
    AsciiDict(7906) = "O"
    AsciiDict(7907) = "o"
    AsciiDict(7908) = "U"
    AsciiDict(7909) = "u"
    AsciiDict(7910) = "U"
    AsciiDict(7911) = "u"
    AsciiDict(7912) = "U"
    AsciiDict(7913) = "u"
    AsciiDict(7914) = "U"
    AsciiDict(7915) = "u"
    AsciiDict(7916) = "U"
    AsciiDict(7917) = "u"
    AsciiDict(7918) = "U"
    AsciiDict(7919) = "u"
    AsciiDict(7920) = "U"
    AsciiDict(7921) = "u"
    AsciiDict(7922) = "Y"
    AsciiDict(7923) = "y"
    AsciiDict(7924) = "Y"
    AsciiDict(7925) = "y"
    AsciiDict(7926) = "Y"
    AsciiDict(7927) = "y"
    AsciiDict(7928) = "Y"
    AsciiDict(7929) = "y"
    AsciiDict(8363) = "d"
    Text = Trim(Text)
    If Text = "" Then Exit Function
    Dim Char        As String, _
        NormalizedText As String, _
        UnicodeCharCode As Long, _
        i           As Long
    'Remove accent marks (diacritics) from text
    For i = 1 To Len(Text)
        Char = Mid(Text, i, 1)
        UnicodeCharCode = AscW(Char)
        If (UnicodeCharCode < 0) Then
            'See http://support.microsoft.com/kb/272138
            UnicodeCharCode = 65536 + UnicodeCharCode
        End If
        If AsciiDict.Exists(UnicodeCharCode) Then
            NormalizedText = NormalizedText & AsciiDict.Item(UnicodeCharCode)
        Else
            NormalizedText = NormalizedText & Char
        End If
    Next
    BoDau = NormalizedText
End Function
 
Upvote 0

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

Back
Top Bottom