Tìm kiếm nhanh trong drop down list (1 người xem)

Liên hệ QC

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

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

Ở 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

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
 
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

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:
 
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

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: 238
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 . +-+-+-++-+-+-+
 

File đính kèm

Hic...hic...mấy huynh chém kinh thế... Hix hông biết tại sao tôi cũng lỗi tương tự...Chắc do nó xung đột gì với hệ thống nên đâm ra "Microsoft Excel has stopped working" đây mà...: Ai biết sữa lỗi thì mách nước giúp đi...}}}}}}}}}}}}}}}
Vậy thôi, nếu ta không tìm ra được nguyên nhân cũng như cách khắc phục thì ta đừng có dùng ListBox trong Sheet nữa, xài ComboBox được rồi. Cái nào khó quá bỏ qua.

Giống như tôi trước thích dùng ListView trên UserForm, bị vài lỗi sống dỡ chết dỡ nên chuyển qua dùng ListBox (trên UserForm à nha, không phải trên Sheet). Kể cả cái Calendar Control cũng vậy, nên tự tạo Calendar 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

Trân trọng!

Đọc bài này cũng lâu rồi, hôm nay hơi rảnh làm thử cho bạn 1 File nhập liệu nhanh xem có dùng được không?
 

File đính kèm

Lần chỉnh sửa cuối:
a ơi a sửa giúp e cái file này của e được k ạ?

- Bước 1: Nhấn nút chọn hàng hóa, Form hiện ra chọn loại và nhấn nút lọc, tiếp theo chọn hàng hóa muốn nhập hóa đơn xong nhấn nút Nhập giá.

- Bước 2: In hóa đơn xong nhấn nút Lưu hóa đơn.
 

File đính kèm

Gửi Các Anh Em

nhờ mọi người giúp đỡ mình làm cái file tổng hợp theo dõi hóa đơn
mình không phải dân kế toán chuyên nghiệp. hiện tại bên mình đang làm phiếu xuất kho theo kiểu mỗi khách hàng một phiếu xuất kho sau đó tự tổng hợp bằng tay vào bảng tổng hợp. nên rất mất thời gian và dễ sai sot . mình có xem qua file hóa đơn của anh be09 mình rất thích. nhưng áp dụng sang bên mình thì lại không được. và cũng không hiểu vì sao làm được như vậy dù đã mày mò mấy hôm nay.
về cơ bản yêu cầu của mình tương tự như file anh gửi là:
tạo một file phiếu xuất
Có thể chọn hàng hóa , sau đó tự điện giá
lưu fiel phiếu xuất vào file theo dõi phiếu xuất ( tuy nhiên ở đây mình yêu cầu hơi khó hơn đó là khi lưu file phiếu xuất thì các mặt hàng sẽ được thể hiện riêng rẽ như trong file đính kèm để mình dễ theo dõi, phần tiền phải thu sẽ giống như phần tiền phải thu trong phiếu xuất )
vậy rất kính mong ai đó có thể giúp mình ( thực sự cái này trăn trở rất lâu mà không tìm ra giải pháp ) mình cũng sẽ xin cảm ơn và hậu tạ
mình đang rất cần nên bạn nào giúp được xin giúp sớm cho mình
 

File đính kèm

Gửi Các Anh Em

