Thắc mắc,góp ý hoàn thiện về hàm UDF Filter2DArray (2 người xem)

Liên hệ QC

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

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,720
Giới tính
Nam
PHP:
Function Filter2DArray(ByVal sArray, ByVal ColIndex As Long, ByVal FindStr As String, ByVal HasTitle As Boolean)
  Dim tmpArr, i As Long, j As Long, Arr, Dic, TmpStr, Tmp, Chk As Boolean, TmpVal As Double
  On Error Resume Next
  Set Dic = CreateObject("Scripting.Dictionary")
  tmpArr = sArray
  ColIndex = ColIndex + LBound(tmpArr, 2) - 1
  Chk = (InStr("><=", Left(FindStr, 1)) > 0)
  For i = LBound(tmpArr, 1) - HasTitle To UBound(tmpArr, 1)
    If Chk Then
      TmpVal = CDbl(tmpArr(i, ColIndex))
      If Evaluate(TmpVal & FindStr) Then Dic.Add i, ""
    Else
      If UCase(tmpArr(i, ColIndex)) Like UCase(FindStr) Then Dic.Add i, ""
    End If
  Next
  If Dic.Count > 0 Then
    Tmp = Dic.Keys
    ReDim Arr(LBound(tmpArr, 1) To UBound(Tmp) + LBound(tmpArr, 1) - HasTitle, LBound(tmpArr, 2) To UBound(tmpArr, 2))
    For i = LBound(tmpArr, 1) - HasTitle To UBound(Tmp) + LBound(tmpArr, 1) - HasTitle
      For j = LBound(tmpArr, 2) To UBound(tmpArr, 2)
        Arr(i, j) = tmpArr(Tmp(i - LBound(tmpArr, 1) + HasTitle), j)
      Next
    Next
    If HasTitle Then
      For j = LBound(tmpArr, 2) To UBound(tmpArr, 2)
        Arr(LBound(tmpArr, 1), j) = tmpArr(LBound(tmpArr, 1), j)
      Next
    End If
  End If
  Filter2DArray = Arr
End Function

Hàm Filter mãng 2 chiều này thật là hay, tôi đã ứng dụng rất nhiều bài tập, song hình như nó có vẽ như thiếu thứ gì đó, với trình độ của tôi thì đọc Hàm trên chỉ biết là vậy chứ thật sự không hiểu hết nổi thuật toán mà Thầy ndu96081631 đã thực hiện. Vì vậy tôi muốn hỏi là:

1) Làm thế nào để Lọc điều kiện là rỗng?

2) Giữ tất cả, Trừ điều kiện là rỗng?

Xin cảm ơn rất nhiều!
 

File đính kèm

Làm ơn cho em hỏi, làm thế nảo để lọc loại trừ một điều kiện? Ví dụ như trong điều kiện là loại trừ người có tên B trong cột Tên, thì lấy giá trị tất cả mà không có tên B.

Dựa theo toán tử LIKE, em đã làm như sau:

Arr1 = Filter2DArray(sArray1, 1, "[!B", False)

Thì tất cả các tên có chứa chữ B bị loại khỏi mảng

Nếu em muốn loại trừ số 1000 ra khỏi mảng em làm như sau:

Arr1 = Filter2DArray(sArray1, 2, "[!1000", False)

Kết quả lại cho tất cả các số nào có 1 đứng đầu sẽ bị loại.

Vậy muốn lọc đúng như ý muốn thì phải làm sao ạ?

Trả lời sơ bộ thế này:
Arr1 = Filter2DArray(sArray1, 2, "<>1000", False)
Nói thêm:
- Với dữ liệu dạng chuổi, ta so sánh theo toán tử LIKE
- Với dữ liệu dạng số, ta so sánh bằng các toán tử "=", ">", "<", "<>" ... vân vân
 
Upvote 0
Trả lời sơ bộ thế này:
Arr1 = Filter2DArray(sArray1, 2, "<>1000", False)
Nói thêm:
- Với dữ liệu dạng chuổi, ta so sánh theo toán tử LIKE
- Với dữ liệu dạng số, ta so sánh bằng các toán tử "=", ">", "<", "<>" ... vân vân

Với dữ liệu dạng chuỗi thì không thể so sánh được ạ! Vậy làm sao với dạng chuỗi?
 
