Lọc dữ liệu theo nhiều điều kiện

Liên hệ QC

Ai_Ma_Biet

Thành viên hoạt động
Tham gia
22/4/15
Bài viết
127
Được thích
20
Giới tính
Nam
Chào Anh, Chị.

Mình có file Excel gồm 2 sheet.

Sheet "Chi tiet" thể hiện tất cả dữ liệu nguyên 1 năm: từ cột A đến cột M
Sheet "Tong hop" mình muốn lọc dữ liệu từ sheet "Chi tiet" theo điều kiện tại O2 đến Q3 như sau:
O2 là ngày bắt đầu
O3 là ngày kết thúc
P2 là MSKH cần lọc
Q2 là MSGM cần lọc
Nếu P2 không có dữ liệu thì chỉ xét theo điều kiện O2,O3, Q2
Nếu Q2 không có dữ liệu thì chỉ xét theo điều kiện O2,O3, P2.
Nếu cả P2 và Q2 không có dữ liệu thì chỉ xét điều kiện tại O2, O3.

Cám ơn Anh chị.
Mình có làm mẫu sẵn tại sheet "Tong hop"
 

File đính kèm

  • Loc du lieu.xlsx
    21.8 KB · Đọc: 14
Chào Anh, Chị.

Mình có file Excel gồm 2 sheet.

Sheet "Chi tiet" thể hiện tất cả dữ liệu nguyên 1 năm: từ cột A đến cột M
Sheet "Tong hop" mình muốn lọc dữ liệu từ sheet "Chi tiet" theo điều kiện tại O2 đến Q3 như sau:
O2 là ngày bắt đầu
O3 là ngày kết thúc
P2 là MSKH cần lọc
Q2 là MSGM cần lọc
Nếu P2 không có dữ liệu thì chỉ xét theo điều kiện O2,O3, Q2
Nếu Q2 không có dữ liệu thì chỉ xét theo điều kiện O2,O3, P2.
Nếu cả P2 và Q2 không có dữ liệu thì chỉ xét điều kiện tại O2, O3.

Cám ơn Anh chị.
Mình có làm mẫu sẵn tại sheet "Tong hop"
Vận dụng các ô điều kiện để dùng Advanced Filter là được.
 
Chào Anh, Chị.

Mình có file Excel gồm 2 sheet.

Sheet "Chi tiet" thể hiện tất cả dữ liệu nguyên 1 năm: từ cột A đến cột M
Sheet "Tong hop" mình muốn lọc dữ liệu từ sheet "Chi tiet" theo điều kiện tại O2 đến Q3 như sau:
O2 là ngày bắt đầu
O3 là ngày kết thúc
P2 là MSKH cần lọc
Q2 là MSGM cần lọc
Nếu P2 không có dữ liệu thì chỉ xét theo điều kiện O2,O3, Q2
Nếu Q2 không có dữ liệu thì chỉ xét theo điều kiện O2,O3, P2.
Nếu cả P2 và Q2 không có dữ liệu thì chỉ xét điều kiện tại O2, O3.

Cám ơn Anh chị.
Mình có làm mẫu sẵn tại sheet "Tong hop"
Nếu biết VBA thì bạn chạy code này xem nhé.
Mã:
Sub loc()
    Dim i As Long, lr As Long, ngaybd As Long, ngaykt As Long, T, arr, kq, dk As String, dks As String, N(), a As Long
    Dim T1, b As Integer, k As Integer, j As Integer
    With Sheets("chi tiet")
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         If lr < 2 Then Exit Sub
         arr = .Range("A2:M" & lr).Value
         ReDim kq(1 To UBound(arr), 1 To 13)
    End With
    With Sheets("tong hop")
         ngaybd = .Range("o2").Value
         ngaykt = .Range("o3").Value
         T = Array(9, 10)
         T1 = .Range("p2:q2")
         For i = 1 To 2
             If Len(T1(1, i)) > 0 Then
                b = b + 1
                dk = dk & "#" & T1(1, i)
                ReDim Preserve N(1 To b)
                N(b) = T(i - 1)
             End If
         Next i
         For i = 1 To UBound(arr)
             If CLng(arr(i, 1)) >= ngaybd And CLng(arr(i, 1)) <= ngaykt Then
                dks = Empty
                For k = 1 To b
                    dks = dks & "#" & arr(i, N(k))
                Next k
                If dk = dks Then
                   a = a + 1
                   For j = 1 To 13
                       kq(a, j) = arr(i, j)
                   Next j
                End If
            End If
         Next i
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         If lr > 2 Then .Range("A2:M" & lr).ClearContents
         If a Then .Range("A2:M2").Resize(a).Value = kq
    End With
End Sub
 
Dùng hàm thấy nó sao sao
 

File đính kèm

  • Loc du lieu.xlsx
    22.1 KB · Đọc: 11
Nếu biết VBA thì bạn chạy code này xem nhé.
Mã:
Sub loc()
    Dim i As Long, lr As Long, ngaybd As Long, ngaykt As Long, T, arr, kq, dk As String, dks As String, N(), a As Long
    Dim T1, b As Integer, k As Integer, j As Integer
    With Sheets("chi tiet")
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         If lr < 2 Then Exit Sub
         arr = .Range("A2:M" & lr).Value
         ReDim kq(1 To UBound(arr), 1 To 13)
    End With
    With Sheets("tong hop")
         ngaybd = .Range("o2").Value
         ngaykt = .Range("o3").Value
         T = Array(9, 10)
         T1 = .Range("p2:q2")
         For i = 1 To 2
             If Len(T1(1, i)) > 0 Then
                b = b + 1
                dk = dk & "#" & T1(1, i)
                ReDim Preserve N(1 To b)
                N(b) = T(i - 1)
             End If
         Next i
         For i = 1 To UBound(arr)
             If CLng(arr(i, 1)) >= ngaybd And CLng(arr(i, 1)) <= ngaykt Then
                dks = Empty
                For k = 1 To b
                    dks = dks & "#" & arr(i, N(k))
                Next k
                If dk = dks Then
                   a = a + 1
                   For j = 1 To 13
                       kq(a, j) = arr(i, j)
                   Next j
                End If
            End If
         Next i
         lr = .Range("A" & Rows.Count).End(xlUp).Row
         If lr > 2 Then .Range("A2:M" & lr).ClearContents
         If a Then .Range("A2:M2").Resize(a).Value = kq
    End With
