Tạo List tìm kiếm cho mã hàng hóa (1 người xem)

Liên hệ QC

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

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

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

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

  • Picture2.jpg
    Picture2.jpg
    45.2 KB · Đọc: 390
  • Picture1.jpg
    Picture1.jpg
    65.8 KB · Đọc: 406
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
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

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

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

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

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

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

Upvote 0
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á!
anh thông cảm e từ trước đến giờ mới chỉ tiếp xúc với công thức, thậm chí công thức còn chưa rành, ở sheet thẻ kho thì anh làm giúp e ok rồi, e vào view trong sheet BCNCC và copy code trong sheet thẻ kho sang sau khi lưu lại thì file excel báo lỗi, anh làm ơn hướng dẫn e làm sheet BCNCC giống với thẻ kho được không, e cám ơn anh rất nhiều
 
Upvote 0
anh thông cảm e từ trước đến giờ mới chỉ tiếp xúc với công thức, thậm chí công thức còn chưa rành, ở sheet thẻ kho thì anh làm giúp e ok rồi, e vào view trong sheet BCNCC và copy code trong sheet thẻ kho sang sau khi lưu lại thì file excel báo lỗi, anh làm ơn hướng dẫn e làm sheet BCNCC giống với thẻ kho được không, e cám ơn anh rất nhiều
Ui trời ơi, đúng như mình dự đoán "quơ cúp", thôi bạn tải cái file này về và xài luôn đi.
 

File đính kèm

Upvote 0
Upvote 0
Mình giờ muốn hiện thêm ô từ F-I? nhưng mình chưa biết thay đổi j ở trong code? và mình muốn di chuyển ô hiện từ D=>B ?
 
Upvote 0
Ui trời ơi, đúng như mình dự đoán "quơ cúp", thôi bạn tải cái file này về và xài luôn đi.
anh ơi ở sheet báo cáo nhà cung cấp mã lọc là mã khách hàng mà, a xem rồi chỉnh lại giúp e với, hiện tại anh vẫn đang để là mã vật tư chứ không phải mã khách
 

File đính kèm

Upvote 0
anh ơi ở sheet báo cáo nhà cung cấp mã lọc là mã khách hàng mà, a xem rồi chỉnh lại giúp e với, hiện tại anh vẫn đang để là mã vật tư chứ không phải mã khách
Uhm, sửa lại tí thôi mà! Bạn mà biết tí gì về code thì cũng sửa dễ dàng thôi. ;;;;;;;;;;;
 

File đính kèm

Upvote 0
Uhm, sửa lại tí thôi mà! Bạn mà biết tí gì về code thì cũng sửa dễ dàng thôi. ;;;;;;;;;;;
e cũng muốn biết tí mà đọc mãi không được cái gì vào đầu cả, tìm trên mạng nhưng toàn tài liệu nói khó hiểu mà không đúng với mục đích sử dụng của e. anh có tài liệu nào dễ hiểu về VBA thì làm ơn cho e xin được không, em cám ơn
 
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


Code này hình như có vấn đề rồi anh ơi. Nghĩa là nó không update được tên hàng, đơn giá, đơn vị tính. Anh thử vào sheet danh mục hàng hóa anh gõ 1 tên hàng khác đi, rồi anh quay lại nhập thữ xem. chỉ khi nào tắt file đi mở lại nó mới update
 
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.

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

Code bạn không update kìa , như vậy cũng như không, khi người ta đổi tên hàng, đổi giá bán thì coi như sai bét luôn
 
Upvote 0
các anh cho e hỏi là khi e đang sử dụng file này trên excell 2010 thì mở ngon, mang sang excell 2007 thì lại không mở được, xin hỏi lý do tại sao ạuntitled.jpg
 
Upvote 0
mong mọi người chỉ cho e lỗi trên nhé
 
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

Anh Nghĩa ơi! Sao file này em mở trên Office 2010 thì codekhông chạy. Nhờ anh chỉ cách giúp em với. Tại giờ em muốn chuyển sang Office2010 để dùng luôn.
 

