Tìm kiếm nhanh trong drop down list

hmhungtn

Thành viên mới
Tham gia ngày
27 Tháng tám 2012
Bài viết
24
Được thích
4
Điểm
365
Tuổi
43
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.
 

duonghychi

Thành viên mới
Tham gia ngày
17 Tháng tư 2017
Bài viết
33
Được thích
1
Điểm
165
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 ạ.
 

HO VAN DUNG

Thành viên mới
Tham gia ngày
26 Tháng hai 2019
Bài viết
2
Được thích
0
Điểm
13
Tuổi
31
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 Ạ
 

HO VAN DUNG

Thành viên mới
Tham gia ngày
26 Tháng hai 2019
Bài viết
2
Được thích
0
Điểm
13
Tuổi
31
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

anhimv

Thành viên mới
Tham gia ngày
8 Tháng mười 2013
Bài viết
4
Được thích
0
Điểm
363
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

tle2003

Thành viên hoạt động
Tham gia ngày
22 Tháng một 2007
Bài viết
111
Được thích
17
Điểm
670
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

be09

TNMT_Đồng Nai
Tham gia ngày
9 Tháng tư 2011
Bài viết
9,113
Được thích
8,777
Điểm
560
Tuổi
62
Nơi ở
Biên Hòa, Đồng Nai
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:

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
3,195
Được thích
4,770
Điểm
560
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.
 

be09

TNMT_Đồng Nai
Tham gia ngày
9 Tháng tư 2011
Bài viết
9,113
Được thích
8,777
Điểm
560
Tuổi
62
Nơi ở
Biên Hòa, Đồng Nai
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.
 

Hồn Quê

Thành viên chính thức
Tham gia ngày
4 Tháng tư 2018
Bài viết
83
Được thích
7
Điểm
170
Tuổi
30
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

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
3,195
Được thích
4,770
Điểm
560
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
 
Top Bottom