End Sub
Cám ơn Anh nhiều. Anh có thể sửa giúp Em trường hợp này:
Chỗ Q2 nếu điền vào MSGM thì sẽ lọc loại trừ MSGM đó ra, còn lại sẽ lọc hết.
 

File đính kèm

  • Loc du lieu.xlsm
    25.7 KB · Đọc: 18
Ý là giờ thêm cách lọc là sẽ loại những MSGM có tại Q2 để tiện lọc theo nhiều cách.
Thua luôn rồi..................
Trong file bài #6, ô Q2 bạn có 3 lựa chọn:
1/ Để trống: Lấy tất các mã
2/ Nhập 1 mã, ví dụ "GMA", lọc chỉ lấy mã "GMA"
3/ Nhập "<>GMA", lọc lấy tất cả các mã khác với "GMA".
Tương tự bạn có thể áp dụng cho ô P2.
Các ngày trong O1 và O2 bắt buộc phải có.
Bạn muốn có bao nhiêu cái "tiện..." nữa?
 
Lần chỉnh sửa cuối:
Ý là giờ thêm cách lọc là sẽ loại những MSGM có tại Q2 để tiện lọc theo nhiều cách.
Bạn thử tải file trong bài này về tham khảo thêm bài này xem có ứng dụng được gì không, trong file đó có rất nhiều các làm khác nhau:
 
Bạn thử tải file trong bài này về tham khảo thêm bài này xem có ứng dụng được gì không, trong file đó có rất nhiều các làm khác nhau:
Bài trong link đó có điều kiện tìm kiếm không chuẩn mà cứ khoe hoài. Bài chủ đề này xài Acvanced filter của lão @Ba Tê là đủ, cái đó chuẩn.
 
Bài trong link đó có điều kiện tìm kiếm không chuẩn mà cứ khoe hoài. Bài chủ đề này xài Acvanced filter của lão @Ba Tê là đủ, cái đó chuẩn.
Ơ, chú Mỹ cứ thù con cái vụ dữ liệu không chuẩn chỉnh nhỉ hehe.
Thầy BaTê mà tham gia thì không còn gì mà chê được nữa. Nhưng vì con thấy bạn đó đòi tiện hơn gì đó mới bảo qua đó tham khảo thêm nhiêug cách khác nữa ạ.
 
Thua luôn rồi..................
Trong file bài #6, ô Q2 bạn có 3 lựa chọn:
1/ Để trống: Lấy tất các mã
2/ Nhập 1 mã, ví dụ "GMA", lọc chỉ lấy mã "GMA"
3/ Nhập "<>GMA", lọc lấy tất cả các mã khác với "GMA".
Tương tự bạn có thể áp dụng cho ô P2.
Các ngày trong O1 và O2 bắt buộc phải có.
Bạn muốn có bao nhiêu cái "tiện..." nữa?
Chỗ đổi ngày qua dạng số nhìn bất tiện, làm trực tiếp tại O2, O3 luôn được không.
 
x

xóa luôn được không.
Được chứ bạn, bạn có thể xử lý trong code chuyển vùng điều kiện lọc ra chỗ khác tránh xa vùng dữ liệu của bạn gọi là vùng tạm.
Sau đó code sẽ đưa dữ liệu điều kiện lọc vào các vùng này (link từ từ các ô mà bạn muốn) sau khi lọc dữ liệu xong code xóa sạch cái vùng tạm này đi không để lại dấu vết.
 
Được chứ bạn, bạn có thể xử lý trong code chuyển vùng điều kiện lọc ra chỗ khác tránh xa vùng dữ liệu của bạn gọi là vùng tạm.
Sau đó code sẽ đưa dữ liệu điều kiện lọc vào các vùng này (link từ từ các ô mà bạn muốn) sau khi lọc dữ liệu xong code xóa sạch cái vùng tạm này đi không để lại dấu vết.
làm giúp mình đi
 
Bạn thử xóa dữ liệu trong cột R và S rồi sử dụng đoạn code này xem:
Mã:
Option Explicit

Sub GPE()

    Dim r As Long, rTam As Range
    Const cTam As String = "ZZ1"
    r = Sheets("Chi tiet").Range("A100000").End(xlUp).Row
    With Sheets("Tong hop")
        .Range("A1:M" & r).Clear
        Set rTam = .Range(cTam)
        rTam.Resize(2, 2).Value = .Range("P1:Q2").Value
        rTam.Offset(, 2).Resize(, 2).Value = Sheets("Chi tiet").Range("A1")
        rTam.Offset(1, 2).Value = ">=" & .Range("O1").Value
        rTam.Offset(1, 3).Value = "<=" & .Range("O2").Value
        Sheets("Chi tiet").Range("A1:M" & r).AdvancedFilter Action:=xlFilterCopy, _
            CriteriaRange:=rTam.Resize(2, 4), CopyToRange:=.Range("A1:M1"), Unique:=False
        rTam.Resize(2, 4).Clear
    End With
    
End Sub
 
Web KT
Back
Top Bottom