Lọc Dữ Liệu Nhiều Điều Kiện (1 người xem)

  • Thread starter Thread starter LamNA
  • Ngày gửi Ngày gửi
Liên hệ QC

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

LamNA

Thành viên tích cực
Tham gia
3/6/14
Bài viết
897
Được thích
725
Giới tính
Nam
Nghề nghiệp
Quản Lý Cửa Hàng
Chào anh chị GPE
Em đang có 1 file lọc dữ liệu nhưng hiện tại chỉ lọc được 1 điều kiện, nhờ anh chị hỗ trợ code có thể thỏa mãn nhiều điều kiện lọc tương ứng từ 1 - 13 của sheet DATA
Em cám ơn
 

File đính kèm

Chào anh chị GPE
Em đang có 1 file lọc dữ liệu nhưng hiện tại chỉ lọc được 1 điều kiện, nhờ anh chị hỗ trợ code có thể thỏa mãn nhiều điều kiện lọc tương ứng từ 1 - 13 của sheet DATA
Em cám ơn
Thử:
PHP:
Sub Loc()
    With Sheets("DATA").Range("A2:M2")
        .AutoFilter
        .AutoFilter Field:=4, Criteria1:="123"
        .AutoFilter Field:=12, Criteria1:="PK"
        .Range("A2").CurrentRegion.Offset(1, 0).SpecialCells(xlCellTypeVisible).Copy Sheets("VBA").Range("A3")
        .AutoFilter
    End With
End Sub
 
Upvote 0
Viết thêm bài nữa nếu không lại có nhiều người thử làm bài...

- Chủ thớt là người muốn và muốn dùng code đang có trong file (vì đang mần cái này) nên Advanced Filter tạm gác.

- Chủ thớt cần lọc 13 điều kiện nhưng không rõ: đồng thời 13 điều kiện hay lựa chọn nhập vào thì lấy làm điều kiện (ô trống bỏ qua), điều kiện cục thể thì vẫn đang nằm trong đầu chủ thớt (đang mải mê mần code mà) - đó là điều kiện =<> ứng với các tiêu chí nhập vào.
 
Upvote 0
Viết thêm bài nữa nếu không lại có nhiều người thử làm bài...

- Chủ thớt là người muốn và muốn dùng code đang có trong file (vì đang mần cái này) nên Advanced Filter tạm gác.

- Chủ thớt cần lọc 13 điều kiện nhưng không rõ: đồng thời 13 điều kiện hay lựa chọn nhập vào thì lấy làm điều kiện (ô trống bỏ qua), điều kiện cục thể thì vẫn đang nằm trong đầu chủ thớt (đang mải mê mần code mà) - đó là điều kiện =<> ứng với các tiêu chí nhập vào.
Vâng em xin giải thích thêm
- 13 điều kiện nghĩa là 13 cột tương ứng trong Sheet"DATA"
- Điều kiện lọc là mình sẽ nhập tương ứng từ O2 đến O14 nếu thỏa mãn sẽ tự lọc
Mã:
Sub LocTest()
Dim sArr(), Arr, i As Long, J As Long, K As Long, r As Long, Col As Long, DK As Range, Cll As Range
With Sheets("DATA")
    sArr = .Range("A1", .Range("A3").End(xlDown)).Resize(, .Range("A1").End(xlToRight).Column).Value
    r = UBound(sArr)
    Arr = Sheets("VBA").Range("A1", Sheets("VBA").Range("A1").End(xlToRight)).Value
    Col = UBound(Arr, 2)
End With
ReDim dArr(1 To r, 1 To Col)
Set DK = Sheets("VBA").Range("O2:O14")
With CreateObject("Scripting.Dictionary")

    For Each Cll In DK
        If Cll <> Empty Then .Item(UCase(Cll.Value)) = ""
    Next Cll
    For i = 1 To r
        If .Exists(UCase(sArr(i, 4))) Then 'Lọc cột 4 của sheet"DATA" với điều kiện 123 ở Sheet"VBA" => Làm sao chọn được 1 vùng data từ cột thứ 1 đến cột 13 trong sheet"DATA" 
            K = K + 1
            For J = 1 To Col
                dArr(K, J) = sArr(i, Arr(1, J))
            Next J
       End If
    Next i
End With
Sheets("VBA").Range("A3").Resize(1000, Col).ClearContents
If K Then Sheets("VBA").Range("A3").Resize(K, Col) = dArr
Set DK = Nothing
End Sub
 
Upvote 0
Mình đọc kỹ lại xem...

