Lọc và hiển thị dữ liệu theo nhiều điều kiện.

  • Thread starter Thread starter rosy84
  • Ngày gửi Ngày gửi
Liên hệ QC
Nhầm tí sửa lại mà muộn rồi, Pivot lấy DS Area duy nhất rồi chứ, nhưng không rút gọn cho riêng từng Location. Bấm xổ xuống vẫn là 9 cái để chọn, chứ không phải chỉ có 3. không biết cái nào, thậm chí không biết mấy cái.

Mục đích của tác giả là chỉ chọn 1 trong 3 thôi mà. Dữ liệu giả lập thì nó ít vậy và còn có thứ tự sẵn riêng cho từng Location, thực tế nó nằm tùm lum xen kẽ nhau cơ.

attachment.php

Cũng không đến nổi khó lắm ---> Khi vừa chọn 1 Item trong Location thì danh sách trích lọc tại cột AD được show ra là những Item duy nhất... Muốn trích tiếp AD, đương nhiên ta phải nhìn vào cột AD này trước, xem thử nó bao gồm những phần tử nào rồi hãy chọn
Ví dụ như hình tại bài #17 ---> Với Location = K17 thì nhìn vào cột AD ta thấy nó chứa 1 list gồm: IQ1, IQ2 và IQ3 ---> Vậy đương nhiên khi bấm mũi tên xổ xuống của AD, ta phải chọn mấy Item này chứ ---> Chọn sai ráng chịu chứ
Ẹc... Ẹc...
 
Lần chỉnh sửa cuối:
Ẹc ẹc:
Lần 1: Chọn Location - Dòm List Area, Xổ Dropdown Area, bỏ chọn "Show All", chọn Area, OK.

Lần 2: Chọn Location khác, Dòm List Area: tống tơn, có gì mà dòm.
Ec ẹc, xổ Dropdown Area, chọn "Show all", OK xem nó ra cái giống gì, xổ xuống cái nữa, bỏ chọn "Show All", chọn cái Area mới vừa đọc, OK
Ẹc ẹc ẹc ẹc. Người làm thay máy!
 
Lần chỉnh sửa cuối:
Tôi vừa phát hiện ra 1 lổi nghiêm trọng khi dùng AutoFilter với bài toán này, đó là với dử liệu lớn thì SpecialCells sẽ không làm việc
Cải tiến thêm 1 bước, dùng toàn bộ bằng Advanced Filter (chúng ta đã quên rằng lọc duy nhất có thể kết hợp luôn điều kiện)
Code như sau:
PHP:
Private Sub Worksheet_Activate()
  On Error Resume Next
  With Sheets("Data").Range("A1").CurrentRegion
    .Parent.Range("M:M").ClearContents
    .Resize(, 1).AdvancedFilter 2, , .Parent.Range("M1"), True
  End With
  DelAFName
End Sub
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  On Error Resume Next
  If Target.Address = "$C$2" Or Target.Address = "$C$4" Then
    Range("B6:F60000").ClearContents
    Range("A7:A60000").ClearContents
    With Sheets("Data").Range("A1").CurrentRegion
      If Target.Address = "$C$2" Then
        .Parent.Range("K:L").Clear
        .Resize(, 2).AdvancedFilter 2, .Parent.Range("O1:O2"), .Parent.Range("K1"), True
        .Parent.Range("K:K").Clear
        DelAFName
      End If
      .AdvancedFilter 2, .Parent.Range("O1:P2"), Range("B6")
      DelAFName
      With Range("A6").CurrentRegion
        .Offset(, 1).Resize(, 2).Delete 1
        If .Rows.Count > 1 Then
          .Resize(, 1).SpecialCells(4).Value = Evaluate("ROW(R:R)")
        End If
      End With
    End With
  End If
End Sub
PHP:
Private Sub DelAFName()
  ThisWorkbook.Sheets("Data").Names("Extract").Delete
  ThisWorkbook.Sheets("Data").Names("Criteria").Delete
End Sub
Không có vòng lập, có có duy nhất Advanced Filter nên tôi nghĩ code này sẽ nhanh hơn
Đoạn này:
.Resize(, 2).AdvancedFilter 2, .Parent.Range("O1:O2"), .Parent.Range("K1"), True
chính là để thay thế cho vòng lập ở file trước
 

File đính kèm

Web KT

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

Back
Top Bottom