File đính kèm

Upvote 0
file này của bạn mình mở trên Office 2010 , 2013 , 32 bit , 64 bit đều hoạt động tốt , không biết máy của bạn xài Office nào

Gửi anh Hoàng Trọng Nghĩa . Cám ơn giải pháp của anh . Em đã gặp vấn đề tương tự và tìm đc giải pháp ở đây
Nhưng có 1 điều này mong anh giúp
khi ta chọn 1 item nào đó bằng Click chuột . chẳng hạn trong hình này là mã B15
1.jpg
ta đc giá trị item đó như trong hình
2.jpg
lúc này xảy ra vấn đề :
Khi ấn tiếp nút ARROW DOWN thì giá trị B15 bị đổi thành B16 (item tiếp theo trong List)
3.jpg

=> làm sổ sách sai => đuổi việc --=0
Mong muốn của em ở đây là làm sao sau khi chọn đc mã hàng mong muốn bằng cách click chuột thì khi bấm tiếp nút ARROW DOWN
sẽ nhảy Select xuống ô ngay dưới (mũi tên chỉ vào) hoặc ít nhất thì cũng ngăn tình trạng bị đổi mã hàng sau khi đã click chọn mã hàng xong
Mong đc giúp đỡ
 
Upvote 0
Anh Nghĩa ơi! Sao file này em mở trên Office 2010 thì codekhông chạy. Nhờ anh chỉ cách giúp em với. Tại giờ em muốn chuyển sang Office2010 để dùng luôn.
Bạn đã bấm vào nút Enable Editing chưa? Sau đó, bạn có bấm tiếp Enable Content chưa?

attachment.php


attachment.php
 

File đính kèm

  • Enable.jpg
    Enable.jpg
    84.1 KB · Đọc: 148
  • EnableContent.jpg
    EnableContent.jpg
    104.3 KB · Đọc: 145
Upvote 0
file này của bạn mình mở trên Office 2010 , 2013 , 32 bit , 64 bit đều hoạt động tốt , không biết máy của bạn xài Office nào

Gửi anh Hoàng Trọng Nghĩa . Cám ơn giải pháp của anh . Em đã gặp vấn đề tương tự và tìm đc giải pháp ở đây
Nhưng có 1 điều này mong anh giúp
khi ta chọn 1 item nào đó bằng Click chuột . chẳng hạn trong hình này là mã B15
View attachment 135230
ta đc giá trị item đó như trong hình
View attachment 135231
lúc này xảy ra vấn đề :
Khi ấn tiếp nút ARROW DOWN thì giá trị B15 bị đổi thành B16 (item tiếp theo trong List)
View attachment 135232

=> làm sổ sách sai => đuổi việc --=0
Mong muốn của em ở đây là làm sao sau khi chọn đc mã hàng mong muốn bằng cách click chuột thì khi bấm tiếp nút ARROW DOWN
sẽ nhảy Select xuống ô ngay dưới (mũi tên chỉ vào) hoặc ít nhất thì cũng ngăn tình trạng bị đổi mã hàng sau khi đã click chọn mã hàng xong
Mong đc giúp đỡ
Bạn đừng bấm nút mũi tên xuống sau khi đã chọn một mục nào đó trong list vì đó là bản chất của ComboBox rồi.

Nên bấm nút ENTER.
 
Upvote 0
Upvote 0
Cám ơn anh . câu hỏi của em rất thực tế . Khi nhìn lại tấm hình 1 và hình 2 em đã gởi ở Post trên chúng có sự khác nhau là
DropDown List đang Show (hình 1) hoặc Hide (hình 2) . Mục đích ở đây là nếu Show thì nhấn nút arrow down sẽ như bình thường còn nếu Hide thì phải nhảy Select xuống ô ngay dưới chứ ko đc đổi mã hàng . Em có cách để kiểm tra nhưng khá phức tạp vì sử dụng hàm Win 32 API . Nên muốn tìm hiểu xem diễn đàn mình có cách nào ngắn gọn hơn không . Tiện đây em chia sẻ luôn cách của em

