Tìm kiếm nhanh trong drop down list

Liên hệ QC
Với sheet2 tại cột B và C, bạn thử chọn 1 ô tại 2 cột đó, từ hàng 3 trở đi sẽ thấy nó.

Gõ từ khóa chúng sẽ hiện ra tương ứng, không nhất thiết phải gõ từ đầu câu, chỉ cần gõ bất kỳ cụm từ nào trong đó và không phân biệt chữ thường hoặc chữ hoa.

Ví dụ: Chuỗi là Hoang Trong Nghia, bạn chỉ cần gõ trong (Trong, TRONG, ...), hoặc gõ oang (OANG, oAng, ...) thì những mục có chứa các từ đó sẽ hiển thị để bạn chọn.

Đây là toàn bộ code của bài này (code trong Module của Sheet2):

Mã:
Private priArray
Private priColumn As Long
Private priIsFocus As Boolean

.........................
Chào anh 
Mấy hôm đang nhờ trợ giúp vấn đề này thì thấy bài anh làm trên diễn đàn. Anh có thể giúp viết lại code để khi chọn cột B trong sheet2 thì nó chỉ hiện ra dữ liệu của cột B trong sheet1, đồng thời cũng không cần lấy dữ liệu của cột C sheet1 cho vào cột C sheet 2 được không?
Mình đang cần đúng cái anh làm giúp các bạn để áp dụng vào mấy file của mình

Ngoài ra hỏi thêm anh, cái drop down list này có thể lấy dữ liệu từ một file khác mà không phải từ một sheet khác trong cùng một file được không, đang hỏi trong diễn đàn mà chưa thấy anh chị nào hỗ trợ được?

Cám ơn anh nhiều.
 
Với sheet2 tại cột B và C, bạn thử chọn 1 ô tại 2 cột đó, từ hàng 3 trở đi sẽ thấy nó.

Gõ từ khóa chúng sẽ hiện ra tương ứng, không nhất thiết phải gõ từ đầu câu, chỉ cần gõ bất kỳ cụm từ nào trong đó và không phân biệt chữ thường hoặc chữ hoa.

Ví dụ: Chuỗi là Hoang Trong Nghia, bạn chỉ cần gõ trong (Trong, TRONG, ...), hoặc gõ oang (OANG, oAng, ...) thì những mục có chứa các từ đó sẽ hiển thị để bạn chọn.

Đây là toàn bộ code của bài này (code trong Module của Sheet2):

Mã:
Private priArray
Private priColumn As Long
Private priIsFocus As Boolean


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Count = 1 And Target.Row > 2 Then
        Dim e As Long
        Static ArrCode, ArrName
        If Target.Column = 2 Then
            If Not IsArray(ArrCode) Then
                e = Sheet1.Range("B" & Rows.Count).End(xlUp).Row
                ArrCode = Sheet1.Range("B2:C" & e).Value2
            End If
            priColumn = 1
            priArray = ArrCode
            Call HienComboBox
        ElseIf Target.Column = 3 Then
            If Not IsArray(ArrName) Then
                Dim ArrTmp
                Dim r As Long, u As Long
                e = Sheet1.Range("B" & Rows.Count).End(xlUp).Row
                ArrTmp = Sheet1.Range("B2:B" & e).Value2
                ArrName = Sheet1.Range("C2:C" & e).Value2
                u = UBound(ArrName)
                ReDim Preserve ArrName(1 To u, 1 To 2)
                For r = 1 To u
                    ArrName(r, 2) = ArrTmp(r, 1)
                Next
            End If
            priColumn = -1
            priArray = ArrName
            Call HienComboBox
        Else
            Call AnComboBox
        End If
    Else
        Call AnComboBox
    End If
End Sub


Private Sub ComboBox1_Change()
    If priIsFocus Then Exit Sub
    If ComboBox1.MatchFound Then
        ActiveCell.Value = ComboBox1.Text
        ActiveCell.Offset(, priColumn).Value = ComboBox1.Column(1)
    Else
        ActiveCell.Value = ""
        ActiveCell.Offset(, priColumn).Value = ""
    End If
