Tạo List tìm kiếm cho mã hàng hóa

Liên hệ QC

0905744404

Thành viên thường trực
Tham gia
26/10/10
Bài viết
333
Được thích
107
Nghề nghiệp
Trước là : Thủ Kho - còn giờ thì :"Tài Xế"
Chào cả nhà !!!
Em có File này nhờ mọi người giúp em với!
Yêu cầu:
- Bên Sheet "Xuất Kho" khi nhập dữ liệu vào cột F thì tự động tìm kiếm ra những ký tự có trong List tại cột G trong sheet "Bang Ma Hang Hoa"
- Ví Dụ: Nhập bánh thì trong list xuất hiện những chữ ô có chữ bánh, Hoặc nhập 360 thì xuất hiện những ô có chứa 360, Hoặc nhập 288 thì xuất hiện những ô có chứa 288 ...
Em xin cám ơn cả nhà!!!
 
Chào cả nhà !!!
Em có File này nhờ mọi người giúp em với!
Yêu cầu:
- Bên Sheet "Xuất Kho" khi nhập dữ liệu vào cột F thì tự động tìm kiếm ra những ký tự có trong List tại cột G trong sheet "Bang Ma Hang Hoa"
- Ví Dụ: Nhập bánh thì trong list xuất hiện những chữ ô có chữ bánh, Hoặc nhập 360 thì xuất hiện những ô có chứa 360, Hoặc nhập 288 thì xuất hiện những ô có chứa 288 ...
Em xin cám ơn cả nhà!!!
Đưa cái file của bạn lên đây để dễ làm, chẳng lẽ để người ta làm từ A đến Z cho bạn sao?
 
Upvote 0

File đính kèm

  • Tao list cho cho ma hang.rar
    201.6 KB · Đọc: 355
Upvote 0
Em tải file từ lâu rồi mà không thấy lên!!
Để em tải lại
Tôi có vài thắc mắc:

1) Có nhất thiết phải có cột "Chọn mã hàng" hay không? Bởi chỉ cần nhập vào mã hàng tại cột "Mã hàng" thì tự nhiên nó sẽ tính dựa trên mã hàng này. Tôi nghĩ nên bỏ đi.

2) Bạn muốn dùng List hay lập trình bằng ComboBox?
 
Upvote 0
Tôi có vài thắc mắc:

1) Có nhất thiết phải có cột "Chọn mã hàng" hay không? Bởi chỉ cần nhập vào mã hàng tại cột "Mã hàng" thì tự nhiên nó sẽ tính dựa trên mã hàng này. Tôi nghĩ nên bỏ đi.

2) Bạn muốn dùng List hay lập trình bằng ComboBox?
Em muốn tạo lits và tự động tìm kiếm những điều kiện như em đã nêu trên...
có thể viết bằng code...Tại vì trong mã hàng của em có rất nhiều mã hàng, nên phải tạo tìm kiếm như vậy.
 
Upvote 0
Em muốn tạo lits và tự động tìm kiếm những điều kiện như em đã nêu trên...
có thể viết bằng code...Tại vì trong mã hàng của em có rất nhiều mã hàng, nên phải tạo tìm kiếm như vậy.

......................................................................
 
Lần chỉnh sửa cuối:
Upvote 0
Em muốn tạo lits và tự động tìm kiếm những điều kiện như em đã nêu trên...
có thể viết bằng code...Tại vì trong mã hàng của em có rất nhiều mã hàng, nên phải tạo tìm kiếm như vậy.

1) Thay vì dùng List validation, cái này nó chỉ hiển thị đúng 1 cột, mất công phải viết nhiều code, thì tôi lại dùng ComboBox, nó vừa hiển thị được nhiều cột vừa tạo được các sự kiện để tìm kiếm theo key mà bạn gõ vào nó.

2) Tôi đã bỏ cột Chọn mã hàng vì nó không cần thiết

3) Tôi cũng Trim(Mã hàng) để chúng không có khoảng trắng đằng sau ở cột Mã hàng (cột B của sheet Bang Ma Hang Hoa).

4) Bạn tự chỉnh sửa lại công thức tại sheet In Toa