"cần lọc 13 điều kiện nhưng không rõ: đồng thời 13 điều kiện hay lựa chọn nhập vào thì lấy làm điều kiện (ô trống bỏ qua), điều kiện cục thể thì vẫn đang nằm trong đầu chủ thớt (đang mải mê mần code mà) - đó là điều kiện =<>(bằng, khác, lớn hơn, bé hơn) ứng với các tiêu chí nhập vào. "
 
Upvote 0
Mình đọc kỹ lại xem...

"cần lọc 13 điều kiện nhưng không rõ: đồng thời 13 điều kiện hay lựa chọn nhập vào thì lấy làm điều kiện (ô trống bỏ qua), điều kiện cục thể thì vẫn đang nằm trong đầu chủ thớt (đang mải mê mần code mà) - đó là điều kiện =<>(bằng, khác, lớn hơn, bé hơn) ứng với các tiêu chí nhập vào này. "
Anh có thể chỉ rõ giúp em vấn đề đang nằm ở đâu. Theo em hiểu ý anh kêu em nhập "=<> " ở phần này
Mã:
If Cll <> Empty Then .Item(UCase(Cll.Value)) = ""
Em cám ơn
 
Lần chỉnh sửa cuối:
Upvote 0
Anh có thể chỉ rõ giúp em vấn đề đang nằm ở đâu. Theo em hiểu ý anh kêu em nhập "=<> " ở phần này
Mã:
If Cll <> Empty Then .Item(UCase(Cll.Value)) = ""
Em cám ơn
Chắc là nói về cái mà tôi dùng trong bài #14 - thủ thuật "bỏ điều kiện"

https://www.giaiphapexcel.com/diendan/threads/tìm-kiếm-dữ-liệu-theo-nhiều-điều-kiện-trong-một-khoảng-thời-gian.134770/post-856407

Nhưng nhìn kỹ lại thì không đúng :D

Cái của tôi là "<>="
 
Upvote 0
Bây giờ nhìn kỹ các bài khác thì thấy là code chứ không phải công thức.

Hôm nay nóng quá óc đang bốc hơi đây :D
 
Upvote 0
Chắc là nói về cái mà tôi dùng trong bài #14 - thủ thuật "bỏ điều kiện"

https://www.giaiphapexcel.com/diendan/threads/tìm-kiếm-dữ-liệu-theo-nhiều-điều-kiện-trong-một-khoảng-thời-gian.134770/post-856407

Nhưng nhìn kỹ lại thì không đúng :D

Cái của tôi là "<>="
Dạ em đang cần hỗ trợ ở topic này
về phần code
Mã:
Set DK = Sheets("VBA").Range("O2:O14") 'vùng điều kiện
------------------
----------------
    For i = 1 To r
        If .Exists(UCase(sArr(i, 4))) Then 'vùng data để lọc
-----------------
------------------
End With
thì nó đang lọc cột 4 của sheet"DATA" với điều kiện 123 ở Sheet"VBA" => Làm sao chọn được 1 vùng data từ cột thứ 1 đến cột thứ 13 trong sheet"DATA" thay cho số 4 trong code nó chỉ lọc 1 cột duy nhất
Em cám ơn
 
Upvote 0
Đoán cái này còn khó hơn đoán kết quả World Cup.
 
Upvote 0
Có thể xài Advanced Filter để ra kết quả như bạn ở bài #3 nói,nhưng chắc là chủ thớt không muốn sử dụng advanced filter mà muốn chỉnh sửa code hiện tại để có thể chạy được theo ý chủ thớt?
 
Upvote 0
nhập "=<> " ở phần này
Nhập gì chứ, mình đã nêu được yêu cầu đâu mà nhập nhập.
Ý gì đâu, nghĩa ở mặt chữ.
(1) "cần lọc 13 điều kiện nhưng không rõ: đồng thời 13 điều kiện hay lựa chọn nhập vào thì lấy làm điều kiện (ô trống bỏ qua)"
Mình đang muốn nhập điều kiện vào 13 ô: O2:O14 (sheet VBA) đó sao?
Vậy:
- Nhập đủ 13 điều kiện vào 13 ô đó rồi mới lọc?
- Hay ô nào có nhập thì lấy ô đó làm điều kiện? Tức là có những ô không nhập (bỏ trống) thì bỏ qua không xét tới nó.