Upvote 0
Nghĩa cho file lên đi... Tôi chưa hình dung được ý của bạn

Với File gửi lên, em làm thử 2 vấn đề:

Mã:
Sub Test()
    Dim MyArr
    Sheet1.[K:P].ClearContents
    MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 1, [COLOR=#ff0000][B]"<>Hà"[/B][/COLOR], True)
    If IsArray(MyArr) Then Sheet1.[K1].Resize(UBound(MyArr, 1), 6) = MyArr
End Sub
Với thủ tục này kết quả không lọc gì cả!

Mã:
Sub Test2()
    Dim MyArr
    Sheet1.[K:P].ClearContents
    MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 1, [B][COLOR=#ff0000]"[!Hà"[/COLOR][/B], True)
    If IsArray(MyArr) Then Sheet1.[K1].Resize(UBound(MyArr, 1), 6) = MyArr
End Sub
Với thủ tục này, những tên nào có vần H đầu tiên là bị loại trừ luôn!
 

File đính kèm

Upvote 0
Với File gửi lên, em làm thử 2 vấn đề:

Mã:
Sub Test()
    Dim MyArr
    Sheet1.[K:P].ClearContents
    MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 1, [COLOR=#ff0000][B]"<>Hà"[/B][/COLOR], True)
    If IsArray(MyArr) Then Sheet1.[K1].Resize(UBound(MyArr, 1), 6) = MyArr
End Sub
Với thủ tục này kết quả không lọc gì cả!

Mã:
Sub Test2()
    Dim MyArr
    Sheet1.[K:P].ClearContents
    MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 1, [B][COLOR=#ff0000]"[!Hà"[/COLOR][/B], True)
    If IsArray(MyArr) Then Sheet1.[K1].Resize(UBound(MyArr, 1), 6) = MyArr
End Sub
Với thủ tục này, những tên nào có vần H đầu tiên là bị loại trừ luôn!
Vầy thử xem:
MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 1, "?[!Hà", True)
 
Upvote 0
Vẫn chưa chắc ăn Thầy ơi, thử với chữ Hoàng thì thay vì loại có 2 chữ nó loại rất nhiều luôn!
Toán tử LIKE nó vậy nên khi dùng phải uyển chuyên
Thay vì viết "?[!Hoàng" thì nên viết là "?[!Ho"
Nói chung, với toán tử LIKE thì sẽ không có cách nào hoàn hảo để Filter theo kiểu <> "gì gì đó" đâu (trừ phi viết lại toàn bộ code theo 1 ý đồ riêng)
 
Upvote 0
Toán tử LIKE nó vậy nên khi dùng phải uyển chuyên
Thay vì viết "?[!Hoàng" thì nên viết là "?[!Ho"
Nói chung, với toán tử LIKE thì sẽ không có cách nào hoàn hảo để Filter theo kiểu <> "gì gì đó" đâu (trừ phi viết lại toàn bộ code theo 1 ý đồ riêng)
Vậy Thầy có thể viết hàm đó với ký hiệu la @ chẳng hạn làm hàm bổ trợ rồi ghép thêm điều kiện vào hàm này có được không ạ?
Cám ơn Thầy!
 
Upvote 0
Vậy Thầy có thể viết hàm đó với ký hiệu la @ chẳng hạn làm hàm bổ trợ rồi ghép thêm điều kiện vào hàm này có được không ạ?
Cám ơn Thầy!
Cái đó dễ mà
Chẳng hạn sửa chổ này:
PHP:
For i = LBound(tmpArr, 1) - HasTitle To UBound(tmpArr, 1)
  If Chk Then
    TmpVal = CDbl(tmpArr(i, ColIndex))
    If Evaluate(TmpVal & FindStr) Then Dic.Add i, ""
  Else
    If UCase(tmpArr(i, ColIndex)) Like UCase(FindStr) Then Dic.Add i, ""
  End If
Next
Thành:
PHP:
For i = LBound(tmpArr, 1) - HasTitle To UBound(tmpArr, 1)
  If Chk Then
    TmpVal = CDbl(tmpArr(i, ColIndex))
    If Evaluate(TmpVal & FindStr) Then Dic.Add i, ""
  Else
    If Left(FindStr, 1) = "!" Then
      If Not (UCase(tmpArr(i, ColIndex)) Like UCase(Mid(FindStr, 2, Len(FindStr)))) Then Dic.Add i, ""
    Else
      If UCase(tmpArr(i, ColIndex)) Like UCase(FindStr) Then Dic.Add i, ""
    End If
  End If
Next
Từ đây nếu bạn viết Filter2DArray(Sheet1.[A1:F29].Value, 1, "!Hà", True) có nghĩa là lọc "<>Hà"
 
Upvote 0
Cái đó dễ mà
Chẳng hạn sửa chổ này:
.................................................
Từ đây nếu bạn viết Filter2DArray(Sheet1.[A1:F29].Value, 1, "!Hà", True) có nghĩa là lọc "<>Hà"

Em đã kiểm tra rất kỹ! Rất chính xác! Cám ơn Thầy rất nhiều!

Một câu hỏi nữa để hiểu hết toàn bộ chức năng của hàm này là, nếu lọc dạng ngày tháng năm thì toán tử >, <, =, <> sẽ được áp dụng như thế nào?
 
Upvote 0
Em đã kiểm tra rất kỹ! Rất chính xác! Cám ơn Thầy rất nhiều!

Một câu hỏi nữa để hiểu hết toàn bộ chức năng của hàm này là, nếu lọc dạng ngày tháng năm thì toán tử >, <, =, <> sẽ được áp dụng như thế nào?
Thì gõ bình thường thôi, chẳng hạn Filter2DArray(sArray ,4, ">Date(2011,5,1)", FALSE)
 
Upvote 0
Hàm Filter2DArray, tác giả ndu96081631:

Em xin cập nhật, tổng hợp lại toàn bộ hàm Filter2DArray của Thầy và cách sử dụng:

PHP:
Function Filter2DArray(ByVal sArray, ByVal ColIndex As Long, ByVal FindStr As String, ByVal HasTitle As Boolean)
    Dim TmpArr, i As Long, j As Long, Arr, Dic, TmpStr, Tmp, Chk As Boolean, TmpVal As Double
    On Error Resume Next
    Set Dic = CreateObject("Scripting.Dictionary")
        TmpArr = sArray
        ColIndex = ColIndex + LBound(TmpArr, 2) - 1
        Chk = (InStr("><=", Left(FindStr, 1)) > 0)
    For i = LBound(TmpArr, 1) - HasTitle To UBound(TmpArr, 1)
        If Chk And FindStr <> "" Then
            TmpVal = CDbl(TmpArr(i, ColIndex))
            If Evaluate(TmpVal & FindStr) Then Dic.Add i, ""
        Else
            If Left(FindStr, 1) = "!" Then
                If Not (UCase(TmpArr(i, ColIndex)) Like UCase(Mid(FindStr, 2, Len(FindStr)))) Then Dic.Add i, ""
            Else
                If UCase(TmpArr(i, ColIndex)) Like UCase(FindStr) Then Dic.Add i, ""
            End If
        End If
    Next
    If Dic.Count > 0 Then
        Tmp = Dic.Keys
        ReDim Arr(LBound(TmpArr, 1) To UBound(Tmp) + LBound(TmpArr, 1) - HasTitle, LBound(TmpArr, 2) To UBound(TmpArr, 2))
            For i = LBound(TmpArr, 1) - HasTitle To UBound(Tmp) + LBound(TmpArr, 1) - HasTitle
                For j = LBound(TmpArr, 2) To UBound(TmpArr, 2)
                    Arr(i, j) = TmpArr(Tmp(i - LBound(TmpArr, 1) + HasTitle), j)
                Next
            Next
        If HasTitle Then
            For j = LBound(TmpArr, 2) To UBound(TmpArr, 2)
                Arr(LBound(TmpArr, 1), j) = TmpArr(LBound(TmpArr, 1), j)
            Next
        End If
    End If
    Filter2DArray = Arr
End Function

Cách sử dụng:

1) Lọc xử lý dạng chuỗi:
Mã:
Sub Loc_Xu_Ly_Chuoi()
    Dim MyArr
    Sheet1.[K:P].ClearContents
'    [COLOR=#006400]'Lọc loại trừ chuỗi là rỗng:[/COLOR]
'        MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 1, [COLOR=#0000cd][B]"["[/B][/COLOR], True)
'    [COLOR=#006400]'Lọc chỉ lấy chuỗi là rỗng:[/COLOR]
'        MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 1, [B][COLOR=#0000cd]""[/COLOR][/B], True)
'    [COLOR=#006400]'Lọc lấy chuỗi tuyệt đối:[/COLOR]
'        MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 1, [B][COLOR=#0000cd]"Sang"[/COLOR][/B], True)
'    [COLOR=#006400]'Lọc loại trừ chuỗi tuyệt đối:[/COLOR]
'        MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 1, [B][COLOR=#0000cd]"!Sang"[/COLOR][/B], True)
'    [COLOR=#006400]'Lọc loại trừ chuỗi tương đối, ngược lại, lấy chuỗi tương đối chỉ cần bỏ dấu chấm thang (!):[/COLOR]
'        MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 1, [COLOR=#0000cd][B]"!H*"[/B][/COLOR], True)
'        MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 1, [COLOR=#0000cd][B]"!*n*"[/B][/COLOR], True)
'        MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 1, [COLOR=#0000cd][B]"!H?"[/B][/COLOR], True)
        MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 1, [COLOR=#0000cd][B]"!H?a"[/B][/COLOR], True)
    If IsArray(MyArr) Then Sheet1.[K1].Resize(UBound(MyArr, 1), 6) = MyArr
End Sub

2) Lọc xử lý dạng số:
Mã:
Sub Loc_Xu_Ly_So()
    Dim MyArr
    Sheet1.[K:P].ClearContents
'    MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 2, [B][COLOR=#0000cd]">5"[/COLOR][/B], True)
'    MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 2, [COLOR=#0000cd][B]">=5"[/B][/COLOR], True)
'    MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 2, [COLOR=#0000cd][B]"<>5"[/B][/COLOR], True)
'    MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 2, [B][COLOR=#0000cd]"<5"[/COLOR][/B], True)
'    MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 2, [COLOR=#0000cd][B]"<=5"[/B][/COLOR], True)
    MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 2, [B][COLOR=#0000cd]"=5"[/COLOR][/B], True)
    If IsArray(MyArr) Then Sheet1.[K1].Resize(UBound(MyArr, 1), 6) = MyArr
End Sub

3) Lọc xử lý dạng ngày tháng:
Mã:
Sub Loc_Xu_Ly_Ngay_Thang()
    Dim MyArr
    Sheet1.[K:P].ClearContents
    [COLOR=#006400]'Bắt buộc ghi cấu trúc phải có dạng:[/COLOR] [COLOR=#ff0000][B]Date(y,m,d)[/B][/COLOR]
'    MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 3, [COLOR=#0000cd][B]">Date(2011,11,29)"[/B][/COLOR], True)
'    MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 3, [B][COLOR=#0000cd]">=Date(2011,11,29)"[/COLOR][/B], True)
'    MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 3, [B][COLOR=#0000cd]"<>Date(2011,11,29)"[/COLOR][/B], True)
'    MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 3, [B][COLOR=#0000cd]"<Date(2011,11,29)"[/COLOR][/B], True)
'    MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 3, [COLOR=#0000cd][B]"<=Date(2011,11,29)"[/B][/COLOR], True)
    MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 3, [B][COLOR=#0000cd]"=Date(2011,11,29)"[/COLOR][/B], True)
    If IsArray(MyArr) Then Sheet1.[K1].Resize(UBound(MyArr, 1), 6) = MyArr
End Sub

Cám ơn Thầy ndu96081631 rất nhiều!
 

File đính kèm

Upvote 0
Em xin cập nhật, tổng hợp lại toàn bộ hàm Filter2DArray của Thầy và cách sử dụng:
PHP:
'    'Lọc lấy chuỗi tuyệt đối:
'        MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 1, "Sang", True)
'    'Lọc loại trừ chuỗi tuyệt đối:
'        MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 1, "!Sang", True)
Trường hợp trên lọc lấy (loại trừ) chuỗi tuyệt đối 1 điều kiện. Vậy xin hỏi các anh chị trường hợp lọc lấy (loại trừ) chuỗi tuyệt đối với 2 điều kiện thì sao?
 
Lần chỉnh sửa cuối:
Upvote 0
Trường hợp trên lọc lấy (loại trừ) chuỗi tuyệt đối 1 điều kiện. Vậy xin hỏi các anh chị trường hợp lọc lấy (loại trừ) chuỗi tuyệt đối với 2 điều kiện thì sao?

Dĩ nhiên hàm này Thầy ndu96081631 viết không thể nào bằng AutoFilter của Excel mà có thể lọc một lúc nhiều điều kiện (chắc có lẽ sau này Thầy sẽ cải tiến thêm). Tuy nhiên, nếu linh hoạt trong trường hợp này thì không có gì là khó cả, chúng ta làm như sau:

Điều kiện loại trừ là SANG và HOÀNG thì ta lần lượt lọc từng cái trước:

Mã:
MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 1, [COLOR=#0000ff][B]"!Sang"[/B][/COLOR], True)


Sau đó, mình lại tiếp tục với thủ tục thứ hai, nhưng lần này lọc từ MyArr:

Mã:
MyArr = Filter2DArray([COLOR=#ff0000][B]MyArr [/B][/COLOR], 1, [B][COLOR=#0000ff]"!Hoàng"[/COLOR][/B], True)

Sau đó mình gán MyArr lên sheet hay source nào đó thôi.

Nói tóm lại, muốn lọc nhiều điều kiện ta cứ lần lượt lọc cái A rồi lấy giá trị đã lọc và lọc tiếp, cho dù nhiều điều kiện mình vẫn làm thế, với hàm này cũng không mất thời gian đâu.
 
Upvote 0
Dĩ nhiên hàm này Thầy ndu96081631 viết không thể nào bằng AutoFilter của Excel mà có thể lọc một lúc nhiều điều kiện (chắc có lẽ sau này Thầy sẽ cải tiến thêm). Tuy nhiên, nếu linh hoạt trong trường hợp này thì không có gì là khó cả, chúng ta làm như sau:

Điều kiện loại trừ là SANG và HOÀNG thì ta lần lượt lọc từng cái trước:

Mã:
MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 1, [COLOR=#0000ff][B]"!Sang"[/B][/COLOR], True)


Sau đó, mình lại tiếp tục với thủ tục thứ hai, nhưng lần này lọc từ MyArr:

Mã:
MyArr = Filter2DArray([COLOR=#ff0000][B]MyArr [/B][/COLOR], 1, [B][COLOR=#0000ff]"!Hoàng"[/COLOR][/B], True)

Sau đó mình gán MyArr lên sheet hay source nào đó thôi.

Nói tóm lại, muốn lọc nhiều điều kiện ta cứ lần lượt lọc cái A rồi lấy giá trị đã lọc và lọc tiếp, cho dù nhiều điều kiện mình vẫn làm thế, với hàm này cũng không mất thời gian đâu.
Cảm ơn anh rất nhiều, em thấy hàm này rất hay, tốc độ chạy nhanh so với AutoFilter nên em muốn tiến xa hơn, thậm chí em đang muốn lọc duy nhất nữa, nhưng tự làm mà khả năng hạn chế. Với giải pháp như anh nói tạm thời chấp nhận được (2 điều kiện thì lọc lại lần 2) em thấy tốc độ vẫn nhanh. Mong muốn các anh cải tiến thêm thì quá tốt. Cảm ơn hàm của Thầy ndu96081631 và cải tiến của anh minhthien321
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn anh rất nhiều, em thấy hàm này rất hay, tốc độ chạy nhanh so với AutoFilter nên em muốn tiến xa hơn, thậm chí em đang muốn lọc duy nhất nữa, nhưng tự làm mà khả năng hạn chế. Với giải pháp như anh nói tạm thời chấp nhận được (2 điều kiện thì lọc lại lần 2) em thấy tốc độ vẫn nhanh. Mong muốn các anh cải tiến thêm thì quá tốt. Cảm ơn hàm của Thầy ndu96081631 và cải tiến của anh minhthien321


Nếu bạn muốn lọc duy nhất, cũng là hàm được viết bởi Thầy ndu96081631, bạn xem tại đường dẫn dưới đây:

http://www.giaiphapexcel.com/forum/...mắc-về-hàm-UDF-UniqueList&p=338234#post338234
 
Upvote 0
Nếu bạn muốn lọc duy nhất, cũng là hàm được viết bởi Thầy ndu96081631, bạn xem tại đường dẫn dưới đây:

http://www.giaiphapexcel.com/forum/...mắc-về-hàm-UDF-UniqueList&p=338234#post338234

Tôi chỉ muốn lưu ý một điểm. Hàm của bạn ndu96081631 rất hay nhưng chưa lường được tình huống về chuỗi. Ta không thể mặc định là dữ liệu của người dùng sẽ như ta nghĩ. Vd. tôi có danh sách do đồng nghiệp đã thôi việc để lại và tôi bổ sung rất nhiều. Hoặc 1 đoạn tôi lấy từ nguồn ngoài. Người ta viết "Hà" bằng Unikey và chọn Unicode (dựng sẵn) trong khi tôi chưa bao giừ dùng Unikey (dùng chơi để biết thì có). Nếu tôi dùng bàn phím của Windows gõ vào bảng tính "Hà" thì với code:
MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 1, "Hà", True)
thì
UCase(TmpArr(i, ColIndex)) Like UCase(FindStr) trả về FALSE mặc dù ở bảng tính ở chỗ đó có "Hà"
Đơn giản là "người ta" gõ "Hà" dựng sẵn (4 bai) trong khi "Hà" tôi gõ là Unicode TỔ HỢP (6 bai). Lý do là Windows tuy hỗ trợ cả 2 loại Unicode nhưng bản thân Windows dùng Unicode tổ hợp.
Bạn thử mở notepad --> gõ "à" --> ghi lại ở dạng unicode --> mở tập tin vừa ghi trong Hex Editor bạn sẽ thấy "à" có 2 WORD - 4 bai $0300, $0061 ("à" là tổ hợp của 2 ký tự là "a" và ký tự dấu huyền - $0300) trong khi "à" dựng sẵn chỉ có 2 bai - 1 WORD là $00E0
Ngoài ra hàm của bạn ndu96081631 là đẹp rồi. Nhiều khi bạn dùng thấy không như ý là do bạn chưa rành về viết mask (FindStr) mà thôi. Nó có qui tắc rõ ràng, sử dụng một số ký tự (vd. *, ? ...) nhất định và những ký tự đó có nghĩa rõ ràng. Khi bạn thấy chưa như ý tức là bạn viết mask sai, tức mask không làm đúng cái mà bạn muốn.
 
Upvote 0
Dĩ nhiên hàm này Thầy ndu96081631 viết không thể nào bằng AutoFilter của Excel mà có thể lọc một lúc nhiều điều kiện (chắc có lẽ sau này Thầy sẽ cải tiến thêm). Tuy nhiên, nếu linh hoạt trong trường hợp này thì không có gì là khó cả, chúng ta làm như sau:

Bạn ndu96081631 tặng mọi người mã nguồn thì chắc cũng cho phép sửa để dùng theo yêu cầu. Nếu bạn biết chút về lập trình, đọc code hiểu thì có khó gì? Thêm một FindStr nữa vào. Rồi những chỗ như:
If UCase(TmpArr(i, ColIndex)) Like UCase(FindStr) Then Dic.Add i, ""
sửa thành
If UCase(TmpArr(i, ColIndex)) Like UCase(FindStr1) or _
UCase(TmpArr(i, ColIndex)) Like UCase(FindStr2) Then Dic.Add i, ""
Gọi:
MyArr = Filter2DArray(Sheet1.[A1:F29].Value, 1, "Sang", "Hoàng", True)
Hoặc bạn sửa thành: không phải 1 mask mà là một danh sách mask?
Đại loại là thế, tôi chỉ đọc lướt qua để hiểu thôi chứ không định chỉnh sửa gì.
 
Upvote 0
Một chủ đề rất hay, cảm ơn bác Trọng Nghĩa nhé, em cũng đang cần tìm cái này.
 
Upvote 0
Lọc với 2 điều kiện kiểu "A và B" - "A and B" thì dễ rồi vì chỉ cần gọi hàm 2 lần. Vậy xin hỏi các anh chị trường hợp lọc với điều kiện kiểu "A hoặc B" - "A or B" thì sao?
 
Upvote 0
Web KT

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

Back
Top Bottom