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à!!!
 
Nhờ anh Trọng nghĩa giúp em với,!
Em ráp code vào trong file gốc không được.
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Ý của em là: Anh chỉ giúp em cách để coppy code của anh đã viết cho em ở bài #6 vào trong file của em.
Tại em đã coppy code của anh vào file của nhưng không chạy được

Bạn muốn copy thì bạn phải tạo một module để chép vào đó, đồng thời sự kiện của sheet thì chép trong module của sheet đó. Theo hướng dẫn của bài này:

http://www.giaiphapexcel.com/forum/...-tìm-kiếm-cho-mã-hàng-hóa&p=589477#post589477
 
Upvote 0

File đính kèm

  • Khong chay code khi coppy code.rar
    185.5 KB · Đọc: 37
Upvote 0
Em đã làm như bài #6 anh chỉ nhưng code vẫn không chạy.
Em làm như file rồi chỉ em cách coppy với
Bạn hay quá ha! Cái gì cũng copy, chỉ mỗi cái ComboBox là không copy thôi! Nếu không copy được thì bạn cứ Insert cái combobox từ ActiveX Controls là được!
 
Upvote 0
Bạn hay quá ha! Cái gì cũng copy, chỉ mỗi cái ComboBox là không copy thôi! Nếu không copy được thì bạn cứ Insert cái combobox từ ActiveX Controls là được!
Em làm như chỉ dẫn của anh nhưng nó chỉ thể hiện kết quả tìm kiếm ở cột B trong bang ma hang hoa thôi. Thay vì thể hiện từ cột b đến cột d trong bảng mã hàng hóa, Như hình bên dưới
Anh chỉ em cách để thể hiện 3 cột như bài trước. ( Từ cột b đến cột d trong bang ma hang hoa)
 

File đính kèm

  • Khong chay code khi coppy code.rar
    188.2 KB · Đọc: 56
  • chi the hien gia trị tim o cot B Ma.bmp
    134.6 KB · Đọc: 19
  • chi the hien gia trị tim o cot B.bmp
    119.9 KB · Đọc: 12
Lần chỉnh sửa cuối:
Upvote 0
Em làm như chỉ dẫn của anh nhưng nó chỉ thể hiện kết quả tìm kiếm ở cột B trong bang ma hang hoa thôi. Thay vì thể hiện từ cột b đến cột d trong bảng mã hàng hóa, Như hình bên dưới
Anh chỉ em cách để thể hiện 3 cột như bài trước. ( Từ cột b đến cột d trong bang ma hang hoa)
Bạn chọn CBB ở chế độ design, chọn properties, chọn mục ColumnCount gõ 3. Mục ColumnWidths bạn gõ kích cỡ của nó cỡ 48;200. Mục ListWidth gõ vào cỡ 400. Nói chung bạn điều chỉnh sao cho dễ nhìn là được!
Tôi không làm cho bạn là vì tôi muốn bạn biết về nó, bạn hiểu ý tôi chứ!
 
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
Hiện tại e cũng đang muốn xây dựng file excel quản lý kho, e thấy file của anh rất hay và thực tế, tuy nhiên do đặc thù mỗi công ty có cách tạo file và quản lý kho khác nhau dẫn đến việc đặt tên và đặt dữ liệu trong bảng tính cũng có sự khác nhau, anh làm ơn chỉ giúp trong 2 module code trên khi thay đổi cột và tên sheet thì cần phải lưu ý ở những điểm nào trong code để chỉnh sửa lại cho phù hợp.
em rất mong xin cám ơn sự giúp đỡ của anh.
 
Upvote 0
Hiện tại e cũng đang muốn xây dựng file excel quản lý kho, e thấy file của anh rất hay và thực tế, tuy nhiên do đặc thù mỗi công ty có cách tạo file và quản lý kho khác nhau dẫn đến việc đặt tên và đặt dữ liệu trong bảng tính cũng có sự khác nhau, anh làm ơn chỉ giúp trong 2 module code trên khi thay đổi cột và tên sheet thì cần phải lưu ý ở những điểm nào trong code để chỉnh sửa lại cho phù hợp.
em rất mong xin cám ơn sự giúp đỡ của anh.