khi combobox (hoặc 1 oleObject) đc vẽ ra thì nó dc cấp 1 ClassName là
Mã:
F3 Server *
với * là 1 chuỗi ngẫu nhiên tự sinh để phân biệt oleObject này với các oleObject khác . Chẳng hạn
Mã:
F3 Server 4a560000
và DropDown List đc cấp 1 ClassName là
Mã:
F3 MdcPopup *
với * phải đúng bằng * của Combobox đó để thể hiện rằng nó là List của Combobox đó . Chẳng hạn
Mã:
F3 MdcPopup 4a560000

máy của em là Win 64 bit nên phải sử dụng từ khóa PtrSafe . Máy anh chị nào sử dụng Win 32 bit thì xóa từ khóa đó nhé

Mã:
Private Declare PtrSafe Function EnumChildWindows Lib "user32" _
(ByVal hWndParent As LongPtr, ByVal lpEnumFunc As LongPtr, ByRef lParam() As LongPtr) As LongPtr


Private Declare PtrSafe Function GetClassName Lib "user32.dll" Alias "GetClassNameA" (ByVal hwnd As LongPtr, _
ByVal classname As String, ByVal classlength As LongPtr) As Long


Private Declare PtrSafe Function GetFocus Lib "user32" () As LongPtr
đây là hàm kiểm tra DropDown List đang Show hay Hide
Mã:
Private WindowCount As Integer
Public Function IsDropDownListShowing() As Boolean


Dim DrpDnCbxClsname As String
Dim AllHwnd() As LongPtr
Dim n As Integer
Dim ubao As Integer
Dim rs As Boolean

'GetFocus để lấy hWnd của control đang focus . ở đây muốn nói đến combobox
DrpDnCbxClsname = getPopUpCbxClassName(GetClassNameFromHandle(GetFocus))
WindowCount = 0
'tham số đầu bằng 0 để tìm tất cả mọi hWnd đang mở trên DesKtop 
' Nếu truyền vào Application.hwnd sẽ không tìm dc !
Call EnumChildWindows(0, AddressOf EnumsWindowProc, AllHwnd)
ubao = UBound(AllHwnd)




For n = 1 To ubao
    If GetClassNameFromHandle(AllHwnd(n)) = DrpDnCbxClsname Then
        rs = True
        Exit For
    End If
Next


IsDropDownListShowing = rs
End Function

Mã:
Private Function EnumsWindowProc(ByVal hwnd As LongPtr, ByRef lParam() As LongPtr) As LongPtr


WindowCount = WindowCount + 1
ReDim Preserve lParam(1 To WindowCount)
lParam(WindowCount) = hwnd


EnumsWindowProc = 1
End Function
Mã:
Private Function getPopUpCbxClassName(ByVal cbxClassName As String) As String


cbxClassName = WorksheetFunction.Trim(cbxClassName)
Dim arrStr() As String
arrStr() = Split(cbxClassName)


getPopUpCbxClassName = "F3 MdcPopup " & arrStr(UBound(arrStr))
End Function

Mã:
Private Function GetClassNameFromHandle(ByVal hwnd As LongPtr) As String
Dim classname As String
Dim classlength As Long


classname = Space(300)
classlength = GetClassName(hwnd, classname, 300)
classname = Left(classname, classlength)


GetClassNameFromHandle = classname
End Function
 
Upvote 0
Cám ơn anh . câu hỏi của em rất thực tế . Khi nhìn lại tấm hình 1 và hình 2 em đã gởi ở Post trên chúng có sự khác nhau là
DropDown List đang Show (hình 1) hoặc Hide (hình 2) . Mục đích ở đây là nếu Show thì nhấn nút arrow down sẽ như bình thường còn nếu Hide thì phải nhảy Select xuống ô ngay dưới chứ ko đc đổi mã hàng . Em có cách để kiểm tra nhưng khá phức tạp vì sử dụng hàm Win 32 API . Nên muốn tìm hiểu xem diễn đàn mình có cách nào ngắn gọn hơn không . Tiện đây em chia sẻ luôn cách của em

