Nhờ mọi người giúp em lọc dữ liệu theo các điều kiện trong file

Liên hệ QC

duong22000

Thành viên thường trực
Tham gia
8/5/13
Bài viết
322
Được thích
23
Em đang làm thử 1 file và có các điều kiện lọc:
Lọc trực tiếp dữ liệu tại sheet("DL") với các điều kiện sau:

- ĐK 1: Tại ô B9 và D9 (điều kiện ngày theo cột B11:B) : Dữ liệu sẽ lọc tất cả các ngày trong bảng dữ liệu có liên quan.

- ĐK 2: Tiếp đó, nếu ô C7 (điều kiện mã trang phục theo cột F11:F) nhập dữ liệu thì dữ liệu lại tiếp tục lọc tất cả các mã trang phục theo ô C7.

- ĐK 3: Nếu ta nhập tiếp số điện thoại tại ô C6 (theo cột C11:C) thì dữ liệu lọc tiếp các dữ liệu có liên quan tại các ô c7, B9, D9.

* Nếu ô C6 không có dữ liệu , ô C7 có dữ liệu thì sẽ lọc theo Đk1 và ĐK2

* Nếu ô C7 không có dữ liệu, C6 có dữ liệu thì sẽ lọc theo ĐK1 và ĐK3


Em có gửi file đính kèm để mọi người giúp em xử lý các trường hợp này.
Em xin cảm ơn mọi người trên GPE!
 

File đính kèm

  • loc_DL.xls
    38.5 KB · Đọc: 13
Em không biết Code VBA có giải quyết được trường hợp trên không ạ, mong mọi người giúp em!
 
Hihihi cảm ơn snow25 đã giúp đỡ!
Đây bạn xem nhe.
Mã:
Sub sapxep()
Dim arr, arr1, T, aT, aso()
Dim fdate As Date, edate As Date
Dim i As Long, j As Long, a As Long, b As Long, c As Long, k As Long, d As Long
Dim dk As String, dks As String
With Sheet1
     b = .Range("A" & Rows.Count).End(xlUp).Row
     If b > 10 Then arr = .Range("A11:N" & b).Value Else MsgBox "Khong co du lieu": Exit Sub
     ReDim arr1(1 To UBound(arr, 1), 1 To 14)
End With
With Sheet2
     T = Array(3, 6)
     aT = Array(.Range("C6").Value, .Range("c7").Value)
     If .Range("B9").Value = Empty Then fdate = 1 Else fdate = .Range("B9").Value
     If .Range("D9").Value = Empty Then edate = 50000 Else edate = .Range("D9").Value
     For i = LBound(aT) To UBound(aT)
         If aT(i) <> Empty Then
            c = c + 1
             If dk = Empty Then
                dk = aT(i)
             Else
                dk = dk & aT(i)
             End If
            ReDim Preserve aso(1 To c)
            aso(c) = T(i)
         End If
     Next i
     For i = 1 To UBound(arr, 1)
        dks=Empty
         If CLng(arr(i, 2)) >= CLng(fdate) And CLng(arr(i, 2)) <= CLng(edate) Then
            On Error Resume Next
               For k = LBound(aso) To UBound(aso)
                   If dks = Empty Then
                      dks = arr(i, aso(k))
                    Else
                       dks = dks & arr(i, aso(k))
                    End If
                Next k
               If UCase(dk) = UCase(dks) Then
                  a = a + 1
                  arr1(a, 1) = a
                  For j = 2 To 14
                      arr1(a, j) = arr(i, j)
                   Next j
               End If
        End If
    Next i
   d = .Range("B" & Rows.Count).End(xlUp).Row
   If d > 10 Then .Range("A11:N" & d).ClearContents
   If a Then .Range("A11").Resize(a, 14).Value = arr1
End With
End Sub
 

File đính kèm

  • loc_DL.xls
    52.5 KB · Đọc: 11
