Lọc dữ liệu-chứa nhiều điều kiện lọc?

Liên hệ QC

Hoàng Nhật Phương

Thành viên gắn bó
Tham gia
5/11/15
Bài viết
1,894
Được thích
1,213
Xin chào các bạn,
OT muốn trích lọc dữ liệu theo điều kiện nhiều điều kiện ngăn cách nhau bởi dấu ";" cụ thể xin phép được mô tả trong tập tin gửi kèm.
Nhờ các bạn xem & giúp đỡ OT với ạ.
 

File đính kèm

  • Orders-With Nulls.xlsx
    329.7 KB · Đọc: 45
Xin chào các bạn,
OT muốn trích lọc dữ liệu theo điều kiện nhiều điều kiện ngăn cách nhau bởi dấu ";" cụ thể xin phép được mô tả trong tập tin gửi kèm.
Nhờ các bạn xem & giúp đỡ OT với ạ.
Bài này nếu lập trình thì điều kiện cột B1 split ra một mảng, dò theo vùng bên sheet order ra mảng mới rồi gán xuống sheet
Còn nếu là thông thường thì dường như không lọc được, nếu muốn thì tìm hiểu thêm về advanced filter
 
Bài này nếu lập trình thì điều kiện cột B1 split ra một mảng, dò theo vùng bên sheet order ra mảng mới rồi gán xuống sheet
Còn nếu là thông thường thì dường như không lọc được, nếu muốn thì tìm hiểu thêm về advanced filter
Cảm ơn bạn đã quan tâm, nếu có thể nhờ bạn giúp đỡ OT theo cách này với ạ:
" nếu lập trình thì điều kiện cột B1 split ra một mảng, dò theo vùng bên sheet order ra mảng mới rồi gán xuống sheet"
 
Cảm ơn bạn đã quan tâm, nếu có thể nhờ bạn giúp đỡ OT theo cách này với ạ:
" nếu lập trình thì điều kiện cột B1 split ra một mảng, dò theo vùng bên sheet order ra mảng mới rồi gán xuống sheet"
Product Category có nhiều giá trị giống customer không bạn
 
PHP:
Option Explicit

Private Function CheckCriteria(ByVal strChecking As String, ByVal strCriteria As String, _
                       Optional ByVal blnMatchCase As Boolean = False) As Boolean
    'Tra ve True neu tim thay chuoi dieu kien trong strChecking'
    'strChecking: Chuoi can kiem tra'
    'strCriteria: Chuoi chua cac dieu kien loc'
    '             Neu khong nhap gi (strCriteria = Empty) tuc la thoa moi dieu kien'
    'blnMatchCase: True - phan biet chu hoa/ thuong va nguoc lai. Mac dinh False '
    Const strDeli = ";"
    Dim item As Variant, strFind As String, MatchCase As VbCompareMethod
    If Len(strCriteria) = 0 Then CheckCriteria = True: Exit Function
    If blnMatchCase = False Then MatchCase = vbTextCompare Else MatchCase = vbBinaryCompare
    For Each item In VBA.Split(strCriteria, strDeli)
        strFind = item
        If InStr(1, strChecking, strFind, MatchCase) > 0 Then
            CheckCriteria = True
            Exit For
        End If
    Next item
End Function

Áp dụng đại khái:
- Giả sử lọc không phân biệt chữ hoa/ thường
- Điều kiện ban đầu: dk1 = B1, dk2 = B2
- Chép bảng dữ liệu vào mảng.
- Xét các phần tử mảng:
ten_khach=...
loại_hang=...
If CheckCriteria(ten_khach, dk1) = True then
If CheckCriteria(loại_hang, dk2) = True then
'lấy dữ liệu vào mảng kết quả
End If
End If
 

File đính kèm

  • Orders-With Nulls.xlsx
    336.7 KB · Đọc: 26
Xin chào các bạn,
OT muốn trích lọc dữ liệu theo điều kiện nhiều điều kiện ngăn cách nhau bởi dấu ";" cụ thể xin phép được mô tả trong tập tin gửi kèm.
Nhờ các bạn xem & giúp đỡ OT với ạ.
Bạn thử code nếu lọc tất cả thì bỏ trống nhé.
Mã:
Sub loc()
   Dim arr, kq, i As Long, lr As Long, T1, T2, a As Long, b As Integer, c As Integer, dk As String, dks As String
   Dim m As Boolean, n As Boolean, k As Integer, j As Integer
   With Sheets("Orders")
        lr = .Range("H" & Rows.Count).End(xlUp).Row
        arr = .Range("A2:J" & lr).Value
        ReDim kq(1 To UBound(arr), 1 To 10)
   End With
   With Sheets("Filter")
        T1 = Split(";" & .Range("b1").Value, ";")
        T2 = Split(";" & .Range("b2").Value, ";")
        b = UBound(T1)
        c = UBound(T2)
        For i = 1 To UBound(arr)
            dk = arr(i, 8)
            dks = arr(i, 10)
            m = False: n = False
            For k = 1 To b
                If InStr(dk, T1(k)) Then
                   m = True
                   Exit For
                End If
           Next k
            For k = 1 To c
                If InStr(dks, T2(k)) Then
                   n = True
                   Exit For
                End If
           Next k
          If m = True And n = True Then
             a = a + 1
             For j = 1 To 10
                 kq(a, j) = arr(i, j)
             Next j
          End If
      Next i
        lr = .Range("H" & Rows.Count).End(xlUp).Row
        If lr > 3 Then .Range("A4:J" & lr).ClearContents
        If a Then .Range("A4:J4").Resize(a).Value = kq
  End With