Theo cách nhận biết của doveandrose, tôi cải tiến lại cái file trước luôn.

1) Nếu sheet "Bang Ma Hang Hoa" có thay đổi thì sau khi thay đổi phải bấm vào nút cập nhật.

2) Khi chọn vào cột F của sheet "Xuat Kho" thì ComboBox sẽ hiện ra, đồng thời nếu có mã tại cột đó thì CBB sẽ nhận mã tại đó, muốn xóa hàng đó thì chỉ việc xóa trong CBB.

Các phím mũi tên:

3) Khi list đang trong tình trạng Dropdown thì phím lên phím xuống chạy theo list, còn khi đã chọn trong list rồi mà list không xổ xuống thì sẽ chọn theo Cell.

4) Phím trái phím phải cũng chọn theo cell nếu con trỏ đứng trước hay sau mã bên trong CBB.
 

File đính kèm

Upvote 0
Theo cách nhận biết của doveandrose, tôi cải tiến lại cái file trước luôn.

1) Nếu sheet "Bang Ma Hang Hoa" có thay đổi thì sau khi thay đổi phải bấm vào nút cập nhật.

2) Khi chọn vào cột F của sheet "Xuat Kho" thì ComboBox sẽ hiện ra, đồng thời nếu có mã tại cột đó thì CBB sẽ nhận mã tại đó, muốn xóa hàng đó thì chỉ việc xóa trong CBB.

Các phím mũi tên:

3) Khi list đang trong tình trạng Dropdown thì phím lên phím xuống chạy theo list, còn khi đã chọn trong list rồi mà list không xổ xuống thì sẽ chọn theo Cell.

4) Phím trái phím phải cũng chọn theo cell nếu con trỏ đứng trước hay sau mã bên trong CBB.
Cám ơn anhNghĩa!

  • Giờcó có thêm một vấn đề nữa giờ anh giúp em với…
  • CũngFile đó, em có một danh sách khách hàng, khi em nhập tên muốn tìm cho nhanh vàchính xác.
  • Ýem muốn là: Khi nhập tên KH tại cột D của Sheet KH thì sẽ tìm kiếm tên tại cộtB của sheet MKH.
  • VD:Khi em nhập tại ô D3 Của sheet KH là A1 thì sẽ tìm cho em tên A1 tại cột B củasheet MKH, …
 

File đính kèm

Upvote 0
Chào anh Nghĩa
Từ hướng dẫn của anh, em làm file riêng của mình như file đính kèm
Code chạy rồi nhưng list trong combobox luôn hiển thị 3 cột, tuy nhiên em muốn list trong combobox hiển thị 5 cột (thêm 2 cột Ngày nhập và Giá nhập từ Sheet Bảng Mã Hàng Hóa) nhưng em chưa biết làm cách nào
Mong anh hướng dẫn giúp
Cảm ơn anh
 

File đính kèm

  • Them cot.jpg
    Them cot.jpg
    17.8 KB · Đọc: 22
  • Xuatkho.xlsm
    Xuatkho.xlsm
    297.9 KB · Đọc: 45
Upvote 0
Chào anh Nghĩa
Từ hướng dẫn của anh, em làm file riêng của mình như file đính kèm
Code chạy rồi nhưng list trong combobox luôn hiển thị 3 cột, tuy nhiên em muốn list trong combobox hiển thị 5 cột (thêm 2 cột Ngày nhập và Giá nhập từ Sheet Bảng Mã Hàng Hóa) nhưng em chưa biết làm cách nào
Mong anh hướng dẫn giúp
Cảm ơn anh

