Trợ giúp Code lọc dữ liệu Listbox,

Liên hệ QC

thangbomdethuong

Thành viên mới
Tham gia
15/5/18
Bài viết
7
Được thích
4
XIn chào mọi người,
Nhờ mọi nguoi giúp mình Code cho Form BáoCao với ah,
Mình Click vào Combox thì Listbox hiện theo , dử liệu nạp vào litstbox theo combox, vì có nhiều cột Baocao không cần phải xuất hiện trong litsbox
có tất cả là 5 combox,
Untitled.png Bao Cao File
 

File đính kèm

  • BaoCao.xlsm
    591.8 KB · Đọc: 34
Trước tiên bạn thử thay macro này, chạy & tự chiêm nghiệm so với macro của bạn:
PHP:
Private Sub UserForm_Initialize()
Dim sArr()
Dim I As Long, Dic1 As Object, Dic2 As Object
On Error GoTo LoiCT
  
1 sArr() = ThisWorkbook.Sheets("KHSX").Range("A4", Sheet7.Range("A4").End(xlDown)).Resize(, 10).Value   '1<= 7  '
Set Dic1 = CreateObject("Scripting.Dictionary")
Set Dic2 = CreateObject("Scripting.Dictionary")
For I = 1 To UBound(sArr, 1)
    If Not Dic1.exists(sArr(I, 1)) Then Dic1.Add sArr(I, 1), ""
    If Not Dic2.exists(sArr(I, 2)) Then Dic2.Add sArr(I, 2), ""
Next I
8 Me.lbufbaocao.List = sArr
Me.cbPO.List = Application.Transpose(Dic1.keys)
Me.cbKH.List = Application.Transpose(Dic2.keys)
Err_:               Exit Sub
LoiCT:
    If Err = 70 Then
        MsgBox Erl,,Err
        Resume Next
    Else
        MsgBox Erl, , Err:              Resume Err_
    End If
End Sub
 
Upvote 0
Rất càm ơn sự giúp đỡ của bạn,
Gắn macro vào thì treo Form luon bạn
Bạn xem file giup mình
 

File đính kèm

  • BaoCao_2.xlsm
    593.9 KB · Đọc: 36
Upvote 0
Thử trãi nghiệm với cái này
$$$$@
 

File đính kèm

  • Form.rar
    686.5 KB · Đọc: 77
Upvote 0
Hiện tại bạn có 5 ComboBox, hễ bấm cái nào thì kết quả trên ListBox hiện lên theo tiêu chí đó;
Ta có thể xài 2 ComboBox để lọc; Tuy nhiên mỗi lần lọc cần lần lượt chọn cả 2 ComboBox; Chỉ là gợi ý bạn thử lúc rỗi!
 
Upvote 0
Hiện tại bạn có 5 ComboBox, hễ bấm cái nào thì kết quả trên ListBox hiện lên theo tiêu chí đó;
Ta có thể xài 2 ComboBox để lọc; Tuy nhiên mỗi lần lọc cần lần lượt chọn cả 2 ComboBox; Chỉ là gợi ý bạn thử lúc rỗi!

Chào bạ,
giúp mình lọc 2-3 tiêu chí thì phải làm sao ?
Cam on bạn rất nhiều
 
Upvote 0
Bạn xem file & tự tiếp tục cho các trường hợp còn lại khác đi nha:
 

File đính kèm

  • Form.rar
    687.6 KB · Đọc: 37
Upvote 0
Bạn xem file & tự tiếp tục cho các trường hợp còn lại khác đi nha:

Cảm ơn bạn SA-DQ ,
ý mình là chọn trực tiếp trong combobox luôn, ( cb1,cb2,cb3,cb4,cb5 ) , có cần phải làm thêm 1 commbobox riêng biệt ?

VD : cb1 chon, cb2 chọn theo quan hệ cb1. kế tiếp cb3 chọn theo quan hệ cb1 va cb2....
 

File đính kèm

  • BaoCao.xlsm
    610.8 KB · Đọc: 42
Upvote 0
Vậy thì bạn thử đi & chúc bạn thành công!
 
Upvote 0
Cảm ơn bạn SA-DQ ,
ý mình là chọn trực tiếp trong combobox luôn, ( cb1,cb2,cb3,cb4,cb5 ) , có cần phải làm thêm 1 commbobox riêng biệt ?

VD : cb1 chon, cb2 chọn theo quan hệ cb1. kế tiếp cb3 chọn theo quan hệ cb1 va cb2....
1. Tôi làm qua, chỉ test 1 lần vì tôi rất ngại test.
2. Vào thời điểm chào buổi sáng chỉ có cbPO có dữ liệu, và luôn có cho tới khi đóng Form.
3. Nếu chọn trong combobox thứ n, với n = 1, 2, 3, 4, thì trong combobox (n+1) mới có dữ lliệu để chọn. Và các combobox từ combobox (n+2) tới combobox thứ 5 sẽ rỗng.
4. Nếu chọn trong combobox n thì dữ liệu sẽ được lọc theo combobox 1, 2, ..., comboboxn - tức theo n combobox đầu.