End Sub
 
Dạ OT muốn sử dụng VBA bài này Bạn ạ, cảm ơn bạn nhiều.
Bài đã được tự động gộp:

PHP:
Option Explicit

Private Function CheckCriteria(ByVal strChecking As String, ByVal strCriteria As String, _
                       Optional ByVal blnMatchCase As Boolean = False) As Boolean
    'Tra ve True neu tim thay chuoi dieu kien trong strChecking'
    'strChecking: Chuoi can kiem tra'
    'strCriteria: Chuoi chua cac dieu kien loc'
    '             Neu khong nhap gi (strCriteria = Empty) tuc la thoa moi dieu kien'
    'blnMatchCase: True - phan biet chu hoa/ thuong va nguoc lai. Mac dinh False '
    Const strDeli = ";"
    Dim item As Variant, strFind As String, MatchCase As VbCompareMethod
    If Len(strCriteria) = 0 Then CheckCriteria = True: Exit Function
    If blnMatchCase = False Then MatchCase = vbTextCompare Else MatchCase = vbBinaryCompare
    For Each item In VBA.Split(strCriteria, strDeli)
        strFind = item
        If InStr(1, strChecking, strFind, MatchCase) > 0 Then
            CheckCriteria = True
            Exit For
        End If
    Next item
End Function

Áp dụng đại khái:
- Giả sử lọc không phân biệt chữ hoa/ thường
- Điều kiện ban đầu: dk1 = B1, dk2 = B2
- Chép bảng dữ liệu vào mảng.
- Xét các phần tử mảng:
ten_khach=...
loại_hang=...
If CheckCriteria(ten_khach, dk1) = True then
If CheckCriteria(loại_hang, dk2) = True then
'lấy dữ liệu vào mảng kết quả
End If
End If
Cảm ơn befaint, OT sẽ code thử 1 sub để ứng dụng hàm "CheckCriteria" của Bạn ạ.

Bạn thử code nếu lọc tất cả thì bỏ trống nhé.
Mã:
Sub loc()
   Dim arr, kq, i As Long, lr As Long, T1, T2, a As Long, b As Integer, c As Integer, dk As String, dks As String
   Dim m As Boolean, n As Boolean, k As Integer, j As Integer
   With Sheets("Orders")
        lr = .Range("H" & Rows.Count).End(xlUp).Row
        arr = .Range("A2:J" & lr).Value
        ReDim kq(1 To UBound(arr), 1 To 10)
   End With
   With Sheets("Filter")
        T1 = Split(";" & .Range("b1").Value, ";")
        T2 = Split(";" & .Range("b2").Value, ";")
        b = UBound(T1)
        c = UBound(T2)
        For i = 1 To UBound(arr)
            dk = arr(i, 8)
            dks = arr(i, 10)
            m = False: n = False
            For k = 1 To b
                If InStr(dk, T1(k)) Then
                   m = True
                   Exit For
                End If
           Next k
            For k = 1 To c
                If InStr(dks, T2(k)) Then
                   n = True
                   Exit For
                End If
           Next k
          If m = True And n = True Then
             a = a + 1
             For j = 1 To 10
                 kq(a, j) = arr(i, j)
             Next j
          End If
      Next i
        lr = .Range("H" & Rows.Count).End(xlUp).Row
        If lr > 3 Then .Range("A4:J" & lr).ClearContents
        If a Then .Range("A4:J4").Resize(a).Value = kq
  End With
End Sub
Xin chào snow25,
Code này của bạn OT copy về xóa dữ liệu cũ ở sheet finter trước sau đó chạy code thì không xuất hiện kết quả ? ở sheet Oders OT cũng bỏ lọc rồi Bạn ạ.
 
Lần chỉnh sửa cuối:
Dạ OT muốn sử dụng VBA bài này Bạn ạ, cảm ơn bạn nhiều.
Bài đã được tự động gộp:


Cảm ơn befaint, OT sẽ code thử 1 sub để ứng dụng hàm "CheckCriteria" của Bạn ạ.


Xin chào snow25,
Code này của bạn OT copy về xóa dữ liệu cũ ở sheet finter trước sau đó chạy code thì không xuất hiện kết quả ? ở sheet Oders OT cũng bỏ lọc rồi Bạn ạ.
Bạn xóa cái dấu * ở cột B2 đi thì có kết quả.
 