End Sub


Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    On Error Resume Next
    Select Case KeyCode
    Case 9, 16, 17, 37 To 40
    Case 13
        ActiveCell.Offset(1).Activate
    Case Else
        Dim strValue As String
        strValue = LCase(ComboBox1.Text)
        ComboBox1.ListRows = 20
        If Trim(strValue) > "" Then
            If IsArray(priArray) Then
                Dim ArrFilter, GetRow()
                Dim c As Long, i As Long, n As Long, r As Long
                For r = 1 To UBound(priArray, 1)
                    If LCase(priArray(r, 1)) Like "*" & strValue & "*" Then
                        n = n + 1
                        ReDim Preserve GetRow(1 To n)
                        GetRow(n) = r
                    End If
                Next
                If n Then
                    Dim u As Byte
                    u = UBound(priArray, 2)
                    ReDim ArrFilter(1 To n, 1 To u)
                    For r = 1 To n
                        For c = 1 To u
                            ArrFilter(r, c) = priArray(GetRow(r), c)
                        Next
                    Next
                    ComboBox1.List = ArrFilter
                Else
                    ComboBox1.Clear
                    ComboBox1.ListRows = 0
                End If
                ComboBox1.DropDown
            End If
        Else
            If ComboBox1.ListCount <> UBound(priArray) Then
                ComboBox1.List = priArray
                ComboBox1.DropDown
            End If
        End If
    End Select
End Sub


Private Sub HienComboBox()
    priIsFocus = True
    With ComboBox1
        .Visible = False
        .Visible = True
        .Left = ActiveCell.Left
        .Top = ActiveCell.Top
        .Width = ActiveCell.Width
        .ListWidth = .Width + ActiveCell.Offset(, priColumn).Width
        .ColumnWidths = .Width - 4
        .Height = ActiveCell.Height
        .List = priArray
        .Text = ""
        .Text = ActiveCell.Value
        .Activate
        .SelStart = 0
        .SelLength = Len(.Text)
    End With
    priIsFocus = False
End Sub


Private Sub AnComboBox()
    With ComboBox1
        If .Visible Then
            .Visible = False
        End If
    End With
End Sub
Em muốn khi tim được dữ liệu phù hợp thì dùng phím TAB để nhập và chuyển sang cột tiếp theo thì làm như thế nào ạ.
 
Với sheet2 tại cột B và C, bạn thử chọn 1 ô tại 2 cột đó, từ hàng 3 trở đi sẽ thấy nó.

Gõ từ khóa chúng sẽ hiện ra tương ứng, không nhất thiết phải gõ từ đầu câu, chỉ cần gõ bất kỳ cụm từ nào trong đó và không phân biệt chữ thường hoặc chữ hoa.

Ví dụ: Chuỗi là Hoang Trong Nghia, bạn chỉ cần gõ trong (Trong, TRONG, ...), hoặc gõ oang (OANG, oAng, ...) thì những mục có chứa các từ đó sẽ hiển thị để bạn chọn.

Đây là toàn bộ code của bài này (code trong Module của Sheet2):

Mã:
Private priArray
Private priColumn As Long
Private priIsFocus As Boolean


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Count = 1 And Target.Row > 2 Then
        Dim e As Long
        Static ArrCode, ArrName
        If Target.Column = 2 Then
            If Not IsArray(ArrCode) Then
                e = Sheet1.Range("B" & Rows.Count).End(xlUp).Row
                ArrCode = Sheet1.Range("B2:C" & e).Value2
            End If
            priColumn = 1
            priArray = ArrCode
            Call HienComboBox
        ElseIf Target.Column = 3 Then
            If Not IsArray(ArrName) Then
                Dim ArrTmp
                Dim r As Long, u As Long
                e = Sheet1.Range("B" & Rows.Count).End(xlUp).Row
                ArrTmp = Sheet1.Range("B2:B" & e).Value2
                ArrName = Sheet1.Range("C2:C" & e).Value2
                u = UBound(ArrName)
                ReDim Preserve ArrName(1 To u, 1 To 2)
                For r = 1 To u
                    ArrName(r, 2) = ArrTmp(r, 1)
                Next
            End If
            priColumn = -1
            priArray = ArrName
            Call HienComboBox
        Else
            Call AnComboBox
        End If
    Else
        Call AnComboBox
    End If
End Sub


Private Sub ComboBox1_Change()
    If priIsFocus Then Exit Sub
    If ComboBox1.MatchFound Then
        ActiveCell.Value = ComboBox1.Text
        ActiveCell.Offset(, priColumn).Value = ComboBox1.Column(1)
    Else
        ActiveCell.Value = ""
        ActiveCell.Offset(, priColumn).Value = ""
    End If