Vd. chọn lần lượt trong cbPO, cbKH, cbMH, cbNgaySX thì dữ liệu sẽ được lọc lần lượt theo cbPO, theo cbPO + cbKH, theo cbPO + cbKH + cbMH, theo cbPO + cbKH + cbMH + cbNgaySX. Nếu tiếp theo chọn mục khác trong cbPO thì trong cbKH sẽ có dữ liệu khác ứng với mục trong cbPO, cbMH và cbNgaySX sẽ rỗng, đồng thời dữ liệu sẽ được lọc theo cbPO.

Bạn tự test kỹ.

Toàn bộ code trong UserForm
Mã:
Option Explicit

Private dulieu()

Private Sub cbMAY_Change()
    Filter_Listbox 5
End Sub

Private Sub cbMH_Change()
    Filter_Listbox 3
End Sub

Private Sub cbPO_Change()
   Filter_Listbox 1
End Sub

Private Sub cbKH_Change()
    Filter_Listbox 2
End Sub

Private Sub cbNSX_Change()
    Filter_Listbox 4
End Sub

Sub Filter_Listbox(ByVal col As Long)
Dim r As Long, c As Long, count As Long, chisodong, key, combo(), ketqua()
Dim dic As Object
    combo = Array(cbPO, cbKH, cbMH, cbNSX, cbMAY)
'    xoa cac combobox sau combobox hien hanh
    For c = col To UBound(combo)
        combo(c).Clear
    Next c
'    phuc vu truong hop xoa phan Edit cua combobox nao do
    With combo(col - 1)
        If .ListIndex < 0 Then
            If .text = "" Then
                If col = 1 Then
                    Me.lbufbaocao.List = dulieu
                Else
                    Filter_Listbox col - 1
                End If
            Else
                .text = ""
            End If
            Exit Sub
        End If
    End With
'    mang chi so cac dong ma o do co gia tri cua combobox hien hanh
    With combo(col - 1)
        chisodong = Split(.List(.ListIndex, 1), ",")
    End With
    ReDim ketqua(1 To UBound(chisodong) - LBound(chisodong) + 1, 1 To 5)
    If col < 5 Then
        Set dic = CreateObject("Scripting.Dictionary")
        dic.CompareMode = vbTextCompare
    End If
'    duyet mang dulieu
    For r = LBound(chisodong, 1) To UBound(chisodong, 1)
        count = count + 1
        For c = 1 To 5
            ketqua(count, c) = dulieu(CLng(chisodong(r)), c)
        Next c
'        xac dinh chi so cac dong ma o do co tung gia tri cu the cua combobox ngay sau combobox hien hanh
        If col < 5 Then
            key = dulieu(CLng(chisodong(r)), col + 1)    ' gia tri cua combobox ngay sau combobox hien hanh
            If Not dic.exists(key) Then
                dic.Add key, chisodong(r)
            Else
                dic.item(key) = dic.item(key) & "," & chisodong(r)
            End If
        End If
    Next r
    Me.lbufbaocao.List = ketqua
   
    If col < 5 Then
'        nhap cac muc cho combobox sau combobox hien hanh
        ReDim ketqua(1 To dic.count, 1 To 2)
        r = 0
        For Each key In dic.keys
            r = r + 1
            ketqua(r, 1) = key
            ketqua(r, 2) = dic.item(key)
        Next key
        combo(col).List = ketqua
    End If
End Sub

Private Sub UserForm_Initialize()
Dim lastRow As Long, r As Long, key, dh()
Dim dic As Object
'    lay du lieu vao mang dulieu
    With ThisWorkbook.Sheets("KHSX")
        lastRow = .Cells(Rows.count, "B").End(xlUp).Row
        If lastRow < 4 Then Exit Sub
        dulieu = .Range("B4:K" & lastRow).Value
    End With
   
    Set dic = CreateObject("Scripting.Dictionary")
    For r = 1 To UBound(dulieu, 1)
        dulieu(r, 4) = dulieu(r, 5) ' ghi cot NGAY SX vao cot 4
        dulieu(r, 5) = dulieu(r, 8) ' ghi cot MAY vao cot 5
        key = dulieu(r, 1)
'        voi moi DH ghi cac chi so dong ma o do co DH cu the. Cac chi so cach nhau boi dau phay ","
        If Len(key) Then
            If Not dic.exists(key) Then
                dic.Add key, CStr(r)
            Else
                dic.item(key) = dic.item(key) & "," & r
            End If
        End If
    Next r
    ReDim dh(1 To dic.count, 1 To 2)
    r = 0
    For Each key In dic.keys
        r = r + 1
        dh(r, 1) = key
        dh(r, 2) = dic.item(key)
    Next key
    Me.cbPO.List = dh
