Tìm kiếm nhanh trong drop down list

Liên hệ QC

donhungtin2013

Thành viên mới
Tham gia
14/8/14
Bài viết
171
Được thích
4
Ở sheet 2 của file đính kèm khi em kích vào nút drop down list để chọn mã hàng mình cần, có cách nào khi mình kích vào nút xoả xuống nó sẽ hiện hộp thoại để mình gõ vào đó mặt hàng cần tìm cho nhanh hoặc mình chỉ cần gõ P01A- nó sẽ hiện ra những mặt hàng có chữ bắt đầu bằng P01A như trong nút search của filter không? Mọi người giúp em với, em cảm ơn nhiều.
 

File đính kèm

  • drop down list.xlsx
    11.4 KB · Đọc: 385
Ở sheet 2 của file đính kèm khi em kích vào nút drop down list để chọn mã hàng mình cần, có cách nào khi mình kích vào nút xoả xuống nó sẽ hiện hộp thoại để mình gõ vào đó mặt hàng cần tìm cho nhanh hoặc mình chỉ cần gõ P01A- nó sẽ hiện ra những mặt hàng có chữ bắt đầu bằng P01A như trong nút search của filter không? Mọi người giúp em với, em cảm ơn 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
 

File đính kèm

  • drop-down-list-HTN.xlsm
    28.5 KB · Đọc: 1,044
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
Lâu quá mới thấy anh Nghĩa xuất chiêu, cái này hay quá.
 
Lâu quá mới thấy anh Nghĩa xuất chiêu, cái này hay quá.

bạn thử thể hiện sự ngưỡng mộ ấy bằng cách làm cho code trên ảo thêm tí nữa đi .
thí dụ hiện tại thì không thể dùng các phím mũi tên di chuyển qua lại giữa các ô trong vùng [B:C]
bạn thử nghĩ cách làm xem sao ? hi hi @$@!^%@$@!^%
 