5) Tại cột Mã hàng (cột F, Xuat Kho) tôi có đặt 1 checkbox, nếu nó được check thì sẽ tìm theo Tên Hàng, còn không thì nó tìm theo Mã Hàng.

6) Nói chung, có gì thắc mắc thì bạn hỏi tiếp.

Thủ tục tạo mảng dữ liệu trong Standard Module:

Mã:
Public pubArrList
Public pubUBound As Long


Sub ArrCreate()
    Dim HangCuoi As Long
    Dim ShBangMa As Worksheet
    
    Set ShBangMa = Sheets("Bang Ma Hang Hoa")
    HangCuoi = ShBangMa.Range("B" & Rows.Count).End(xlUp).Row
    
    pubArrList = ShBangMa.Range("B2:D" & HangCuoi)
    pubUBound = UBound(pubArrList)
End Sub

Thủ tục sự kiện trong Sheet Module:

Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    With ComboBox1
        If Selection.Count = 1 And Target.Row > 2 And Target.Column = 6 Then
            If Not IsArray(pubArrList) Then
                Call ArrCreate
                .List = pubArrList
            End If
            .Visible = False
            .Text = ""
            If .ListCount < pubUBound Then
                .List = pubArrList
            End If
            .Top = Target.Top
            .Left = Target.Left
            .Height = Target.Height
            .Width = Target.Width
            .Visible = True
            .Activate
        Else
            If .Visible = True Then
                .Visible = False
            End If
        End If
    End With
End Sub


Private Sub ComboBox1_Change()
    With ComboBox1
        If .MatchFound Then
            ActiveCell.Value = .Value
            ActiveCell.Offset(, 1) = .List(, 1)
            ActiveCell.Offset(, 2) = .List(, 2)
        End If
    End With
End Sub


Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 Then
        ActiveCell.Offset(1).Select
    End If
End Sub


Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If Not IsArray(pubArrList) Then Exit Sub
    Select Case KeyCode
    Case 9, 13, 37 To 40
    Case Else
        If ComboBox1 > "" Then ComboBox1.DropDown
        
        Dim StrItem As String
        Dim n As Long, r As Long
        Dim c As Byte, col As Byte
        Dim GetRows(), ArrFilter()
        
        col = IIf(CheckBox1, 2, 1)
        
        StrItem = "*" & UCase(ComboBox1) & "*"
        
        For r = 1 To pubUBound
            If UCase(pubArrList(r, col)) Like StrItem Then
                n = n + 1
                ReDim Preserve GetRows(1 To n)
                GetRows(n) = r
            End If
        Next
        
        If n > 0 Then
            ReDim ArrFilter(1 To n, 1 To 3)
            For c = 1 To 3
                For r = 1 To n
                    ArrFilter(r, c) = pubArrList(GetRows(r), c)
                Next
            Next
            ComboBox1.List = ArrFilter
        Else
            ComboBox1.List = Array()
        End If
    End Select
End Sub
 

File đính kèm

  • TaoList.rar
    83.7 KB · Đọc: 812
Upvote 0
1) Thay vì dùng List validation, cái này nó chỉ hiển thị đúng 1 cột, mất công phải viết nhiều code, thì tôi lại dùng ComboBox, nó vừa hiển thị được nhiều cột vừa tạo được các sự kiện để tìm kiếm theo key mà bạn gõ vào nó.

2) Tôi đã bỏ cột Chọn mã hàng vì nó không cần thiết

3) Tôi cũng Trim(Mã hàng) để chúng không có khoảng trắng đằng sau ở cột Mã hàng (cột B của sheet Bang Ma Hang Hoa).

4) Bạn tự chỉnh sửa lại công thức tại sheet In Toa

5) Tại cột Mã hàng (cột F, Xuat Kho) tôi có đặt 1 checkbox, nếu nó được check thì sẽ tìm theo Tên Hàng, còn không thì nó tìm theo Mã Hàng.

6) Nói chung, có gì thắc mắc thì bạn hỏi tiếp.

Thủ tục tạo mảng dữ liệu trong Standard Module:

Mã:
Public pubArrList
Public pubUBound As Long