Thì bạn cứ đưa file lên đi, tôi xem cấu trúc nó như thế nào rồi mới tính được.
 
Upvote 0
Bạn chọn CBB ở chế độ design, chọn properties, chọn mục ColumnCount gõ 3. Mục ColumnWidths bạn gõ kích cỡ của nó cỡ 48;200. Mục ListWidth gõ vào cỡ 400. Nói chung bạn điều chỉnh sao cho dễ nhìn là được!
Tôi không làm cho bạn là vì tôi muốn bạn biết về nó, bạn hiểu ý tôi chứ!
Thật cám ơn anh nhiều lắm. Em đã làm được theo ý mình rồi. Thật là tuyệt khi nhập dữ liệu cũng rất nhanh. Nói chung là quá tuyệt vời
 
Upvote 0

File đính kèm

  • nhap thanh pham.xlsx
    176.6 KB · Đọc: 26
Upvote 0
gửi anh file kho của e,anh xem giúp e ở sheet nhập xuất có mã khách, và mã vật tư nhé. Rất mong anh giúp đỡ và hướng dẫn giúp e, e cám ơn rất nhiều
Hôm nay tôi mới coi lại bài này, làm cho bạn cũng khá "chua" vì bạn sử dụng 2 nguồn mã một lúc trong một sheet (Mã Vật tư và Mã Khách hàng).

Sau đây là toàn bộ code:

Tại Standard Module:

Mã:
Public pubArrKH, pubArrVT
Public pubUbdKH As Long, pubUbdVT As Long


Sub ArrCreate()


    Dim Sh As Worksheet
    Dim HangCuoi As Long
    
    Set Sh = Sheets("DMKH")
    HangCuoi = Sh.Range("D" & Rows.Count).End(xlUp).Row
    
    pubArrKH = Sh.Range("D5:E" & HangCuoi)
    pubUbdKH = UBound(pubArrKH)
    
    Set Sh = Sheets("Ton DK")
    HangCuoi = Sh.Range("B3").End(xlDown).Row
    
    pubArrVT = Sh.Range("B4:D" & HangCuoi)
    pubUbdVT = UBound(pubArrVT)


End Sub

Tại Sheet Module:

Sự kiện của WorkSheet:

Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
[COLOR=#ff0000]    ''Neu co su Copy hay Cut thi khong thuc hien code:[/COLOR]
    If Application.CutCopyMode Then Exit Sub
[COLOR=#ff0000]    ''De chay lai sau khi Copy nhan nut Esc.[/COLOR]


    With ComboBox1
        If Selection.Count = 1 And Target.Row > 4 And _
            (Target.Column = 4 Or Target.Column = 6) Then
            Dim Cot1 As Single, Cot2 As Single, Cot3 As Single
            If .Visible = True Then
                .Visible = False
            End If
            .Text = ""
            If Not IsArray(pubArrKH) Then
                Call ArrCreate
            End If
            If Target.Column = 4 Then
                If .ColumnCount <> 2 Then
                    .ColumnCount = 2
                    .List = pubArrKH
                    With Target
                        Cot1 = .Width
                        Cot2 = .Offset(, 1).Width
                    End With
                    .ListWidth = Cot1 + Cot2
                    .ColumnWidths = Cot1 - 6
                End If
                If .ListCount < pubUbdKH Then
                    .List = pubArrKH
                End If
            ElseIf Target.Column = 6 Then
                If .ColumnCount <> 3 Then
                    .ColumnCount = 3
                    .List = pubArrVT
                    With Target
                        Cot1 = .Width
                        Cot2 = .Offset(, 1).Width
                        Cot3 = .Offset(, 2).Width
                    End With
                    .ListWidth = Cot1 + Cot2 + Cot3
                    .ColumnWidths = Cot1 - 6 & ";" & Cot2 + 6 & ";" & Cot3 - 18
                End If
                If .ListCount < pubUbdVT Then
                    .List = pubArrVT
                End If
            End If
            .Top = Target.Top
            .Left = Target.Left
            .Height = Target.Height + 3
            .Width = Target.Width
            .Visible = True
            .Activate
        Else
            If .Visible = True Then
                .Visible = False
            End If
        End If
    End With
End Sub


Sự kiện của ComboBox:

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


Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
[COLOR=#ff0000]    ''Bam Enter se xuong 1 hang[/COLOR]
    If KeyCode = 13 Then
        ActiveCell.Offset(1).Select
[COLOR=#ff0000]    ''Bam Tab se dich chuyen ngang 1 cot:[/COLOR]
    ElseIf KeyCode = 9 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(pubArrVT) Then Exit Sub
    Select Case KeyCode
    Case 9, 13, 37 To 40
    Case Else
        Dim StrItem As String
        Dim n As Long, r As Long
        Dim c As Byte, col As Byte
        Dim GetRows(), ArrFilter()
        If ComboBox1 > "" Then ComboBox1.DropDown
        col = IIf(CheckBox1, 1, 2)
        StrItem = "*" & UCase(ComboBox1) & "*"
        If ComboBox1.ColumnCount = 2 Then
            For r = 1 To pubUbdKH
                If UCase(pubArrKH(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 2)
                For c = 1 To 2
                    For r = 1 To n
                        ArrFilter(r, c) = pubArrKH(GetRows(r), c)
                    Next
                Next
                ComboBox1.List = ArrFilter
            Else
                ComboBox1.List = Array()
            End If
        Else
            For r = 1 To pubUbdVT
                If UCase(pubArrVT(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) = pubArrVT(GetRows(r), c)
                    Next
                Next
                ComboBox1.List = ArrFilter
            Else
                ComboBox1.List = Array()
            End If
        End If
    End Select
End Sub

Những điều cần lưu ý:

1) Code thực hiện trên sheet Nhap - Xuat

2) ComboBox chỉ hiện lên khi chọn 1 ô bất kỳ trên cột D và cột F

3) ComboBox không hiện lên khi bạn đang Copy hay Cut. Sau khi Paste xong, muốn code chạy lại thì bạn bấm nút Esc.

4) Khi đang thao tác trên ComboBox, muốn xuống hàng bạn bấm nút Enter, khi muốn qua một cột bấm nút Tab.

5) Trên dòng trên cùng (hàng 1) có một CheckBox (By ID) màu xanh, nếu bạn check vào nó thì khi bạn gõ trên ComboBox nó sẽ lọc theo Mã, còn không check thì nó sẽ lọc theo Tên (khách hàng hoặc vật tư).
 

File đính kèm

  • NhapThanhPham.xlsm
    158.3 KB · Đọc: 134
Upvote 0
Trong tin nhắn riêng bạn có yêu cầu:

queluatb đã viết:
e chào anh, e có vấn đề này mong anh giúp, là khi e tạo mã vật tư hay khách hàng mới phải tắt file đi và mở lại thì file mới cập nhật dữ liệu,e muốn hỏi có cách nào để không phải tắt file rồi mở lại để cập nhật dữ liệu mới không, em cám ơn

Vì tôi không muốn nó cứ cập nhật liên tục khi thực hiện nên đã có một số thủ tục ngăn chặn việc này, giờ nếu bạn muốn nó cập nhật sau khi thay đổi nguồn nhập cho CBB thì bạn thêm 2 thủ tục sau vào Module của sheet Nhap - Xuat:

Mã:
Private Sub Worksheet_Activate()
    Call ArrCreate
End Sub


Private Sub Worksheet_Deactivate()
    ComboBox1.Clear
End Sub

Có gì thắc mắc bạn cứ gửi lên đây, xin đừng gửi bằng tin nhắn riêng nữa nhé!
 
Upvote 0
Trong tin nhắn riêng bạn có yêu cầu:



Vì tôi không muốn nó cứ cập nhật liên tục khi thực hiện nên đã có một số thủ tục ngăn chặn việc này, giờ nếu bạn muốn nó cập nhật sau khi thay đổi nguồn nhập cho CBB thì bạn thêm 2 thủ tục sau vào Module của sheet Nhap - Xuat:

Mã:
Private Sub Worksheet_Activate()
    Call ArrCreate
End Sub


Private Sub Worksheet_Deactivate()
    ComboBox1.Clear
End Sub

Có gì thắc mắc bạn cứ gửi lên đây, xin đừng gửi bằng tin nhắn riêng nữa nhé!
e thực sự là không hiểu gì về VBA, mong anh chỉ rõ giúp e là copy vào module là như thế nào, hic
 
Upvote 0
e thực sự là không hiểu gì về VBA, mong anh chỉ rõ giúp e là copy vào module là như thế nào, hic
Mở file mà bạn đã tải về ở bài 35:

http://www.giaiphapexcel.com/forum/...-tìm-kiếm-cho-mã-hàng-hóa&p=592992#post592992

Chọn sheet Nhap - Xuat, tại sheet tab (chỗ ghi tên sheet) click chuột phải vào đó và chọn mục View Code

attachment.php


một cửa sổ các câu lệnh hiện ra, bạn copy cái mà tôi mới đưa lên vào trong đó. Dĩ nhiên là ngoài các thủ tục khác (dưới End Sub hoặc trên Private Sub của các thủ tục khác).

attachment.php
 

File đính kèm

  • Picture1.jpg
    Picture1.jpg
    39.7 KB · Đọc: 222
  • Picture2.jpg
    Picture2.jpg
    59.2 KB · Đọc: 221
Lần chỉnh sửa cuối:
Upvote 0
Mở file mà bạn đã tải về ở bài 35:

http://www.giaiphapexcel.com/forum/...-tìm-kiếm-cho-mã-hàng-hóa&p=592992#post592992

Chọn sheet Nhap - Xuat, tại sheet tab (chỗ ghi tên sheet) click chuột phải vào đó và chọn mục View Code

attachment.php


một cửa sổ các câu lệnh hiện ra, bạn copy cái mà tôi mới đưa lên vào trong đó. Dĩ nhiên là ngoài các thủ tục khác (dưới End Sub hoặc trên Private Sub của các thủ tục khác).

attachment.php
e đã làm được theo hướng dẫn để file cập nhật dữ liệu, tuy nhiên khi e tạo combobox cho sheet thẻ kho ở mã vật tư (tương tự cũng sẽ tạo combobox cho mã khách trong sheet mã khách), nhưng khi tạo như thế thì sheet nhập xuất khi vào mã vật tư hay mã khách thì báo lỗi, e gửi file lên anh xem giúp
 

File đính kèm

  • NhapThanhPham (1).xlsm
    153.5 KB · Đọc: 15
Upvote 0
e đã làm được theo hướng dẫn để file cập nhật dữ liệu, tuy nhiên khi e tạo combobox cho sheet thẻ kho ở mã vật tư (tương tự cũng sẽ tạo combobox cho mã khách trong sheet mã khách), nhưng khi tạo như thế thì sheet nhập xuất khi vào mã vật tư hay mã khách thì báo lỗi, e gửi file lên anh xem giúp
Bạn xem file. Tưởng bạn biết chút gì về VBA chứ làm từ A tới Z thế này chắc sẽ bị "chèo kéo" liên tục quá!
 

File đính kèm

  • NhapThanhPham2.xlsm
    158.1 KB · Đọc: 76
Upvote 0
Web KT
Back
Top Bottom