End Sub


Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    On Error Resume Next
    Select Case KeyCode
    Case 9, 16, 17, 37 To 40
    Case 13
        ActiveCell.Offset(1).Activate
    Case Else
        Dim strValue As String
        strValue = LCase(ComboBox1.Text)
        ComboBox1.ListRows = 20
        If Trim(strValue) > "" Then
            If IsArray(priArray) Then
                Dim ArrFilter, GetRow()
                Dim c As Long, i As Long, n As Long, r As Long
                For r = 1 To UBound(priArray, 1)
                    If LCase(priArray(r, 1)) Like "*" & strValue & "*" Then
                        n = n + 1
                        ReDim Preserve GetRow(1 To n)
                        GetRow(n) = r
                    End If
                Next
                If n Then
                    Dim u As Byte
                    u = UBound(priArray, 2)
                    ReDim ArrFilter(1 To n, 1 To u)
                    For r = 1 To n
                        For c = 1 To u
                            ArrFilter(r, c) = priArray(GetRow(r), c)
                        Next
                    Next
                    ComboBox1.List = ArrFilter
                Else
                    ComboBox1.Clear
                    ComboBox1.ListRows = 0
                End If
                ComboBox1.DropDown
            End If
        Else
            If ComboBox1.ListCount <> UBound(priArray) Then
                ComboBox1.List = priArray
                ComboBox1.DropDown
            End If
        End If
    End Select
End Sub


Private Sub HienComboBox()
    priIsFocus = True
    With ComboBox1
        .Visible = False
        .Visible = True
        .Left = ActiveCell.Left
        .Top = ActiveCell.Top
        .Width = ActiveCell.Width
        .ListWidth = .Width + ActiveCell.Offset(, priColumn).Width
        .ColumnWidths = .Width - 4
        .Height = ActiveCell.Height
        .List = priArray
        .Text = ""
        .Text = ActiveCell.Value
        .Activate
        .SelStart = 0
        .SelLength = Len(.Text)
    End With
    priIsFocus = False
End Sub


Private Sub AnComboBox()
    With ComboBox1
        If .Visible Then
            .Visible = False
        End If
    End With
End Sub

Với sheet2 tại cột B và C, bạn thử chọn 1 ô tại 2 cột đó, từ hàng 3 trở đi sẽ thấy nó.

Gõ từ khóa chúng sẽ hiện ra tương ứng, không nhất thiết phải gõ từ đầu câu, chỉ cần gõ bất kỳ cụm từ nào trong đó và không phân biệt chữ thường hoặc chữ hoa.

Ví dụ: Chuỗi là Hoang Trong Nghia, bạn chỉ cần gõ trong (Trong, TRONG, ...), hoặc gõ oang (OANG, oAng, ...) thì những mục có chứa các từ đó sẽ hiển thị để bạn chọn.

Đây là toàn bộ code của bài này (code trong Module của Sheet2):

Mã:
Private priArray
Private priColumn As Long
Private priIsFocus As Boolean


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Count = 1 And Target.Row > 2 Then
        Dim e As Long
        Static ArrCode, ArrName
        If Target.Column = 2 Then
            If Not IsArray(ArrCode) Then
                e = Sheet1.Range("B" & Rows.Count).End(xlUp).Row
                ArrCode = Sheet1.Range("B2:C" & e).Value2
            End If
            priColumn = 1
            priArray = ArrCode
            Call HienComboBox
        ElseIf Target.Column = 3 Then
            If Not IsArray(ArrName) Then
                Dim ArrTmp
                Dim r As Long, u As Long
                e = Sheet1.Range("B" & Rows.Count).End(xlUp).Row
                ArrTmp = Sheet1.Range("B2:B" & e).Value2
                ArrName = Sheet1.Range("C2:C" & e).Value2
                u = UBound(ArrName)
                ReDim Preserve ArrName(1 To u, 1 To 2)
                For r = 1 To u
                    ArrName(r, 2) = ArrTmp(r, 1)
                Next
            End If
            priColumn = -1
            priArray = ArrName
            Call HienComboBox
        Else
            Call AnComboBox
        End If
    Else
        Call AnComboBox
    End If
End Sub


Private Sub ComboBox1_Change()
    If priIsFocus Then Exit Sub
    If ComboBox1.MatchFound Then
        ActiveCell.Value = ComboBox1.Text
        ActiveCell.Offset(, priColumn).Value = ComboBox1.Column(1)
    Else
        ActiveCell.Value = ""
        ActiveCell.Offset(, priColumn).Value = ""
    End If