(2) "điều kiện =<> (bằng, khác, lớn hơn, bé hơn) ứng với các tiêu chí nhập vào."
Với mỗi tiêu chí cần xét nhập vào 13 ô O2:O14 thì điều kiện xét /đối chiếu dữ liệu đã cho với các tiêu chí đó như nào?
- Mấy cột là chuỗi (Mã, tên sản phẩm, đơn vị, tên TT....) đối chiếu với tiêu chí nhập vào (O2:O14) thì xét lấy giống, gần giống, hay khác?
- Mấy cột là số (số lượng, giá trị) đối chiếu với tiêu chí nhập vào thì xét lấy bằng, lớn hơn, bé hơn?

--------------------
Phải dí như thế không biết hiểu không?
Sau 14 bài không biết chủ đề đã bắt đầu khởi động được chưa? Hay vẫn oằn tà là vằn....
Cỡ vài tháng mới thấy được một bài mà chủ thớt đăng bài đầy đủ yêu cầu, vào đề luôn, và từ bài #2 là bài giải luôn.
 
Upvote 0
Nhập gì chứ, mình đã nêu được yêu cầu đâu mà nhập nhập.

Ý gì đâu, nghĩa ở mặt chữ.
(1) "cần lọc 13 điều kiện nhưng không rõ: đồng thời 13 điều kiện hay lựa chọn nhập vào thì lấy làm điều kiện (ô trống bỏ qua)"
Mình đang muốn nhập điều kiện vào 13 ô: O2:O14 (sheet VBA) đó sao?
Vậy:
- Nhập đủ 13 điều kiện vào 13 ô đó rồi mới lọc?
- Hay ô nào có nhập thì lấy ô đó làm điều kiện? Tức là có những ô không nhập (bỏ trống) thì bỏ qua không xét tới nó.

(2) "điều kiện =<> (bằng, khác, lớn hơn, bé hơn) ứng với các tiêu chí nhập vào."
Với mỗi tiêu chí cần xét nhập vào 13 ô O2:O14 thì điều kiện xét /đối chiếu dữ liệu đã cho với các tiêu chí đó như nào?
- Mấy cột là chuỗi (Mã, tên sản phẩm, đơn vị, tên TT....) đối chiếu với tiêu chí nhập vào (O2:O14) thì xét lấy giống, gần giống, hay khác?
- Mấy cột là số (số lượng, giá trị) đối chiếu với tiêu chí nhập vào thì xét lấy bằng, lớn hơn, bé hơn?

--------------------
Phải dí như thế không biết hiểu không?
Sau 14 bài không biết chủ đề đã bắt đầu khởi động được chưa? Hay vẫn oằn tà là vằn....
Cỡ vài tháng mới thấy được một bài mà chủ thớt đăng bài đầy đủ yêu cầu, vào đề luôn, và từ bài #2 là bài giải luôn.
Chắc em chưa diễn giải 1 cách dễ hiểu nhất, em cũng tự mò và có cách làm cho điều mình cần
- Hay ô nào có nhập thì lấy ô đó làm điều kiện? Tức là có những ô không nhập (bỏ trống) thì bỏ qua không xét tới nó. => Riêng phần này đúng là em cần nhưng chưa giải quyết được.
 
Upvote 0
Dạ em đang cần hỗ trợ ở topic này
về phần code
Mã:
Set DK = Sheets("VBA").Range("O2:O14") 'vùng điều kiện
------------------
----------------
    For i = 1 To r
        If .Exists(UCase(sArr(i, 4))) Then 'vùng data để lọc
-----------------
------------------
End With
thì nó đang lọc cột 4 của sheet"DATA" với điều kiện 123 ở Sheet"VBA" => Làm sao chọn được 1 vùng data từ cột thứ 1 đến cột thứ 13 trong sheet"DATA" thay cho số 4 trong code nó chỉ lọc 1 cột duy nhất
Em cám ơn
Muốn xét hơn 1 điều kiện (đk) thì dùng thêm vòng lặp xét điều kiện thôi.

Nhưng phải cung cấp các đk khác với bạn đang làm. Bạn nhập 123 vào ô đầu tiên trong vùng đk, tức O2, nhưng tôi hiểu đó là đk cho cột 4 - cột D, cột MÃ TT. Nhưng tôi là người thì tôi đoán mò được còn code làm sao nó biết là 123 là đk cho cột MÃ TT? Vì thễ các đk phải nhập vào O2:O14 theo đúng thứ tự cột trong bảng dữ liệu. Vd. nhập PK vào O13 (ô thứ 12 của vùng đk) thì hiểu có là đk cho cột 12 - cột L, cột NH