'    chi de du lieu 5 cot
    ReDim Preserve dulieu(1 To UBound(dulieu, 1), 1 To 5)
    lbufbaocao.List = dulieu
    Set dic = Nothing
End Sub

Private Sub cmdDongForm_Click()
    Unload Me
End Sub

Private Sub cmdLamMoiForm_Click()
    'Dim iRow As Long, i As Long, MyCtrls()

    'MyCtrls = Array(cbPO, cbKH, cbMH, cbNSX, cbMAY)

    'Range("lbufbaocao").Offset(lbufbaocao.ListIndex).Resize(1).Value = MyCtrls
   
    'For i = 0 To 9
        'MyControls(i).Text = ""
    'Next
    cbPO.text = ""
    cbKH.text = ""
    cbMH.text = ""
    cbNSX.text = ""
    cbMAY.text = ""
   
    'MsgBox "FORM TRONG, MOI BAN NHAP THONG TIN KHACH HANG ", vbExclamation, "MOI BAN NHAP THONG TIN KHACH HANG"
End Sub

Tôi để nguyên không sửa Sub cmdLamMoiForm_Click. Bạn tự sửa theo yêu cầu bạn định làm gì.

À, nếu tôi nhớ không lầm thì bạn thiết lập RowSource cho cbPO. Hãy xóa hết các RowSource nếu có.
 
Lần chỉnh sửa cuối:
Upvote 0
. . . . , ý mình là chọn trực tiếp trong combobox luôn, ( cb1,cb2,cb3,cb4,cb5 ) , có cần phải làm thêm 1 commbobox riêng biệt ?
VD : cb1 chon, cb2 chọn theo quan hệ cb1. kế tiếp cb3 chọn theo quan hệ cb1 va cb2....
Nếu là sếp của mình giao cho mình nhiệm vụ này mình sẽ làm như sau:
(Giả dụ ta có 5 tiêu chí để lọc tùy nghi: Mã PO, Mã KH, Mã HH, mã máy, & Số lượng; tương ứng với chúng là 5 ComboBox)
Để lọc theo 3 tiêu chí tùy nghi thì mình sẽ có thêm 3 ComboBox
Cb01: gồm 5 dòng, nếu ta chọn dòng nào thì kết quả lọc từ trang CSDL hiện trên ListBox là lọc theo ComboBox tương ứng theo 5 ComboBox nêu trên
CB2 sẽ gồm các dòng 12, 13,. . . 15, 21, 23,. . . . . . .,54
Giả dụ ta muốn lọc trước theo mã KH, sau đó là mã PO thì ta chọn dòng 21 & ứng với nó là macro lọc cho bạn theo tiêu chí 2 rồi đến tiêu chí 1
. . . .
Tương tự sẽ là CB3 (với cơ mang dòng tùy thích. . . để bạn chọn)
& cũng chọn dòng nào thì tương ứng macro đó sẽ cho bạn kết quả
Nhưng nói trước với bạn là mình đã hưu & chả ai mà mình phải nhận lương để mình gọi là Sếp. . . .!
 
Upvote 0
Nếu là sếp của mình giao cho mình nhiệm vụ này mình sẽ làm như sau:
(Giả dụ ta có 5 tiêu chí để lọc tùy nghi: Mã PO, Mã KH, Mã HH, mã máy, & Số lượng; tương ứng với chúng là 5 ComboBox)
Để lọc theo 3 tiêu chí tùy nghi thì mình sẽ có thêm 3 ComboBox
Cb01: gồm 5 dòng, nếu ta chọn dòng nào thì kết quả lọc từ trang CSDL hiện trên ListBox là lọc theo ComboBox tương ứng theo 5 ComboBox nêu trên
CB2 sẽ gồm các dòng 12, 13,. . . 15, 21, 23,. . . . . . .,54
Giả dụ ta muốn lọc trước theo mã KH, sau đó là mã PO thì ta chọn dòng 21 & ứng với nó là macro lọc cho bạn theo tiêu chí 2 rồi đến tiêu chí 1
. . . .
Tương tự sẽ là CB3 (với cơ mang dòng tùy thích. . . để bạn chọn)
& cũng chọn dòng nào thì tương ứng macro đó sẽ cho bạn kết quả
Nhưng nói trước với bạn là mình đã hưu & chả ai mà mình phải nhận lương để mình gọi là Sếp. . . .!


Vâng,
EM cảm ơn ANh rất nhiều,
Vấn đề là thuật toán,
Em cảm ơn
Chân thành cảm ơn
 
Upvote 0
Web KT

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

Back
Top Bottom