Bạn xóa cái dấu * ở cột B2 đi thì có kết quả.
Cảm ơn @snow25 nhiều ạ,
OT xóa dấu "*" ở ô B2 kết quả OK rồi bạn ạ, bạn cho hỏi thêm nếu không phân biệt chữ hoa chữ thường thì xử lý những chỗ nào ạ?
Bài đã được tự động gộp:

Bạn xóa cái dấu * ở cột B2 đi thì có kết quả.
A! OT xử lý được rồi cảm ơn @snow25 nhiều ạ.
Mã:
...
T1 = Split(";" & UCase(.Range("b1").Value), ";")
        T2 = Split(";" & UCase(.Range("b2").Value), ";")
...
            dk = UCase(arr(i, 8))
            dks = UCase(arr(i, 10))
            ...
 
Lần chỉnh sửa cuối:
Cảm ơn @snow25 nhiều ạ,
OT xóa dấu "*" ở ô B2 kết quả OK rồi bạn ạ, bạn cho hỏi thêm nếu không phân biệt chữ hoa chữ thường thì xử lý những chỗ nào ạ?
Bài đã được tự động gộp:


A! OT xử lý được rồi cảm ơn @snow25 nhiều ạ.
Mã:
...
T1 = Split(";" & UCase(.Range("b1").Value), ";")
        T2 = Split(";" & UCase(.Range("b2").Value), ";")
...
            dk = UCase(arr(i, 8))
            dks = UCase(arr(i, 10))
            ...
Bạn tìm hiểu lại cấu trúc hàm instr xem sao, chỗ vbtextcompare với vbbinarycompare có thể sẽ gọn hơn
 
Bạn tìm hiểu lại cấu trúc hàm instr xem sao, chỗ vbtextcompare với vbbinarycompare có thể sẽ gọn hơn
Dạ thôi Bạn ạ, rẹt cái ra kết quả luôn là ưng lắm rồi ạ, còn gọn & đẹp thì để sau nếu cái đầu của OT nó được cải thiện hơn ạ.
 
Bạn thử code nếu lọc tất cả thì bỏ trống nhé.
Mã:
Sub loc()
   Dim arr, kq, i As Long, lr As Long, T1, T2, a As Long, b As Integer, c As Integer, dk As String, dks As String
   Dim m As Boolean, n As Boolean, k As Integer, j As Integer
   With Sheets("Orders")
        lr = .Range("H" & Rows.Count).End(xlUp).Row
        arr = .Range("A2:J" & lr).Value
        ReDim kq(1 To UBound(arr), 1 To 10)
   End With
   With Sheets("Filter")
        T1 = Split(";" & .Range("b1").Value, ";")
        T2 = Split(";" & .Range("b2").Value, ";")
        b = UBound(T1)
        c = UBound(T2)
        For i = 1 To UBound(arr)
            dk = arr(i, 8)
            dks = arr(i, 10)
            m = False: n = False
            For k = 1 To b
                If InStr(dk, T1(k)) Then
                   m = True
                   Exit For
                End If
           Next k
            For k = 1 To c
                If InStr(dks, T2(k)) Then
                   n = True
                   Exit For
                End If
           Next k
          If m = True And n = True Then
             a = a + 1
             For j = 1 To 10
                 kq(a, j) = arr(i, j)
             Next j
          End If
      Next i
        lr = .Range("H" & Rows.Count).End(xlUp).Row
        If lr > 3 Then .Range("A4:J" & lr).ClearContents
        If a Then .Range("A4:J4").Resize(a).Value = kq
  End With
End Sub
Có cách nào bỏ 2 biến "m" và "n" không? :p
 
Có cách nào bỏ 2 biến "m" và "n" không? :p
Con chào Bác @HieuCD ,
Cảm ơn Bác đã quan tâm vấn đề của con ạ.
Bác mà tham gia, nhờ Bác xử lý giúp con thêm 2 điều kiện nữa lọc trong ô D1,D2,E2 theo cột "Order Date" & "Profit" với ạ:
Bắt lỗi điều kiện nếu có điều kiện trong ô D1 & D2 thì phải đủ cả 2 điều kiện từ ngày đến ngày và ngày trong ô D2 lớn hơn ngày trong ô D1thì mới code mới chạy ạ .

1609341748784.png
 

File đính kèm

  • Orders-With Nulls v2.xlsx
    326.7 KB · Đọc: 9
Con chào Bác @HieuCD ,
Cảm ơn Bác đã quan tâm vấn đề của con ạ.
Bác mà tham gia, nhờ Bác xử lý giúp con thêm 2 điều kiện nữa lọc trong ô D1,D2,E2 theo cột "Order Date" & "Profit" với ạ:
Bắt lỗi điều kiện nếu có điều kiện trong ô D1 & D2 thì phải đủ cả 2 điều kiện từ ngày đến ngày và ngày trong ô D2 lớn hơn ngày trong ô D1thì mới code mới chạy ạ .

View attachment 252181
Trời ạ, mình chỉ gợi ý code gọn và chạy nhanh hơn chút xíu mờ
 
Web KT
Back
Top Bottom