nhờ mọi người giúp đỡ mình làm cái file tổng hợp theo dõi hóa đơn
mình không phải dân kế toán chuyên nghiệp. hiện tại bên mình đang làm phiếu xuất kho theo kiểu mỗi khách hàng một phiếu xuất kho sau đó tự tổng hợp bằng tay vào bảng tổng hợp. nên rất mất thời gian và dễ sai sot . mình có xem qua file hóa đơn của anh be09 mình rất thích. nhưng áp dụng sang bên mình thì lại không được. và cũng không hiểu vì sao làm được như vậy dù đã mày mò mấy hôm nay.
về cơ bản yêu cầu của mình tương tự như file anh gửi là:
tạo một file phiếu xuất
Có thể chọn hàng hóa , sau đó tự điện giá
lưu fiel phiếu xuất vào file theo dõi phiếu xuất ( tuy nhiên ở đây mình yêu cầu hơi khó hơn đó là khi lưu file phiếu xuất thì các mặt hàng sẽ được thể hiện riêng rẽ như trong file đính kèm để mình dễ theo dõi, phần tiền phải thu sẽ giống như phần tiền phải thu trong phiếu xuất )
vậy rất kính mong ai đó có thể giúp mình ( thực sự cái này trăn trở rất lâu mà không tìm ra giải pháp ) mình cũng sẽ xin cảm ơn và hậu tạ
mình đang rất cần nên bạn nào giúp được xin giúp sớm cho mình

Góp ý cho bạn:

1/ Bạn nên nêu yêu cầu cụ thể cần tổng cái gì? Vì xem nội dung phieu xuat với sheet theo doi phieu xuat thì tiêu đề nó khâu ăn nhậu gì với nhau nên chưa hiểu được ý định của bạn.

2/ Với File của bạn thì phải thiết kế lại mới phù hợp với việc dùng phieu xuat nhập liệu vào sheet theo doi phieu xuat và có thể truy vấn phiếu xuất khi cần.
 
Xin lỗi mọi người vì cách diễn đạt của mình.vì từ trước đến nay mình làm thủ công đúng như file mình gửi ( tức là đánh phiếu xuất xong vào thủ công vào trong phần tổng hợp theo dõi đơn hàng tứng khách hàng, từng mặt hàng sau đó tổng hợp báo cáo theo nhân viên theo mặt hàng để gửi sếp) nên thực sự về mặt diễn đạt ình chưa biết diễn đạt ra sao
nôm na yêu cầu cụ thể của mình đó là :
- tổng hợp lại các đơn hàng đã xuất đầy đủ theo từng mặt hàng, theo nhân viên để sau này làm bản tổng hợp báo cáo tổng theo mặt hàng theo nhân viên cho sếp.
mình xin cảm ơn
 
- Bước 1: Nhấn nút chọn hàng hóa, Form hiện ra chọn loại và nhấn nút lọc, tiếp theo chọn hàng hóa muốn nhập hóa đơn xong nhấn nút Nhập giá.

- Bước 2: In hóa đơn xong nhấn nút Lưu hóa đơn.
Trước hết các ơn anh về file rất hay này.
Anh cho e hỏi cách tạo cái nút: chọn hàng hóa, lưu hóa đơn, xóa hóa đơn kia.
Thank.
 
Trước hết các ơn anh về file rất hay này.
Anh cho e hỏi cách tạo cái nút: chọn hàng hóa, lưu hóa đơn, xóa hóa đơn kia.
Thank.

Cái nút đó làm vầy:

Trên Ribbon vào INSERT > Shapes > Rectangles chọn 1 kiểu rồi vẽ vào bảng tình, xong vào HOME và chọn Fill Color (màu nền), Font Color (màu chữ), click phải chuột chọn Edit Text và gõ chữ vào Shapes. Tiếp theo click phải chuột chọn Assign Macro (để gán Macro cho nút vừa chọn) cửa sổ Assign Macro hiện ra, trong khung lớn chọn tên 1 Macro và nhấn OK.

Cái nút đó có nhiều cách để làm (có thể lấy bất kỳ hình ảnh nào cũng được), nhưng quan trọng là làm sao viết code Macro đúng với từng chức năng của nó.

Để xem code: Nhấn Alt+F11, để trở ra bảng tính lại nhấn Alt+F11.
 
- Bước 1: Nhấn nút chọn hàng hóa, Form hiện ra chọn loại và nhấn nút lọc, tiếp theo chọn hàng hóa muốn nhập hóa đơn xong nhấn nút Nhập giá.