Sub ArrCreate()
    Dim HangCuoi As Long
    Dim ShBangMa As Worksheet
    
    Set ShBangMa = Sheets("Bang Ma Hang Hoa")
    HangCuoi = ShBangMa.Range("B" & Rows.Count).End(xlUp).Row
    
    pubArrList = ShBangMa.Range("B2:D" & HangCuoi)
    pubUBound = UBound(pubArrList)
End Sub

Thủ tục sự kiện trong Sheet Module:

Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    With ComboBox1
        If Selection.Count = 1 And Target.Row > 2 And Target.Column = 6 Then
            If Not IsArray(pubArrList) Then
                Call ArrCreate
                .List = pubArrList
            End If
            .Visible = False
            .Text = ""
            If .ListCount < pubUBound Then
                .List = pubArrList
            End If
            .Top = Target.Top
            .Left = Target.Left
            .Height = Target.Height
            .Width = Target.Width
            .Visible = True
            .Activate
        Else
            If .Visible = True Then
                .Visible = False
            End If
        End If
    End With
End Sub


Private Sub ComboBox1_Change()
    With ComboBox1
        If .MatchFound Then
            ActiveCell.Value = .Value
            ActiveCell.Offset(, 1) = .List(, 1)
            ActiveCell.Offset(, 2) = .List(, 2)
        End If
    End With
End Sub


Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 Then
        ActiveCell.Offset(1).Select
    End If
End Sub


Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If Not IsArray(pubArrList) Then Exit Sub
    Select Case KeyCode
    Case 9, 13, 37 To 40
    Case Else
        If ComboBox1 > "" Then ComboBox1.DropDown
        
        Dim StrItem As String
        Dim n As Long, r As Long
        Dim c As Byte, col As Byte
        Dim GetRows(), ArrFilter()
        
        col = IIf(CheckBox1, 2, 1)
        
        StrItem = "*" & UCase(ComboBox1) & "*"
        
        For r = 1 To pubUBound
            If UCase(pubArrList(r, col)) Like StrItem Then
                n = n + 1
                ReDim Preserve GetRows(1 To n)
                GetRows(n) = r
            End If
        Next
        
        If n > 0 Then
            ReDim ArrFilter(1 To n, 1 To 3)
            For c = 1 To 3
                For r = 1 To n
                    ArrFilter(r, c) = pubArrList(GetRows(r), c)
                Next
            Next
            ComboBox1.List = ArrFilter
        Else
            ComboBox1.List = Array()
        End If
    End Select
End Sub
Em cám ơn bác!!
Nhưng ý của em là:
- Bên Sheet "Xuất Kho" khi nhập dữ liệu vào cột F thì tự động tìm kiếm ra những ký tự có trong List tại cột G trong sheet "Bang Ma Hang Hoa"
- Ví Dụ: Nhập bánh thì trong list xuất hiện những chữ ô có chữ bánh, Hoặc nhập 360 thì xuất hiện những ô có chứa 360, Hoặc nhập 288 thì xuất hiện những ô có chứa 288 ...
 
Upvote 0
Em cám ơn bác!!
Nhưng ý của em là:
- Bên Sheet "Xuất Kho" khi nhập dữ liệu vào cột F thì tự động tìm kiếm ra những ký tự có trong List tại cột G trong sheet "Bang Ma Hang Hoa"
- Ví Dụ: Nhập bánh thì trong list xuất hiện những chữ ô có chữ bánh, Hoặc nhập 360 thì xuất hiện những ô có chứa 360, Hoặc nhập 288 thì xuất hiện những ô có chứa 288 ...

Thế bạn có gõ thử vào trong ComboBox chưa?
 
Upvote 0
Chỗ này tôi cũng đã xem qua nhưng không thể hiện được giống như tôi muốn vì chỉ tìm được những ký tụ đầu thôi,
trước khi tạo đè tài tôi đã xem rất kỹ bài này rồi. Bài này của thầy " Ndu" ma...
Túm lại là cái file tôi đưa lên bạn đã thử chưa cái đã. Mục đích của bạn chỉ là chọn một mã hàng/ tên hàng nào đó trong List rồi nhập vào bảng đó thôi, phải vậy không?
 
