Lọc DS theo điều kiện

Liên hệ QC

stao

Thành viên hoạt động
Tham gia
29/7/08
Bài viết
113
Được thích
26
Chào các Bác, mình có file lọc ra Danh sách theo điều kiện như đính kèm.
Có cách nào rút gọn công thức phần IF không? IF thứ 2 có 2 OR thì theo mảng có rút gọn được không?
 

File đính kèm

  • Loc DS theo dieu kien.xlsx
    8.6 KB · Đọc: 18
Chào các Bác, mình có file lọc ra Danh sách theo điều kiện như đính kèm.
Có cách nào rút gọn công thức phần IF không? IF thứ 2 có 2 OR thì theo mảng có rút gọn được không?
Bạn dùng công thức này xem sao:
Mã:
=INDEX($B$5:$B$10,SMALL(IF(($A$5:$A$10=$H$3)*(($C$5:$C$10="ql")+($C$5:$C$10="gs")),ROW($1:$6)),ROW(A1)))
 
Chào các Bác, mình có file lọc ra Danh sách theo điều kiện như đính kèm.
Có cách nào rút gọn công thức phần IF không? IF thứ 2 có 2 OR thì theo mảng có rút gọn được không?
Bạn thử như vầy xem:
Mã:
=INDEX($B$5:$B$10,SMALL(IF($A$5:$A$10=$H$3,IF($C$5:$C$10={"ql","gs"},ROW($1:$6))),ROW(A1)))
 
Cảm ơn ngoctinh87 và excel_lv1.5.

Nếu nhiều hơn 6 dòng (số dòng tùy biến) thì phần rút gọn ROW($1:$6) có cách nào khác trên công thức gốc không?
Đồng thời việc rút gọn phải tăng tốc độ xử lý vì bảng của mình 3000 dòng.
 
Cảm ơn ngoctinh87 và excel_lv1.5.

Nếu nhiều hơn 6 dòng (số dòng tùy biến) thì phần rút gọn ROW($1:$6) có cách nào khác trên công thức gốc không?
Đồng thời việc rút gọn phải tăng tốc độ xử lý vì bảng của mình 3000 dòng.
Thì làm như của bạn Row(indirect()), muốn nhanh thì dùng cột phụ , chứ đã dùng mảng thì thường độ dài công thức tỷ lệ nghịch với tốc độ đấy bạn!!!
 
Cảm ơn ngoctinh87 và excel_lv1.5.

Nếu nhiều hơn 6 dòng (số dòng tùy biến) thì phần rút gọn ROW($1:$6) có cách nào khác trên công thức gốc không?
Đồng thời việc rút gọn phải tăng tốc độ xử lý vì bảng của mình 3000 dòng.
Dùng Pivottable đi bạn.
Xem file kèm.
hihi ^o^
 

File đính kèm

  • Loc DS theo dieu kien.xlsx
    82 KB · Đọc: 35
Cảm ơn ngoctinh87 và excel_lv1.5.

Nếu nhiều hơn 6 dòng (số dòng tùy biến) thì phần rút gọn ROW($1:$6) có cách nào khác trên công thức gốc không?
Đồng thời việc rút gọn phải tăng tốc độ xử lý vì bảng của mình 3000 dòng.
- Nhiều dòng quá cũng có thể dùng Advanced Filter như hình dưới.
- Dùng Pivot Table như bài trên.
- Dùng VBA.
Dùng công thức mảng cho hơn 1000 dòng hơi bị "đắm đuối" cho máy tính.AF.jpg
 
Cảm ơn các Bác nhiều. Cho mình xin cách VBA để cải thiện hiệu suất
Advanced Filter và Pivot thì phải làm tay nhiều công đoạn mà việc trích lọc này lại thường xuyên.
 
Cảm ơn các Bác nhiều. Cho mình xin cách VBA để cải thiện hiệu suất
Advanced Filter và Pivot thì phải làm tay nhiều công đoạn mà việc trích lọc này lại thường xuyên.
Bạn chạy code này:
PHP:
Sub a()
Dim arr(), result(), i As Long, j As Long
arr = Range("A5:C" & [A100000].End(xlUp).Row)
ReDim result(0 To 0): j = 0
For i = 1 To UBound(arr)
If arr(i, 1) = [H3] And (arr(i, 3) = "gs" Or arr(i, 3) = "ql") Then
    result(j) = arr(i, 2): j = j + 1
    ReDim Preserve result(0 To j)
End If
Next i
[g5].Resize(j, 1) = WorksheetFunction.Transpose(result)
End Sub
 