chắc anh Nghĩa bận đi offline rùi, tui thử tra lờn hén
trước tiên để nâng số cột của combo lên 5 cột, bạn làm như sau:
1- nhấp vào C3 cho cái combo nó hiện lên
2-nhấp vào tab Developer trên thanh công cụ, chọn Design mode, nhấp lại vào combo cho nó sừng cồ lên
rồi chọn properties trong list hiện ra bạn chọn columncount sửa số 3 thành số 5
===========
sau khi sửa xong thì tôi thấy nó tự nạp data vào đủ 5 cột cho bạn
code có vẻ phức tạp hỉ?
chắc là cái module 1 phải ko? đọc quá thấy khó qua nên bỏ.....hehehehe
 
Upvote 0
Em cảm ơn bác Let'GâuGâu, em làm được rồi
Code không phải của em ạ. Code của bác Nghĩa và bác comet_1701 giúp em sửa ạ :D
 
Upvote 0
cho phép em để lại file này sau này có ai cần thì xài
với đặc thù công việc cần tạo sheet mới hàng tháng . file này giúp từng sheet ko cần chứa code nữa
code đặt trong module và chạy trên tất cả các sheet có sheetname thỏa mãn yêu cầu nào đó
(thí dụ có chứa chữ "xuất" hay "nhập")
theo trải nghiệm thực tế thì đa số cần dò tìm theo tên chứ ít khi theo mã nên ở đây code dò tìm theo cả 2 tiêu chí 1 lúc
file này có 1 số điểm khác với file của anh Nghĩa

-gỡ bỏ button cập nhật vì không cần thiết
-không cần gõ tiếng việt có dấu khi tìm kiếm
-sửa lỗi invalid pattern khi gõ kí tự "[" vào ô mã hàng
-sửa lỗi không click chọn được item khi combobox có ListCount = 1
-hide dropdownlist khi ListCount = 0
chạy trên cả 2 hệ 32 bit và 64 bit
và cuối cùng e ko phải chuyên về exel nên code hơi thô :D
 

File đính kèm

Upvote 0
cho phép em để lại file này sau này có ai cần thì xài
với đặc thù công việc cần tạo sheet mới hàng tháng . file này giúp từng sheet ko cần chứa code nữa
code đặt trong module và chạy trên tất cả các sheet có sheetname thỏa mãn yêu cầu nào đó
(thí dụ có chứa chữ "xuất" hay "nhập")
theo trải nghiệm thực tế thì đa số cần dò tìm theo tên chứ ít khi theo mã nên ở đây code dò tìm theo cả 2 tiêu chí 1 lúc
file này có 1 số điểm khác với file của anh Nghĩa

-gỡ bỏ button cập nhật vì không cần thiết
-không cần gõ tiếng việt có dấu khi tìm kiếm
-sửa lỗi invalid pattern khi gõ kí tự "[" vào ô mã hàng
-sửa lỗi không click chọn được item khi combobox có ListCount = 1
-hide dropdownlist khi ListCount = 0
chạy trên cả 2 hệ 32 bit và 64 bit
và cuối cùng e ko phải chuyên về exel nên code hơi thô :D
Em thấy file tâm huyết đấy ah. ko biết bác có phải dân lập trình ko.
File kết hợp sự kiện trong class module, api
Cảm ơn bác về bài viết. vụ list này của bác và anh Nghĩa giúp dân kế toán nhiều lắm
 
Upvote 0
Uhm, sửa lại tí thôi mà! Bạn mà biết tí gì về code thì cũng sửa dễ dàng thôi. ;;;;;;;;;;;
Anh ơi! File tại bài # 47
- Trong Properties của Combobox em không sửa được thông số của ColumnWidths và ListWidths
- Anh chỉ giúp em cách sửa với ạ
( Em sửa thông số song lưu lại và vào lại thì lại thấy như cũ em không biết tại sao)
 

File đính kèm

  • Khong Hieu.jpg
    Khong Hieu.jpg
    15.9 KB · Đọc: 94
Upvote 0
Anh ơi! File tại bài # 47
- Trong Properties của Combobox em không sửa được thông số của ColumnWidths và ListWidths
- Anh chỉ giúp em cách sửa với ạ
( Em sửa thông số song lưu lại và vào lại thì lại thấy như cũ em không biết tại sao)
Trong Sheet Module của sheet Nhap Xuat:

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


    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