Upvote 0
Túm lại là cái file tôi đưa lên bạn đã thử chưa cái đã. Mục đích của bạn chỉ là chọn một mã hàng/ tên hàng nào đó trong List rồi nhập vào bảng đó thôi, phải vậy không?
Như vậy đã rất tuyệt rồi, nhưng em muốn tham hơn một chút nữa:
khi nhập vào dữ liệu mà không cần dùng ComboBox mà vẫn tìm được như vậy có được không?
Im Lặng + Cám Ơn = Đồng ý
 
Upvote 0
Chào cả nhà !!!
Em có File này nhờ mọi người giúp em với!
Yêu cầu:
- Bên Sheet "Xuất Kho" khi nhập dữ liệu vào cột F thì tự động tìm kiếm ra những ký tự có trong List tại cột G trong sheet "Bang Ma Hang Hoa"
- Ví Dụ: Nhập bánh thì trong list xuất hiện những chữ ô có chữ bánh, Hoặc nhập 360 thì xuất hiện những ô có chứa 360, Hoặc nhập 288 thì xuất hiện những ô có chứa 288 ...
Em xin cám ơn cả nhà!!!

Bạn tham khảo file này của tôi
http://www.giaiphapexcel.com/forum/attachment.php?attachmentid=124260&d=1403860513
 
Upvote 0
Như vậy đã rất tuyệt rồi, nhưng em muốn tham hơn một chút nữa:
khi nhập vào dữ liệu mà không cần dùng ComboBox mà vẫn tìm được như vậy có được không?
Im Lặng + Cám Ơn = Đồng ý

Vậy chứ sẽ nhập vô đâu? Và cái gì hiển thị những thứ đó?
 
Upvote 0
1) Thay vì dùng List validation, cái này nó chỉ hiển thị đúng 1 cột, mất công phải viết nhiều code, thì tôi lại dùng ComboBox, nó vừa hiển thị được nhiều cột vừa tạo được các sự kiện để tìm kiếm theo key mà bạn gõ vào nó.

2) Tôi đã bỏ cột Chọn mã hàng vì nó không cần thiết

3) Tôi cũng Trim(Mã hàng) để chúng không có khoảng trắng đằng sau ở cột Mã hàng (cột B của sheet Bang Ma Hang Hoa).

4) Bạn tự chỉnh sửa lại công thức tại sheet In Toa

5) Tại cột Mã hàng (cột F, Xuat Kho) tôi có đặt 1 checkbox, nếu nó được check thì sẽ tìm theo Tên Hàng, còn không thì nó tìm theo Mã Hàng.

6) Nói chung, có gì thắc mắc thì bạn hỏi tiếp.

Thủ tục tạo mảng dữ liệu trong Standard Module:

Mã:
Public pubArrList
Public pubUBound As Long


Sub ArrCreate()
    Dim HangCuoi As Long
    Dim ShBangMa As Worksheet
    
    Set ShBangMa = Sheets("Bang Ma Hang Hoa")
    HangCuoi = ShBangMa.Range("B" & Rows.Count).End(xlUp).Row
    
    pubArrList = ShBangMa.Range("B2:D" & HangCuoi)
    pubUBound = UBound(pubArrList)
End Sub

Thủ tục sự kiện trong Sheet Module:

Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    With ComboBox1
        If Selection.Count = 1 And Target.Row > 2 And Target.Column = 6 Then
            If Not IsArray(pubArrList) Then
                Call ArrCreate
                .List = pubArrList
            End If
            .Visible = False
            .Text = ""
            If .ListCount < pubUBound Then
                .List = pubArrList
            End If
            .Top = Target.Top
            .Left = Target.Left
            .Height = Target.Height
            .Width = Target.Width
            .Visible = True
            .Activate
        Else
            If .Visible = True Then
                .Visible = False
            End If
        End If
    End With
End Sub


Private Sub ComboBox1_Change()
    With ComboBox1
        If .MatchFound Then
            ActiveCell.Value = .Value
            ActiveCell.Offset(, 1) = .List(, 1)
            ActiveCell.Offset(, 2) = .List(, 2)
        End If
    End With