bạn thử thể hiện sự ngưỡng mộ ấy bằng cách làm cho code trên ảo thêm tí nữa đi .
thí dụ hiện tại thì không thể dùng các phím mũi tên di chuyển qua lại giữa các ô trong vùng [B:C]
bạn thử nghĩ cách làm xem sao ? hi hi @$@!^%@$@!^%
Bác lại làm khó em hoài, thôi thử đại có gì bác góp ý nghe. Chổ màu đỏ là em mới thêm vào.
Mã:
Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    On Error Resume Next
[COLOR=#ff0000]    If KeyCode = 39 Then[/COLOR]
[COLOR=#ff0000]        ActiveCell.Offset(, 1).Activate[/COLOR]
[COLOR=#ff0000]        Exit Sub[/COLOR]
[COLOR=#ff0000]    ElseIf KeyCode = 37 Then[/COLOR]
[COLOR=#ff0000]        ActiveCell.Offset(, -1).Activate[/COLOR]
[COLOR=#ff0000]        Exit Sub[/COLOR]
[COLOR=#ff0000]    End If[/COLOR]
    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
 
bạn thử thể hiện sự ngưỡng mộ ấy bằng cách làm cho code trên ảo thêm tí nữa đi .
thí dụ hiện tại thì không thể dùng các phím mũi tên di chuyển qua lại giữa các ô trong vùng [B:C]
bạn thử nghĩ cách làm xem sao ? hi hi @$@!^%@$@!^%

Chuyện...đơn giản quá với bạn í mà lị. Bạn dove cứ chờ xem...-=.,,-=.,,-=.,,
 
mình sợ nó không đơn giản ấy chứ , nếu anh nào thấy đơn giản thì anh đó giỏi quá rồi +-+-+-++-+-+-+

Hồi trước mình có hỏi làm sao để nhận biết khi nào dropdown cũng vì vấn đề này. Giờ thì mọi sự đã được kiểm soát! Dĩ nhiên là các phím định hướng không đơn giản như phím Enter rồi!
 
Mình tình cờ đọc được code drop down list của anh Hoàng Trọng Nghĩa, down về thử thấy rất hay, có thể ứng dụng trong công việc của mình, nhưng mình không biết sử dụng nó thế nào, mong anh Nghĩa chỉ dùng, rất cám ơn. Tức là làm sao gán code vào cell tìm kiếm đó. Và gán danh sách tìm nữa.
 
Mình tình cờ đọc được code drop down list của anh Hoàng Trọng Nghĩa, down về thử thấy rất hay, có thể ứng dụng trong công việc của mình, nhưng mình không biết sử dụng nó thế nào, mong anh Nghĩa chỉ dùng, rất cám ơn. Tức là làm sao gán code vào cell tìm kiếm đó. Và gán danh sách tìm nữa.
Thì bạn gửi cái file bạn lên đây, rồi nói danh sách nào cần chọn, nơi nào cần show ra v.v... thì mình sẽ làm cho. Còn chì từng tí chắc khó có thể diễn giải hết cho bạn hiểu.
 
Chào Anh Hoàng Trọng Nghĩa và các A/C GPE

Down và xem code của Anh Nghĩa viết rất hay, tuy nhiên em lại không biết gì về code nên không thể tự ứng dụng vào file của mình được. Em xin gởi file của em lên nhờ Anh Nghĩa hướng dẫn giúp ạ

File của em cũng gồm 2 sheet, sheet1 là danh mục vật tư, sheet2 là bảng kê soạn hàng. Em muốn trong cột A của sheet2 (từ ô A7) có thể chọn nhanh Tên vật tư của sheet1 (khi drop down hiển thị tên vật tư và đơn giá - như trong code của Anh là hiển thị tên và mã)

Rất mong nhận được giúp đỡ của Anh

Cám ơn Anh rất nhiều

Trân trọng!
 

File đính kèm

  • TIM KIEM NHANH.xlsx
    10.4 KB · Đọc: 170
Lần chỉnh sửa cuối:
Lâu quá mới thấy anh Nghĩa xuất chiêu, cái này hay quá.

Hoàng Trọng Nghĩa có hay ho gì đâu, qua Đồng Nai anh cho 1 xị là đứt bóng, lúc này chỉ có líu lưỡi chứ đâu còn code két gì được nữa.

Có ai dám qua Đồng Nai thì lên tiếng, ở đây có thành viên CẠO LẤY GÌ GỘI?, (sẳn sàng chìu tới bến, thấy ngán chưa)
 
Lần chỉnh sửa cuối:
Anh Hoàng Trọng Nghĩa có thể giúp đỡ em được không ạ.

Cám ơn Anh rất nhiều
 
Lâu quá mới thấy anh Nghĩa xuất chiêu, cái này hay quá.
anh Nghĩa có thể chỉ giúp e vấn đề này, ở file anh làm ở đây là a cố định cột, e có file nhập liệu bây giờ e đưa code này vào thay đổi tên cột cho đúng với phần nhập liệu của e thì phải vào đâu đoạn code này để thay đổi (ở đây số cột của e có khoảng 5-6 cột:
 
Anh Hoàng Trọng Nghĩa có thể giúp đỡ em được không ạ.

Cám ơn Anh rất nhiều

Bạn có thể Inbox file thật cho tôi. Tôi làm cho... (có thể khác cách của HTN ở trên) nhưng sẽ dễ dàng Edit theo ý muốn hơn là code của HTN...

P/s: Inbox file thật muốn làm của bạn, rồi tôi xem và code cho file đó...Tôi không code file ví dụ...vì sẽ mất công sửa code hoặc là bạn sẽ không áp dụng được cho file thật!
 
Chào Anh Hpkhuong,

Em không biết các đính kèm file khi gởi tin nhắn vào inbox của Anh nên em xin up lên đây luôn.

Chắc không chỉ riêng em mà rất nhiều bạn đều mong muốn có thể nhập liệu nhanh tại ô mà tại ô đó có thể truy xuất nhanh đến vùng dữ liệu nguồn. Rất mong sẽ nhận được hướng dẫn cùa anh, để em và mọi người có thể ứng dụng vào công việc của mình

Cám ơn Anh

Trân trọng
 

File đính kèm

  • TIM KIEM NHANH.xlsx
    13.8 KB · Đọc: 126
Chào Anh Hpkhuong,

Em không biết các đính kèm file khi gởi tin nhắn vào inbox của Anh nên em xin up lên đây luôn.

Chắc không chỉ riêng em mà rất nhiều bạn đều mong muốn có thể nhập liệu nhanh tại ô mà tại ô đó có thể truy xuất nhanh đến vùng dữ liệu nguồn. Rất mong sẽ nhận được hướng dẫn cùa anh, để em và mọi người có thể ứng dụng vào công việc của mình

Cám ơn Anh

Trân trọng

1. Giới hạn cho bạn nhập liệu từ dòng 7 -> 100.
2. Khi dòng nào đã có dữ liệu (đã có tên sản phẩm) thì khi đưa chuột hoặc dùng phím di chuyển vào dòng này thì sẽ không hiển thị công cụ nhập liệu, khi dòng này ko có dữ liệu thì ngược lại là công cụ sẽ được hiện
3. Khi đã hiện thì bạn gõ vào ngay cái Textbox (Textbox được code tự động canh vừa trong Cells hiện hành) bạn chỉ việc gõ ký tự gần đúng của tên sản phẩm cần tìm... thì bên dưới Listbox sẽ lọc và hiện ra kết quả bên dưới...

Nếu xóa trắng tại text box, hoặc xóa từng ký tự, hay xóa hết...thì listbox hiện full danh sách...

Ví dụ: Bạn có tên của nhiều loại thẻ nhớ (16GB, 32GB, 64GB,128GB,...)
Thì khi tìm tại TextBox bạn chỉ cần gõ: nhớ thì nó rẽ ra toàn bộ các thẻ nhớ...Muốn gới hạn lại dung lượng thì bạn chỉ cần gõ thêm: dung lượng phía sau: ví dụ : nhớ 1 thì nó sẽ ra là loại 16 và 128, nếu gõ nhớ 6 thì nó lại ra loại 16 và 64...
Tùy bạn muốn tìm như nào...thì gõ vào...có thể gõ tắt như tôi gợi ý bên trên
Nhưng việc tiếng Việt có dấu thì bắt buộc bạn phải gõ cho đúng dấu tiếng Việt & bạn có thể gõ chữ thường hay hoa đều được (không phân biệt Hoa hay thường)

4. Từ text box bạn nhấn phím Tab, hoặc mũi tên xuống..._> có thể Doubclick để nhập, hoặc nhấn enter để nhập...

Và đặc biệt tại listbox hiển thị này bạn có thể chọn nhiều:(MultiSeclect), dùng phím lên/xuống kết hợp phím Shift để select, hoặc dùng chuột quét cả đám select...Và nhấn enter để nhập toàn bộ vào bảng tính

P/s: một khi đã multiselect thì chỉ có dùng phím enter nhập nó mới đập xuống bảng tính toàn bộ...Nếu multiselect mà bạn dùng chuột Doubleclick thì nó chỉ tác dụng nhập1 dòng...

5. Nếu dòng nào đã có dữ liệu...Muốn xóa thì con trỏ đang focus ngay tại cell đó -> nhấn nút delete thì xóa trắng -> kéo theo dữ liệu tất cả các cột thuộc dòng này sẽ bị xóa theo...

Và: trên bảng tính bạn có thể Select nhiều hơn 1 dòng tại cột B này để nhấn Delete xóa...-> Kéo theo dữ liệu tương ứng tại các cột thuộc các dòng đã select sẽ xóa theo...


THÔI BẠN TỰ KHÁM PHÁ THÊM TRÊN FILE ĐI.
 

File đính kèm

  • TIM KIEM NHANH.xlsb
    39.4 KB · Đọc: 503
1. Giới hạn cho bạn nhập liệu từ dòng 7 -> 100.
2. Khi dòng nào đã có dữ liệu (đã có tên sản phẩm) thì khi đưa chuột hoặc dùng phím di chuyển vào dòng này thì sẽ không hiển thị công cụ nhập liệu, khi dòng này ko có dữ liệu thì ngược lại là công cụ sẽ được hiện
3. Khi đã hiện thì bạn gõ vào ngay cái Textbox (Textbox được code tự động canh vừa trong Cells hiện hành) bạn chỉ việc gõ ký tự gần đúng của tên sản phẩm cần tìm... thì bên dưới Listbox sẽ lọc và hiện ra kết quả bên dưới...

....
Không hiểu máy tôi có vấn đề gì không, mà khi đặt con trỏ vào TextBox, bấm nút TAB 2 lần thì nó bị như thế này (xem hình). Các bạn thử test xem sao.
 

File đính kèm

  • Error1.jpg
    Error1.jpg
    40 KB · Đọc: 236
doveandrose <== thêm 1 nạn nhân nữa đã bị "Excel has stop working" , chờ thày hpkhuong ra tay nữa vậy . +-+-+-++-+-+-+
 
Web KT
Back
Top Bottom