Ngoài ra bạn còn có những cột khác cũng là số. Vd. cột 5 - E, cột Số lượng. Nếu bạn nhập như bây giờ là O2 = 123 thì đó là đk cho MÃ TT hay cho Số lượng? Bạn có thể nói: Tôi sẽ không bao giờ tìm theo số lượng vì nhu cầu đó là không thực tế. Nhưng một khi bạn bắt xét cả 13 đk thì người viết code bắt buộc phải xét 13 đk. Thế thôi.

Tóm lại các đk phải nhập đúng vào vùng đk O2:O14. 13 ô đk từ trên xuống dưới là đk cho 13 cột từ A đến M
Tôi test có 3 lần và chỉ nhìn qua kết quả. Bạn tự test.
Mã:
Sub LocTest()
Dim lastRow As Long, count As Long, r As Long, c As Long, good As Boolean
Dim sArr(), dk(), result(), key, dic As Object
'    xoa ket qua cu
    Application.EnableEvents = False
    Sheets("VBA").Range("A3").Resize(10000, 13).ClearContents
    Application.EnableEvents = True
    With Sheets("DATA")
        lastRow = .Cells(Rows.count, "A").End(xlUp).Row
'        khong co du lieu thi ket thuc
        If lastRow < 3 Then Exit Sub
        sArr = .Range("A3:M" & lastRow).Value
    End With
    Set dic = CreateObject("Scripting.Dictionary")
    dk = Sheets("VBA").Range("O2:O14").Value
    
    For r = 1 To UBound(dk)
        If Not IsEmpty(dk(r, 1)) Then dic.Add r, LCase(dk(r, 1))  ' dieu kien dk(r, 1) cho cot r
    Next r
    If dic.count = 0 Then
'        khong co dieu kien, vay coi nhu cac dieu kien deu thoa
        Sheets("VBA").Range("A3").Resize(UBound(sArr), UBound(sArr, 2)).Value = sArr
        Exit Sub
    End If
    ReDim result(1 To UBound(sArr), 1 To UBound(sArr, 2))
    For r = 1 To UBound(sArr)
        good = True
        For Each key In dic.keys
            If LCase(sArr(r, key)) <> dic.Item(key) Then
'                it nhat 1 dk khong thoa vay khong xet tiep dk sau
                good = False
                Exit For
            End If
        Next key
        If good Then
'            neu tat ca cac dk thoa thi lay dong hien hanh
            count = count + 1
            For c = 1 To UBound(sArr, 2)
                result(count, c) = sArr(r, c)
            Next c
        End If
    Next r
    If count Then
'        neu co ket qua thi nhap xuong sheet
        Application.EnableEvents = False
        Sheets("VBA").Range("A3").Resize(count, UBound(result, 2)).Value = result
        Application.EnableEvents = True
    End If
    Set dic = Nothing
End Sub
 
Upvote 0
Chắc em chưa diễn giải 1 cách dễ hiểu nhất, em cũng tự mò và có cách làm cho điều mình cần
- Hay ô nào có nhập thì lấy ô đó làm điều kiện? Tức là có những ô không nhập (bỏ trống) thì bỏ qua không xét tới nó. => Riêng phần này đúng là em cần nhưng chưa giải quyết được.
Đến bài này, nhưng bạn giải thích cũng chưa rõ ràng, và chưa có ví dụ cụ thể.
1/ Sheet DATA bạn có 13 cột: Ý bạn muốn lọc đủ tiêu chí 13 cột hay sao? theo điều kiện này là bất hợp lý.
2/ Cột L (NH) Sheet DATA bạn có 9 tiêu chí là (ĐIỆN GIA DỤNG, ĐIỆN LẠNH, ĐIỆN TỬ, ĐTDĐ, DV, KHÁC, MTB, MTXT, PK): Ý bạn muốn lọc vài tiêu chí trong cột này hay sao?
3/ Cột O Sheet VBA: Bạn đưa ra tiêu chí 123, PK nhưng dữ liệu là một đám rừng (bê nguyên dữ liệu Sheet DATA sang) thì không ai hiểu gì cả?
4/ Bạn nên có 1 sheet ví dụ lọc vài ba tiêu chí và tô màu từng tiêu chí để dễ hiểu. Cụ thể hơn là cần lọc tiêu chí nào Ví dụ ĐIỆN GIA DỤNG, ĐIỆN LẠNH cột L của sheet DATA hoặc lọc sản phẩm theo TÊN TT (cột G), chủng loại LH (cột M) .......v..v.........
 
Upvote 0
Web KT

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

Back
Top Bottom