End Sub


Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 Then
        ActiveCell.Offset(1).Select
    End If
End Sub


Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If Not IsArray(pubArrList) Then Exit Sub
    Select Case KeyCode
    Case 9, 13, 37 To 40
    Case Else
        If ComboBox1 > "" Then ComboBox1.DropDown
        
        Dim StrItem As String
        Dim n As Long, r As Long
        Dim c As Byte, col As Byte
        Dim GetRows(), ArrFilter()
        
        col = IIf(CheckBox1, 2, 1)
        
        StrItem = "*" & UCase(ComboBox1) & "*"
        
        For r = 1 To pubUBound
            If UCase(pubArrList(r, col)) Like StrItem Then
                n = n + 1
                ReDim Preserve GetRows(1 To n)
                GetRows(n) = r
            End If
        Next
        
        If n > 0 Then
            ReDim ArrFilter(1 To n, 1 To 3)
            For c = 1 To 3
                For r = 1 To n
                    ArrFilter(r, c) = pubArrList(GetRows(r), c)
                Next
            Next
            ComboBox1.List = ArrFilter
        Else
            ComboBox1.List = Array()
        End If
    End Select
End Sub
Để nguyên như file em đã đưa lên, không bỏ bớt đi cột nào thì phải sửa code như thế nào?
Tại vị khi người nhớ mã nhập vào lại không được
 
Upvote 0
Để nguyên như file em đã đưa lên, không bỏ bớt đi cột nào thì phải sửa code như thế nào?
Tại vị khi người nhớ mã nhập vào lại không được
Tôi đã nói có cái CheckBox màu xanh rồi mà! Ai nhớ mã thì bỏ check thôi!
 
Upvote 0
Đúng thế code là của Thày Ndu tôi đã áp dụng và tôi đã quản lý không cần mã, chỉ gõ chữ bất kỳ có trong tên hàng dù ở đầu, ở giữa hay cuối tên hàng đều hiện ra mà
 
Upvote 0
Nhưng khi nhập thì không hiện, nó báo ô trống thôi
Tôi chả hiểu bạn nói gì cả. Xem hình đi.

Để tìm theo Mã Số:

Sau khi bỏ check, tôi chọn một ô nào đó để nó hiện CBB lên và gõ vào chữ M thì các mã có chứa M hiện ra.

attachment.php



Để tìm theo Tên Hàng:

Tôi check vào đó và gõ vào từ khóa có liên quan đến tên hàng trong CBB.

attachment.php
 

File đính kèm

  • Picture1.jpg
    Picture1.jpg
    65.8 KB · Đọc: 406
  • Picture2.jpg
    Picture2.jpg
    45.2 KB · Đọc: 390
Upvote 0
Tôi chả hiểu bạn nói gì cả. Xem hình đi.

Để tìm theo Mã Số:

Sau khi bỏ check, tôi chọn một ô nào đó để nó hiện CBB lên và gõ vào chữ M thì các mã có chứa M hiện ra.
Để tìm theo Tên Hàng:

Tôi check vào đó và gõ vào từ khóa có liên quan đến tên hàng trong CBB.
Anh Trọng Nghĩa ơi! sao khi em chép Code vào file gốc của em thì Code không chạy vậy???
Báo lỗi màu vàng không chạy ( dòng chữ đỏ bên dưới)
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)    With ComboBox1
        If Selection.Count = 1 And Target.Row > 2 And Target.Column = 6 Then
            If Not IsArray(pubArrList) Then
                Call ArrCreate
[COLOR=#b22222][B]                .List = pubArrList[/B][/COLOR]
            End If
            .Visible = False
            .Text = ""
            If .ListCount < pubUBound Then
                .List = pubArrList
            End If
            .Top = Target.Top
            .Left = Target.Left
            .Height = Target.Height
            .Width = Target.Width
            .Visible = True
            .Activate
        Else
            If .Visible = True Then
                .Visible = False
            End If
        End If
    End With
End Sub
 
Upvote 0
Web KT
Back
Top Bottom