Cảm ơn các Bác nhiều. Cho mình xin cách VBA để cải thiện hiệu suất
Advanced Filter và Pivot thì phải làm tay nhiều công đoạn mà việc trích lọc này lại thường xuyên.
Điều kiện Type bạn muốn lọc mấy mã thì nhập đầy đủ vào tư G2 sang phải.
Bạn chạy thử với dữ liệu 5000 dòng xem sao nhé.
 

File đính kèm

  • Loc DS theo dieu kien.xlsb
    16 KB · Đọc: 21
Tôi chỉ thích ai hỏi cái gì mà có tiêu đề đầy đủ, còn hỏi nữa chừng thì không chơi.
Lý do: Biết thằng ăn trộm nó nằm trong bồ lúa mà không chỉ.
 
Điều kiện Type bạn muốn lọc mấy mã thì nhập đầy đủ vào tư G2 sang phải.
Bạn chạy thử với dữ liệu 5000 dòng xem sao nhé.
Cảm ơn các Bác.
Trường hợp chỉ dùng 1 điều kiện ở G1 thì cần bỏ code nào, mình có thử nhưng nó không ra kết quả.
 
Lần chỉnh sửa cuối:
Có cách nào khắc phục các điều kiện dò tìm ở VBA là tiếng Việt có dấu không nhỉ?
 
Cảm ơn các Bác.
Trường hợp chỉ dùng 1 điều kiện ở G1 thì cần bỏ code nào, mình có thử nhưng nó không ra kết quả.
Từ đầu sao không nêu hết các trường hợp?
Bạn thay Sub GPE bằng cái này rồi gán lại nó cho nút bấm.
PHP:
Public Sub LuXuBu()
Dim sArr(), dArr(1 To 10000, 1 To 2), Cod As Variant, Typ As Range, Cll As Range
Dim I As Long, K As Long, R As Long
    Cod = Range("G1").Value
    Set Typ = Range("G2", Range("Z2").End(xlToLeft))
    sArr = Range("A5", Range("A5").End(xlDown)).Resize(, 3).Value
    R = UBound(sArr)
If Range("G2") = Empty Then 'Khong co dieu kien Type'
    For I = 1 To R
        If sArr(I, 1) = Cod Then
                K = K + 1
                dArr(K, 1) = sArr(I, 2)
                dArr(K, 2) = sArr(I, 3)
        End If
    Next I
Else                        'Co dieu kien Loc >= 1 Type'
    With CreateObject("Scripting.Dictionary")
        For Each Cll In Typ
            .Item(Cll.Value) = ""
        Next Cll
        For I = 1 To R
            If sArr(I, 1) = Cod Then
                If .Exists(sArr(I, 3)) Then
                    K = K + 1
                    dArr(K, 1) = sArr(I, 2)
                    dArr(K, 2) = sArr(I, 3)
                End If
            End If
        Next I
    End With
End If
Range("F5:G10000").ClearContents
If K Then Range("F5:G5").Resize(K) = dArr
Set Typ = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Từ đầu sao không nêu hết các trường hợp?
Bạn thay Sub GPE bằng cái này rồi gán lại nó cho nút bấm.
PHP:
Public Sub LuXuBu()
Dim sArr(), dArr(1 To 10000, 1 To 2), Cod As Variant, Typ As Range, Cll As Range
Dim I As Long, K As Long, R As Long
    Cod = Range("G1").Value
    Set Typ = Range("G2", Range("Z2").End(xlToLeft))
    sArr = Range("A5", Range("A5").End(xlDown)).Resize(, 3).Value
    R = UBound(sArr)
If Range("G2") = Empty Then 'Khong co dieu kien Type'
    For I = 1 To R
        If sArr(I, 1) = Cod Then
                K = K + 1
                dArr(K, 1) = sArr(I, 2)
                dArr(K, 2) = sArr(I, 3)
        End If
    Next I
Else                        'Co dieu kien Loc >= 1 Type'
    With CreateObject("Scripting.Dictionary")
        For Each Cll In Typ
            .Item(Cll.Value) = ""
        Next Cll
        For I = 1 To R
            If sArr(I, 1) = Cod Then
                If .Exists(sArr(I, 3)) Then
                    K = K + 1
                    dArr(K, 1) = sArr(I, 2)
                    dArr(K, 2) = sArr(I, 3)
                End If
            End If
        Next I
    End With
End If
Range("F5:G10000").ClearContents
If K Then Range("F5:G5").Resize(K) = dArr
Set Typ = Nothing
End Sub
Cảm ơn Bác. Mình vừa làm vừa học nên lúc học mới nghĩ ra thêm để nhờ mọi người giúp đỡ.
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom