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

stao

Thành viên hoạt động
Tham gia ngày
29 Tháng bảy 2008
Bài viết
104
Được thích
26
Điểm
670
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

ngoctinh87

Thành viên thường trực
Tham gia ngày
17 Tháng mười 2011
Bài viết
271
Được thích
328
Điểm
410
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)))
 

excel_lv1.5

Thành viên tiêu biểu
Tham gia ngày
20 Tháng mười 2017
Bài viết
559
Được thích
919
Điểm
360
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)))
 

stao

Thành viên hoạt động
Tham gia ngày
29 Tháng bảy 2008
Bài viết
104
Được thích
26
Điểm
670
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.
 

excel_lv1.5

Thành viên tiêu biểu
Tham gia ngày
20 Tháng mười 2017
Bài viết
559
Được thích
919
Điểm
360
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!!!
 

Mộng Thường 2001

Thành viên tiêu biểu
Tham gia ngày
28 Tháng mười một 2017
Bài viết
616
Được thích
1,626
Điểm
360
Tuổi
18
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

Ba Tê

Cạo Rồi Khỏi Gội
Tham gia ngày
5 Tháng năm 2009
Bài viết
11,355
Được thích
16,180
Điểm
1,860
Tuổi
61
Nơi ở
An Giang
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
 

stao

Thành viên hoạt động
Tham gia ngày
29 Tháng bảy 2008
Bài viết
104
Được thích
26
Điểm
670
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.
 

excel_lv1.5

Thành viên tiêu biểu
Tham gia ngày
20 Tháng mười 2017
Bài viết
559
Được thích
919
Điểm
360
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
 

Ba Tê

Cạo Rồi Khỏi Gội
Tham gia ngày
5 Tháng năm 2009
Bài viết
11,355
Được thích
16,180
Điểm
1,860
Tuổi
61
Nơi ở
An Giang
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

be09

TNMT_Đồng Nai
Tham gia ngày
9 Tháng tư 2011
Bài viết
8,907
Được thích
8,584
Điểm
560
Tuổi
62
Nơi ở
Biên Hòa, Đồng Nai
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ỉ.
 

stao

Thành viên hoạt động
Tham gia ngày
29 Tháng bảy 2008
Bài viết
104
Được thích
26
Điểm
670
Đ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:

stao

Thành viên hoạt động
Tham gia ngày
29 Tháng bảy 2008
Bài viết
104
Được thích
26
Điểm
670
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ỉ?
 

Ba Tê

Cạo Rồi Khỏi Gội
Tham gia ngày
5 Tháng năm 2009
Bài viết
11,355
Được thích
16,180
Điểm
1,860
Tuổi
61
Nơi ở
An Giang
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:

stao

Thành viên hoạt động
Tham gia ngày
29 Tháng bảy 2008
Bài viết
104
Được thích
26
Điểm
670
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:
Top Bottom