End Sub


Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    On Error Resume Next
    Select Case KeyCode
    Case 9, 16, 17, 37 To 40
    Case 13
        ActiveCell.Offset(1).Activate
    Case Else
        Dim strValue As String
        strValue = LCase(ComboBox1.Text)
        ComboBox1.ListRows = 20
        If Trim(strValue) > "" Then
            If IsArray(priArray) Then
                Dim ArrFilter, GetRow()
                Dim c As Long, i As Long, n As Long, r As Long
                For r = 1 To UBound(priArray, 1)
                    If LCase(priArray(r, 1)) Like "*" & strValue & "*" Then
                        n = n + 1
                        ReDim Preserve GetRow(1 To n)
                        GetRow(n) = r
                    End If
                Next
                If n Then
                    Dim u As Byte
                    u = UBound(priArray, 2)
                    ReDim ArrFilter(1 To n, 1 To u)
                    For r = 1 To n
                        For c = 1 To u
                            ArrFilter(r, c) = priArray(GetRow(r), c)
                        Next
                    Next
                    ComboBox1.List = ArrFilter
                Else
                    ComboBox1.Clear
                    ComboBox1.ListRows = 0
                End If
                ComboBox1.DropDown
            End If
        Else
            If ComboBox1.ListCount <> UBound(priArray) Then
                ComboBox1.List = priArray
                ComboBox1.DropDown
            End If
        End If
    End Select
End Sub


Private Sub HienComboBox()
    priIsFocus = True
    With ComboBox1
        .Visible = False
        .Visible = True
        .Left = ActiveCell.Left
        .Top = ActiveCell.Top
        .Width = ActiveCell.Width
        .ListWidth = .Width + ActiveCell.Offset(, priColumn).Width
        .ColumnWidths = .Width - 4
        .Height = ActiveCell.Height
        .List = priArray
        .Text = ""
        .Text = ActiveCell.Value
        .Activate
        .SelStart = 0
        .SelLength = Len(.Text)
    End With
    priIsFocus = False
End Sub


Private Sub AnComboBox()
    With ComboBox1
        If .Visible Then
            .Visible = False
        End If
    End With
End Sub


HƯỚNG DẪN GIÙM MÌNH CỤ THỂ CÁCH TẠO CÁI NÀY ĐƯỢC K Ạ
 
Tìm kiếm và lọc giá trị trong danh sách nhiều cột trong Excel



Nếu bạn cài Add-in A-Tools Free thì các yêu cầu cảu bạn được đáp ứng một cách trọn vẹn. Đây là chức năng, là phương pháp thiết kế tối ưu nhất trong Excel nhờ vào tích hợp hộp nhập dữ liệu của chính Excel. Bạn không phải lập trình, chỉ dùng chuột kéo thả. Ngoài drop list bạn còn nhập theo nhiều kiểu, chọn nhiều giá trị, giá trị từ nhiều cột, nhập ngày tháng bằng click chuột in danh sách giá trị chọn,...