Lần chỉnh sửa cuối:
Bạn có thể xài AdvancedFilte (có trợ giúp từ VBA) như file:
 

File đính kèm

  • Filter.rar
    16.9 KB · Đọc: 10
Em xin cảm ơn 2 bác: SA_DQsnow25 !
Em đã thử cả 2 file của 2 bác, tuy nhiên khi em test thử thì kết quả chưa được như ý: Chưa xử lý được hết các trường hợp của bài đưa ra ở các điều kiện:
Thứ nhất là phải lọc sang sheet khác, em lại muốn lọc trực tiếp trên sheet bảng dữ liệu để tra cứu xem và sửa luôn trên sheet("DL")
Thứ hai:
VD: Chỉ có ĐK1 thì dữ liệu vẫn lọc theo ĐK1
Khi có thêm ĐK2 thì tiếp tục lọc tiếp theo kết quả ở ĐK1
Khi có thêm ĐK3 thì tiếp tục lọc tiếp theo kết quả ở ĐK1 + ĐK2
Khi không có ĐK2 mà chỉ có ĐK1 + ĐK3, kết quả lọc theo ĐK1 + ĐK3
Tương tự không có ĐK3 mà chỉ có ĐK1 + ĐK2, kết quả lọc theo ĐK1 + ĐK2

Em mong các bác kiểm tra và sửa lại giúp em !
 
Em xin cảm ơn 2 bác: SA_DQsnow25 !
Em đã thử cả 2 file của 2 bác, tuy nhiên khi em test thử thì kết quả chưa được như ý: Chưa xử lý được hết các trường hợp của bài đưa ra ở các điều kiện:
Thứ nhất là phải lọc sang sheet khác, em lại muốn lọc trực tiếp trên sheet bảng dữ liệu để tra cứu xem và sửa luôn trên sheet("DL")
Thứ hai:
VD: Chỉ có ĐK1 thì dữ liệu vẫn lọc theo ĐK1
Khi có thêm ĐK2 thì tiếp tục lọc tiếp theo kết quả ở ĐK1
Khi có thêm ĐK3 thì tiếp tục lọc tiếp theo kết quả ở ĐK1 + ĐK2
Khi không có ĐK2 mà chỉ có ĐK1 + ĐK3, kết quả lọc theo ĐK1 + ĐK3
Tương tự không có ĐK3 mà chỉ có ĐK1 + ĐK2, kết quả lọc theo ĐK1 + ĐK2

Em mong các bác kiểm tra và sửa lại giúp em !
Dùng cột phụ cho lành: Filter cột O, chọn 1

Thân
 

File đính kèm

  • loc_DL.xls
    34.5 KB · Đọc: 6
Em xin cảm ơn 2 bác: SA_DQsnow25 !
Em đã thử cả 2 file của 2 bác, tuy nhiên khi em test thử thì kết quả chưa được như ý: Chưa xử lý được hết các trường hợp của bài đưa ra ở các điều kiện:
Thứ nhất là phải lọc sang sheet khác, em lại muốn lọc trực tiếp trên sheet bảng dữ liệu để tra cứu xem và sửa luôn trên sheet("DL")
Thứ hai:
VD: Chỉ có ĐK1 thì dữ liệu vẫn lọc theo ĐK1
Khi có thêm ĐK2 thì tiếp tục lọc tiếp theo kết quả ở ĐK1
Khi có thêm ĐK3 thì tiếp tục lọc tiếp theo kết quả ở ĐK1 + ĐK2
Khi không có ĐK2 mà chỉ có ĐK1 + ĐK3, kết quả lọc theo ĐK1 + ĐK3
Tương tự không có ĐK3 mà chỉ có ĐK1 + ĐK2, kết quả lọc theo ĐK1 + ĐK2