- Bước 2: In hóa đơn xong nhấn nút Lưu hóa đơn.
Chào anh!
Em muốn nhờ anh chút:
Em đang lập file quản lý hàng hóa.
Trong file của em, Mỗi mã hàng đều có giá cả số lượng, và nằm ngẫu nhiên ở các kho hàng khác nhau.(Có nhiều kho hàng, trong file e thì B1, B2... là các kho hàng).
Hằng ngày e bán hàng đều phải xuất phieus ở sheet "Hoa don".
Nhu cầu của e như thế này:
1. Có sheet để quản lý được lượng hàng bán ra.
2. Hàng xuất ra ở kho nào thì ở sheet kho đấy phải trừ luôn số lượng hàng hóa.
3. Muốn chuyển hàng từ kho này sang kho kia ( tự động cộng vs trừ ở các kho cho nhau).
4. Hàng nhập về các kho.
5. Quản lý được lượng hàng tồn ở trong các kho.
6. Em muốn tìm kiếm một mã hàng, biết được mã hàng này nằm ở những kho nào? Giá cả và số lượng bao nhiêu?
Bác sửa file giúp em nhé.
Thật cảm ơn bác rất nhiều.
 

File đính kèm

Chào anh!
Em muốn nhờ anh chút:
Em đang lập file quản lý hàng hóa.
Trong file của em, Mỗi mã hàng đều có giá cả số lượng, và nằm ngẫu nhiên ở các kho hàng khác nhau.(Có nhiều kho hàng, trong file e thì B1, B2... là các kho hàng).
Hằng ngày e bán hàng đều phải xuất phieus ở sheet "Hoa don".
Nhu cầu của e như thế này:
1. Có sheet để quản lý được lượng hàng bán ra.
2. Hàng xuất ra ở kho nào thì ở sheet kho đấy phải trừ luôn số lượng hàng hóa.
3. Muốn chuyển hàng từ kho này sang kho kia ( tự động cộng vs trừ ở các kho cho nhau).
4. Hàng nhập về các kho.
5. Quản lý được lượng hàng tồn ở trong các kho.
6. Em muốn tìm kiếm một mã hàng, biết được mã hàng này nằm ở những kho nào? Giá cả và số lượng bao nhiêu?
Bác sửa file giúp em nhé.
Thật cảm ơn bác rất nhiều.

Bạn nên tiếp tục hỏi ở bài viết "Quản lý bán hàng bằng Excel" cho đúng với chủ đề của Topic, đây là Link bài viết:

http://www.giaiphapexcel.com/forum/...-hàng-bằng-Excel&p=743945&posted=1#post743945

Nếu trả lời cho bạn ở Topic này tôi sẽ vi phạm nội quy (vì sai chủ đề).
 
Lần chỉnh sửa cuối:
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
Cho Minh hỏi thêm với. Nếu cột mã hàng và cột tên hàng mình muốn nhập không có trong danh mục thì làm sao vậy (vì mình nhập nó sẽ trả về ô trống)
Trong list mình muốn thêm cột đơn vị tính và đơn giá nữa
Cho mình đoạn code với. Cảm ơn
 
Tìm kiếm và lọc giá trị trong danh sách nhiều cột trong Excel

Ở 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.

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
 
Lần chỉnh sửa cuối:
nếu muốn chỉnh sửa ô chứa vị trí hoặc vùng và thêm dòng tìm kiếm mình mình sửa sao vậy a
 
Hic...hic...mấy huynh chém kinh thế... Hix hông biết tại sao tôi cũng lỗi tương tự...Chắc do nó xung đột gì với hệ thống nên đâm ra "Microsoft Excel has stopped working" đây mà...: Ai biết sữa lỗi thì mách nước giúp đi...}}}}}}}}}}}}}}}
File của anh hpkhuong gần cả năm rồi, không biết có ai ghé qua giải quyết dùm !
 
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 dùng code của anh cho file của em,