DOWNLOAD Add-in A-Tools Free
[QUOTE


SAO E LÀM ĐÚNG NHƯ HƯỚNG DẪN MÀ FILE CỦA EM ĐÁNH TÌM KIẾM KHÔNG TÌM HẾT MÃ ĐƯỢC Ạ
 

File đính kèm

  • NHẬP LIỆU BÁO CÁO.xlsx
    78.7 KB · Đọc: 62
nhờ anh nghĩa viết dùm câu lệnh VBA, em có dũ liệu theo sheet 1, trong sheet 2 em muốn tạo list danh sách dò theo ký tự cho nhanh tương ứng từng cột trong sheet 1
 

File đính kèm

  • Book1.xlsx
    8.9 KB · Đọc: 9
Chào bạn Hpkhuong,
Hàng tồn kho ở sheet Data là unique của tổ hợp
Mã hàng - Mã phụ - Lô - Kho
Xin gíup cho dropdown list nhập cả tổ hợp và hàng tồn kho để gợi ý nhập vào phiếu xuất.
Cám ơn bạn
 

File đính kèm

  • Tim Kiem - goi y nhanh .xlsb
    37.3 KB · Đọc: 37
Chào bạn Hpkhuong,
Hàng tồn kho ở sheet Data là unique của tổ hợp
Mã hàng - Mã phụ - Lô - Kho
Xin gíup cho dropdown list nhập cả tổ hợp và hàng tồn kho để gợi ý nhập vào phiếu xuất.
Cám ơn bạn
Tôi thấy File trong bài 1 của Topic kia của bạn (link bên dưới) giống File bài này, tại Topic đó sao bạn không hỏi cụ thê, rõ ràng để các thành viên trợ giúp cho bạn.

Tôi có góp ý tại Bài 9 Topic này: Xin Hỏi về Dropdown nhiều cột
 
Lần chỉnh sửa cuối:
Tôi thấy File trong bài 1 của Topic kia của bạn (link bên dưới) giống File bài này, tại Topic đó sao bạn không hỏi cụ thê, rõ ràng để các thành viên trợ giúp cho bạn.

Tôi có góp ý tại Bài 9 Topic này: Xin Hỏi về Dropdown nhiều cột
Tại topic đó người ta viết quá rõ trong bài và trong tập tin
Hiện tại danh sách thả xuống chỉ hiển thị và nhập 2 cột, vui lòng giúp tăng lên 4 cột
Mã hàng Mã phụ Lô Số lượng tồn
Và khi thêm dữ liệu vào sheet1, thì không cần phải đóng rồi mở lại file.
Tức người ta đã có trong ComboBox 2 cột rồi. Bây giờ người ta muốn có 4 cột. Còn chuyện đóng rồi mở lại file thì bạn thử làm như sau sẽ hiểu: chọn B3 -> chọn giá trị trong ComboBox -> chọn vd. D3 -> sang sheet1 -> nhập thêm dữ liệu -> về lại Sheet2 -> chọn B4 -> trong ComboBox không có dữ liệu mới nhập ở Sheet1. Khi đóng và mở lại thì trong ComboBox mới có dữ liệu nhập thêm.

Người ta viết thế là quá rõ rồi.
 
Tại topic đó người ta viết quá rõ trong bài và trong tập tin

Tức người ta đã có trong ComboBox 2 cột rồi. Bây giờ người ta muốn có 4 cột. Còn chuyện đóng rồi mở lại file thì bạn thử làm như sau sẽ hiểu: chọn B3 -> chọn giá trị trong ComboBox -> chọn vd. D3 -> sang sheet1 -> nhập thêm dữ liệu -> về lại Sheet2 -> chọn B4 -> trong ComboBox không có dữ liệu mới nhập ở Sheet1. Khi đóng và mở lại thì trong ComboBox mới có dữ liệu nhập thêm.

Người ta viết thế là quá rõ rồi.
Tôi cũng nêu rõ rồi mà "File trong bài này giống File bài 1 của Topic kia", có nghĩa là File giống nhau thì tại sao không hỏi tại Topic của mình để các thành viên giúp tập trung hơn.
Đương nhiên nội dung Topic kia tôi có xem rồi mới biết là ComboBox và có góp ý là sử dụng UserForm với Listbox.
 
Mình thấy đoạn code này rất hay tuy nhiên có 1 số hạn chế:
- Khi chọn được mã cần chọn gõ enter hay phím mũi tên vẫn không xuống dòng.
- Nếu copy nhiều dòng paste vào file này là không được
Không biết có bác nào có thể khắc phục được hạn chế trên không?
 

File đính kèm

  • drop-down-list-HTN.xlsm
    28.5 KB · Đọc: 38
Tôi cũng nêu rõ rồi mà "File trong bài này giống File bài 1 của Topic kia", có nghĩa là File giống nhau thì tại sao không hỏi tại Topic của mình để các thành viên giúp tập trung hơn.
Đương nhiên nội dung Topic kia tôi có xem rồi mới biết là ComboBox và có góp ý là sử dụng UserForm với Listbox.
Ý tôi là người ra viết rất rõ ràng mà bạn lại trách người ta
tại Topic đó sao bạn không hỏi cụ thê, rõ ràng để các thành viên trợ giúp cho bạn
 
Anh ơi trong cùng 1 sheet mình tạo nhiều drop list như vậy được không
Trong sheet đó chỉ có 1 Combobox bạn nhé!
Sheet đã có sự kiện Selection_Change để hiện Combobox khi chọn các ô trong Excel.
Tôi hiểu bạn muốn chọn các ô khác nhau thì hiện các danh sách khác nhau đúng không?
 
Bạn cần giúp gì thì phải đưa file dữ liệu giả định lên thì mọi người mới giúp được nhé!
Em cần làm nhiều list tại các cột tô màu, nhưng khi chọn cột nào trước thì các cột khác lại ra kết quả như nhau. Nhờ hướng dẫn giúp
 

File đính kèm

  • CODE_Danh_Sach.xlsm
    473.7 KB · Đọc: 18
Em cần làm nhiều list tại các cột tô màu, nhưng khi chọn cột nào trước thì các cột khác lại ra kết quả như nhau. Nhờ hướng dẫn giúp
File của bạn còn thiếu danh mục tỉnh thành, danh mục quận huyện. Bạn bổ sung luôn đi tôi làm cho bạn luôn một lần.
 
Em cần làm nhiều list tại các cột tô màu, nhưng khi chọn cột nào trước thì các cột khác lại ra kết quả như nhau. Nhờ hướng dẫn giúp
Cái này nên sử dụng UserForm với ComboBox phụ thuộc nha bạn, Chọn tỉnh sẽ chỉ xuất hiện huyện của tỉnh đó, chọ huyện sẽ xuất hiện số xã của huyện đó.
 
Web KT
Back
Top Bottom