[COLOR=#0000ff]                    With Target[/COLOR]
[COLOR=#0000ff]                        Cot1 = .Width[/COLOR]
[COLOR=#0000ff]                        Cot2 = .Offset(, 1).Width[/COLOR]
[COLOR=#0000ff]                        Cot3 = .Offset(, 2).Width[/COLOR]
[COLOR=#0000ff]                    End With[/COLOR]
[COLOR=#ff0000]                    .ListWidth = Cot1 + Cot2 + Cot3[/COLOR]
[COLOR=#ff0000]                    .ColumnWidths = Cot1 - 6 & ";" & Cot2 + 6 & ";" & Cot3 - 18[/COLOR]
[COLOR=#0000ff] [/COLOR]               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

Bạn xem đó mà chỉnh lại theo ý bạn hen.
 
Upvote 0
Trong Sheet Module của sheet Nhap Xuat:

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


    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
[COLOR=#0000ff]                    With Target[/COLOR]
[COLOR=#0000ff]                        Cot1 = .Width[/COLOR]
[COLOR=#0000ff]                        Cot2 = .Offset(, 1).Width[/COLOR]
[COLOR=#0000ff]                        Cot3 = .Offset(, 2).Width[/COLOR]
[COLOR=#0000ff]                    End With[/COLOR]
[COLOR=#ff0000]                    .ListWidth = Cot1 + Cot2 + Cot3[/COLOR]
[COLOR=#ff0000]                    .ColumnWidths = Cot1 - 6 & ";" & Cot2 + 6 & ";" & Cot3 - 18[/COLOR]
               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

Bạn xem đó mà chỉnh lại theo ý bạn hen.
Anh ơi! em muốn hiển thị Cột 1 nhỏ nhất thì phải làm sao ạ
 
Upvote 0
Anh ơi! em muốn hiển thị Cột 1 nhỏ nhất thì phải làm sao ạ
Nhỏ nhất có nghĩa là = 0. Vậy thay vì:

Mã:
With Target
[COLOR=#ff0000]    Cot1 = .Width[/COLOR]
    Cot2 = .Offset(, 1).Width
    Cot3 = .Offset(, 2).Width
End With
.ListWidth = Cot1 + Cot2 + Cot3
.ColumnWidths = [COLOR=#ff0000]Cot1 - 6[/COLOR] & ";" & Cot2 + 6 & ";" & Cot3 - 18

Thì sửa thành:

Mã:
With Target
    Cot2 = .Offset(, 1).Width
    Cot3 = .Offset(, 2).Width
End With
.ListWidth = Cot1 + Cot2 + Cot3
.ColumnWidths = [B][COLOR=#ff0000]0[/COLOR][/B] & ";" & Cot2 + 6 & ";" & Cot3 - 18
 
Upvote 0
Anh Hoàng Trọng Nghĩa có thể chỉnh giúp em cái file này ko ạ, em chưa biết gì về VBA, nên cố gắng mày mò bữa giờ mà vẫn ko hiểu, nên đành nhờ anh giúp luôn vậy ^^.
Em muốn chỉnh trong sheet nhập và xuất lấy dữ liệu từ tồn ( mã hàng_ tên hàng_ ĐVT)
Mong a bớt chút thời gian chỉnh giúp em ạ. Em cảm ơn anh nhiều }}}}}
 

File đính kèm

Upvote 0
anh ơi cũng file NhapThanhPham3 của anh muốn thêm dòng bên DMKH và Ton DK thì phải sửa thế nào ah?
 
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?


bạn ơi, bạn có thể sửa lại cho trong bảng tính đó khi mình chọn xong rồi, mình dùng phím tab để chuyển sang cột khác được không, như thế thì tiện lợi hơn cho công việc ý.
Cảm ơn bạn đã xem ngu ý của mình hiii, --=0|||||
 
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

@Hoàng Trọng Nghĩa: Anh cho em hỏi, nếu em chỉ cần sử dụng dữ liệu cột "Tên hàng" thì trong code cần sửa lại thế nào. Em cũng đang mò mẫm mà chưa có ra.
 
Upvote 0
Thử tham khảo với bài này xem có giúp ích gì cho các bạn không:

http://www.giaiphapexcel.com/forum/...hanh-trong-drop-down-list&p=713806#post713806

Cái kiểu này dân kế toán hay dùng, mà khổ nỗi các bạn lại không biết lập trình, mỗi người mỗi kiểu dữ liệu và mỗi cách biểu diễn khác nhau, tôi chẳng biết làm sao để làm một kiểu tổng quát cho các bạn nữa!
 
Upvote 0
Thanks a Nghĩa nhé, em làm được rồi mà có vấn đề: Chỉ hiện đc tên có trong danh sách còn những tên ko có trong danh sách thì kể cả khi em gõ đầy đủ rồi enter nó cũng ko cho nhập. Làm thế nào để những tên mà chưa cập nhật trong danh sách thì ta có thể gõ đc vào anh nhỉ.
 
Lần chỉnh sửa cuối:
Upvote 0
Thanks a Nghĩa nhé, em làm được rồi mà có vấn đề: Chỉ hiện đc tên có trong danh sách còn những tên ko có trong danh sách thì kể cả khi em gõ đầy đủ rồi enter nó cũng ko cho nhập. Làm thế nào để những tên mà chưa cập nhật trong danh sách thì ta có thể gõ đc vào anh nhỉ.
Vậy thì bạn cứ đưa file lên đây, ghi rõ yêu cầu thế nào rồi kết quả mong muốn là gì thì người khác mới có thể giúp các bạn được.
 
Upvote 0
Vậy thì bạn cứ đưa file lên đây, ghi rõ yêu cầu thế nào rồi kết quả mong muốn là gì thì người khác mới có thể giúp các bạn được.
Em xin gửi lại file của anh làm ví dụ nhé. Em muốn ghi 1 tên không có trong danh sách thì phải làm sao. Nếu có thể trong phần code anh ghi chú cho em 1 ít thông tin để em biết nhé. Thanks anh!!!
 

File đính kèm

Upvote 0
Có ai giúp em giải quyết được vấn đề trên không giúp e với. E đang rất cần.
 
Upvote 0
Em xin gửi lại file của anh làm ví dụ nhé. Em muốn ghi 1 tên không có trong danh sách thì phải làm sao. Nếu có thể trong phần code anh ghi chú cho em 1 ít thông tin để em biết nhé. Thanks anh!!!
Giờ nếu không có trong danh sách, cập nhật vào danh sách và hiển thị trong combobox đúng không?
 
Upvote 0
Giờ nếu không có trong danh sách, cập nhật vào danh sách và hiển thị trong combobox đúng không?
Cập nhật vào danh sách và hiển thị thì em bình thường thôi ko có gì cả, Ý em hỏi là nếu em có 1 cái tên mà ko muốn cập nhật vào danh sách (vì tên này là trường hợp ngoại lệ) thì em muốn gõ tên đó vào ô đc ko? Hiện tại nếu em gõ tên ko có trong danh sách ( ví dụ: nguyen van a) rồi nhấn enter thì cell trống trơn ko nhận cái tên đó, nên muốn làm điều này thì em phải sửa phần target.row > 2 thành target.row = 2 rồi điền xong thì lại chỉnh lại thành > 2.
 
Upvote 0
Cám ơn bạn nhiều, hiện tại mình đang muốn hoàn thiện nốt phần code kia đã, mình muốn hiểu thật rõ ràng sau đó mới chuyển sang cái khác. Sau này mình sẽ nghiên cứu về add-in này sau. Hi vọng lúc đó bạn sẽ chia sẻ cho mình ít bí quyết.
 
Upvote 0
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á!
nhờ file của anh e đã xây dựng được file theo dõi, tuy nhiên file theo dõi của e càng ngày càng lớn lên khi tìm dữ liệu bị mất rất nhiều thời gian, anh vui lòng xem lại giúp file và giúp đỡ để file có thể nhanh hơn được không, em cám ơn a nhiều
 

File đính kèm

Upvote 0
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ư).
anh ơi, code anh chạy trên excel 2007 bị lỗi overflow anh ạ, chỗ selection.count=1
 
Upvote 0
Anh Nghĩa giúp chỗ Wrap Text cột đi anh, dữ liệu để xấu quá lại phải căn chỉnh tay
Em gửi ảnh trước và sau khi áp dụng code mà nó không wrap text
 

File đính kèm

  • 1.PNG
    1.PNG
    11.5 KB · Đọc: 20
  • 2.PNG
    2.PNG
    16 KB · Đọc: 20
Lần chỉnh sửa cuối:
Upvote 0
Các bro sửa giúp chỗ định dạng trên với ạ
 
Upvote 0
Anh Nghĩa giúp chỗ Wrap Text cột đi anh, dữ liệu để xấu quá lại phải căn chỉnh tay
Em gửi ảnh trước và sau khi áp dụng code mà nó không wrap text
- Cái vụ sử dụng Wrap Text đối với những Cell bị gộp (Merge and Center) không dễ dàng gì đâu.
- Ngày 09/5/208 anh có mặt Vũng Tàu em có giao lưu cà phê được không?
 
Upvote 0
- Cái vụ sử dụng Wrap Text đối với những Cell bị gộp (Merge and Center) không dễ dàng gì đâu.
- Ngày 09/5/208 anh có mặt Vũng Tàu em có giao lưu cà phê được không?
Thứ 1: Cái này không Merge anh ạ, chỉ Wrap Text cho nó đẹp thôi. Đối với những dữ liệu chiều dài vượt quá độ rộng của Cell nó không wrap text mặc dù đã định dạng sẵn ạ
Thứ 2: Anh cứ xuống Vũng Tàu alo em, hôm đó em có đoàn thanh tra sẽ cố gắng ngồi giao lưu cafe hay gì đó với anh
 
Upvote 0
Thứ 1: Cái này không Merge anh ạ, chỉ Wrap Text cho nó đẹp thôi. Đối với những dữ liệu chiều dài vượt quá độ rộng của Cell nó không wrap text mặc dù đã định dạng sẵn ạ
Thứ 2: Anh cứ xuống Vũng Tàu alo em, hôm đó em có đoàn thanh tra sẽ cố gắng ngồi giao lưu cafe hay gì đó với anh
Vậy Copy mấy cái File hôm trước em hỏi về mấy cái Biên bản nghiệm thu vào USB (anh có Laptop), có gì anh đến xem nội dung em cần anh hiểu cụ thể mới giúp được.
 
Upvote 0
Chào anh Nghĩa
Từ hướng dẫn của anh, em làm file riêng của mình như file đính kèm
Code chạy rồi nhưng list trong combobox luôn hiển thị 3 cột, tuy nhiên em muốn list trong combobox hiển thị 5 cột (thêm 2 cột Ngày nhập và Giá nhập từ Sheet Bảng Mã Hàng Hóa) nhưng em chưa biết làm cách nào
Mong anh hướng dẫn giúp
Cảm ơn anh
Bạn làm Hiển thị dc 5 cột không, sao tôi vẫn k hiển thị dc
 
Upvote 0
Chào anh Nghĩa
Từ hướng dẫn của anh, em làm file riêng của mình như file đính kèm
Code chạy rồi nhưng list trong combobox luôn hiển thị 3 cột, tuy nhiên em muốn list trong combobox hiển thị 5 cột (thêm 2 cột Ngày nhập và Giá nhập từ Sheet Bảng Mã Hàng Hóa) nhưng em chưa biết làm cách nào
Mong anh hướng dẫn giúp
Cảm ơn anh
sao k hiển thị 5 cột dc bạn
 
Upvote 0

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

Back
Top Bottom