Nhưng hiện tại sheet đó có chứa code lấy hình ảnh nữa:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Rng As Range, PicName As String
  Application.ScreenUpdating = False
  On Error Resume Next
  If Not Intersect([B6], Target) Is Nothing Then
    Set Rng = Sheet21.Range(Sheet21.[B6], Sheet21.[Z65536].End(xlUp))
    PicName = Rng.Resize(, 1).Find(Target, LookAt:=xlWhole).Offset(, 24)
    ActiveSheet.Shapes("Pic").Delete
    With ActiveSheet.Pictures.Insert(ThisWorkbook.Path & "\" & PicName)
     .Name = "Pic"
     .Left = [z6:z6].Left: .Top = [z6:z6].Top
     .Width = [z6:z6].Width: .Height = [z6:z6].Height
   End With
  End If
End Sub

Làm thế nào để sử dụng được cả 2 code trong 1 sheet? Mong các anh chị giúp
 
Lần chỉnh sửa cuối:
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ờ 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

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

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

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

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 đó.
 
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 đó.
Người ta thích đơn giản, chứ cái này dùng Name và Dropdown List (Validation) phụ thuộc nhau là được.
 

File đính kèm

Dạ nó nằm trong Sheet PL03 đó, giúp em nhé.
Chắc bạn chưa làm hành chính bao giờ nhỉ? Cái sheet bạn nói chỉ đúng với danh mục Phường Xã mà thôi, còn danh mục Quận huyện và danh mục Tỉnh thành hoàn toàn không phải vậy nha bạn!

1632974385284.png
 
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.
Dear Anh Nghĩa,
Nhờ anh làm giúp em file này với ạ.
Tìm kiếm tên và mã dự án ở cột em tô vàng sheet kế hoạch ạ.
Dữ liệu được cập nhật ở sheet danh mục.
Em cảm ơn anh nhiều ạ.
 

File đính kèm

Dear Anh Nghĩa,
Nhờ anh làm giúp em file này với ạ.
Tìm kiếm tên và mã dự án ở cột em tô vàng sheet kế hoạch ạ.
Dữ liệu được cập nhật ở sheet danh mục.
Em cảm ơn anh nhiều ạ.
Tôi chẳng biết làm gì cho bạn trong cái topic này nữa! Bạn nói chi tiết, cụ thể như thế nào.
 
Em thấy code của a Nghĩa, khi thêm mới mã ở danh mục hoặc sửa lại tên, khi chọn không thấy tự động cập nhật luôn (vẫn thông tin cũ hoặc chưa có mã bổ sung). Chỗ này phải tắt file đi rồi mở lại mới cập nhật thêm thông tin
 
Ch
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

Ở 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.
Chào bạn Nghĩa.
Mình có File dữ liệu gốc tương tự bạn hướng dẫn mà mình làm mãi không được. Nhờ bạn chỉ giáo giúp mình với à. Vì mình không rành về code à. Mình có gửi kèm File có tô ô màu vàng là Ô cần hỏi à.
Xin trân trọng cám ơn
Văn Nguyễn
 

File đính kèm

Name chưa có địa chỉ:
chọn sheet DMKH_NCC,
Ô địa chỉ, type: dmkhncc
 

File đính kèm

  • Untitled.png
    Untitled.png
    7.8 KB · Đọc: 4
Lần chỉnh sửa cuối:
Qua Sheet NHAPLIEU thử chọn cell các cột R,S,T coi được chưa...
 
Qua Sheet NHAPLIEU thử chọn cell các cột R,S,T coi được chưa...
được rồi bạn. vấn đề là mỗi lần bấm xổ xuống trong Filter mình gõ tìm kiếm cho nhanh đó. Còn vấn đề chèn code của bạn nghĩa mình không áp dụng được. Nếu được nhờ bạn chèn vào thử xem
 

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

Back
Top Bottom