Em mong các bác kiểm tra và sửa lại giúp em !
Đây bạn xem.
Mã:
Sub loc()
Dim a As Long
Dim s As String, s1 As String
Dim fdate As Date, edate As Date
With Sheet1
    fdate = .Range("B9").Value
    edate = .Range("D9").Value
    If .Range("c6").Value = Empty Then s = "*" Else s = .Range("c6").Value
    If .Range("c7").Value = Empty Then s1 = "*" Else s1 = .Range("c7").Value
   ActiveSheet.Range("A10:N10").AutoFilter Field:=2, Criteria1:=">=" & CLng(fdate), Operator:=xlAnd, Criteria2:="<=" & CLng(edate)
   ActiveSheet.Range("A10:N10").AutoFilter Field:=6, Criteria1:=s1
   ActiveSheet.Range("A10:N10").AutoFilter Field:=3, Criteria1:=s
End With
End Sub
 

File đính kèm

  • loc_DL (2).xls
    48 KB · Đọc: 10
Đây bạn xem.
Mã:
Sub loc()
Dim a As Long
Dim s As String, s1 As String
Dim fdate As Date, edate As Date
With Sheet1
    fdate = .Range("B9").Value
    edate = .Range("D9").Value
    If .Range("c6").Value = Empty Then s = "*" Else s = .Range("c6").Value
    If .Range("c7").Value = Empty Then s1 = "*" Else s1 = .Range("c7").Value
   ActiveSheet.Range("A10:N10").AutoFilter Field:=2, Criteria1:=">=" & CLng(fdate), Operator:=xlAnd, Criteria2:="<=" & CLng(edate)
   ActiveSheet.Range("A10:N10").AutoFilter Field:=6, Criteria1:=s1
   ActiveSheet.Range("A10:N10").AutoFilter Field:=3, Criteria1:=s
End With
End Sub
Xin cảm ơn bác snow25, em đã chạy thử code của bác và kết quả đã lọc theo các điều kiện./
 
Xin cảm ơn bác snow25, em đã chạy thử code của bác và kết quả đã lọc theo các điều kiện./
Tuy nhiên còn 1 vấn đề nữa mong bác giúp:
Sau khi lọc thì bảng dữ liệu đang hiển thị kết quả lọc nhưng bây giờ em muốn khi quay lại sheet thì kết quả lại hiện lại tất cả các dữ liệu
Em thử dùng
Mã:
Private Sub Worksheet_Activate()
Range("A10:n10").Select
Selection.AutoFilter
End Sub
thì cũng hiển thị tất cả dữ liệu
Tuy nhiên do bảng dữ liệu sẽ lớn và em chạy thử code trên thì file chạy rất chậm để chạy calculating 45%...
Vậy em hỏi bác xem còn cách nào để khi quay lại sheet("DL") thì hiển thị lại tất cả dữ liệu mà file không chạy chậmvì phải load calculating 45%... không ạ???
 
Tuy nhiên còn 1 vấn đề nữa mong bác giúp:
Sau khi lọc thì bảng dữ liệu đang hiển thị kết quả lọc nhưng bây giờ em muốn khi quay lại sheet thì kết quả lại hiện lại tất cả các dữ liệu
Em thử dùng
Mã:
Private Sub Worksheet_Activate()
Range("A10:n10").Select
Selection.AutoFilter
End Sub
thì cũng hiển thị tất cả dữ liệu
Tuy nhiên do bảng dữ liệu sẽ lớn và em chạy thử code trên thì file chạy rất chậm để chạy calculating 45%...
Vậy em hỏi bác xem còn cách nào để khi quay lại sheet("DL") thì hiển thị lại tất cả dữ liệu mà file không chạy chậmvì phải load calculating 45%... không ạ???
Bạn thử thế này xem.
Mã:
Private Sub Worksheet_Activate()
Range("A10:n10").AutoFilter
End Sub
 
Chắc tại file của em còn có công thức ở bảng dữ liệu nên file chạy chậm khi mở sheet("DL"), em không cho công thức chạy lúc đó nữa thì thấy file đã load nhanh hơn...
 
Web KT
Back
Top Bottom