Chia sẻ code hàm FilterMCLArray dùng lọc mảng 2 chiều (1 người xem)

Liên hệ QC

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

Tôi tuân thủ nội quy khi đăng bài

Minh Tam 2024

Thành viên mới
Tham gia
17/3/25
Bài viết
10
Được thích
5

Nguồn ( trên mạng không nhớ tên )​

Hàm FilterMCLArray được dùng để lọc dữ liệu từ một mảng 2 chiều dựa trên một điều kiện cụ thể (FindStr). Nó có thể tìm kiếm giá trị chuỗi hoặc so sánh số.
  • sArray: Mảng dữ liệu nguồn (có thể là mảng lấy từ một vùng trên Excel).
  • TotalCol: Tổng số cột cần tìm kiếm.
  • FindStr: Chuỗi hoặc điều kiện lọc (ví dụ: ">=100", "ABC").
  • HasTitle: Xác định có dòng tiêu đề hay không (True/False).

Ví dụ minh họa

Dữ liệu mẫu trong Excel

Giả sử bạn có dữ liệu sau trong vùng A1:C6:
A (Mã)B (Tên)C (Doanh thu)
101Nam120
102Linh90
103An150
104Bình80
105Hải200

Bạn muốn lọc ra các dòng có doanh thu ≥ 100.

Mã:
Sub TestFilter()
    Dim DataArr, ResultArr
    Dim LastRow As Long
    
    ' Xác định số dòng cuối cùng
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    
    ' Đọc dữ liệu từ vùng A1:C6 vào mảng
    DataArr = Range("A1:C" & LastRow).Value
    
    ' Gọi hàm để lọc doanh thu >= 100
    ResultArr = FilterMCLArray(DataArr, 3, ">=100", True)
    
    ' Xuất kết quả ra vùng E1:G1 (hoặc vị trí tùy chọn)
    If Not IsEmpty(ResultArr) Then
        Range("E1").Resize(UBound(ResultArr, 1), UBound(ResultArr, 2)).Value = ResultArr
    Else
        MsgBox "Không có dữ liệu phù hợp!", vbInformation
    End If
End Sub

Mã:
Function FilterMCLArray(ByVal sArray, ByVal TotalCol As Long, ByVal FindStr As String, ByVal HasTitle As Boolean)
        
        Dim tmpArr, i As Long, j As Long, ColIndex As Long, k 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)
            
            For k = 1 To TotalCol
                
                ColIndex = k
                
                If Chk Then
                    
                    TmpVal = CDbl(tmpArr(i, ColIndex))
                    
                    If Evaluate(TmpVal & FindStr) Then Dic.Add i, ""
                    
                Else
                    
                    If InStr(UCase(tmpArr(i, ColIndex)), UCase(FindStr)) Then Dic.Add i, ""
                    
                End If
                
            Next
            
        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
        
        FilterMCLArray = Arr
        
    End Function
 
Bạn này nên mở trang web riêng rồi đi nhặt nhạnh các thứ như thế này đưa lên thì tiện hơn là đưa vào diễn đàn này.
 
Upvote 0
Bạn này nên mở trang web riêng rồi đi nhặt nhạnh các thứ như thế này đưa lên thì tiện hơn là đưa vào diễn đàn này.
1. Code bảo là "quên mất nguồn". Rồi lúc sử dụng bản quyên thuộc về ai đây?

2. Code nào có câu "On Error Resume Next" mà không có phần xét error là cứ coi như code rác rưởi.
Lùa vịt về chuồng mà con nào cứng đầu chạy tản đàn thì bỏ nó luôn?
 
Upvote 0

Nguồn ( trên mạng không nhớ tên )​

Hàm FilterMCLArray được dùng để lọc dữ liệu từ một mảng 2 chiều dựa trên một điều kiện cụ thể (FindStr). Nó có thể tìm kiếm giá trị chuỗi hoặc so sánh số.
  • sArray: Mảng dữ liệu nguồn (có thể là mảng lấy từ một vùng trên Excel).
  • TotalCol: Tổng số cột cần tìm kiếm.
  • FindStr: Chuỗi hoặc điều kiện lọc (ví dụ: "&gt;=100", "ABC").
  • HasTitle: Xác định có dòng tiêu đề hay không (True/False).

Ví dụ minh họa

Dữ liệu mẫu trong Excel

Giả sử bạn có dữ liệu sau trong vùng A1:C6:
A (Mã)B (Tên)C (Doanh thu)
101Nam120
102Linh90
103An150
104Bình80
105Hải200

Bạn muốn lọc ra các dòng có doanh thu ≥ 100.

Mã:
Sub TestFilter()
    Dim DataArr, ResultArr
    Dim LastRow As Long
  
    ' Xác định số dòng cuối cùng
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
  
    ' Đọc dữ liệu từ vùng A1:C6 vào mảng
    DataArr = Range("A1:C" & LastRow).Value
  
    ' Gọi hàm để lọc doanh thu >= 100
    ResultArr = FilterMCLArray(DataArr, 3, ">=100", True)
  
    ' Xuất kết quả ra vùng E1:G1 (hoặc vị trí tùy chọn)
    If Not IsEmpty(ResultArr) Then
        Range("E1").Resize(UBound(ResultArr, 1), UBound(ResultArr, 2)).Value = ResultArr
    Else
        MsgBox "Không có dữ liệu phù hợp!", vbInformation
    End If
End Sub

Mã:
Function FilterMCLArray(ByVal sArray, ByVal TotalCol As Long, ByVal FindStr As String, ByVal HasTitle As Boolean)
      
        Dim tmpArr, i As Long, j As Long, ColIndex As Long, k 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)
          
            For k = 1 To TotalCol
              
                ColIndex = k
              
                If Chk Then
                  
                    TmpVal = CDbl(tmpArr(i, ColIndex))
                  
                    If Evaluate(TmpVal & FindStr) Then Dic.Add i, ""
                  
                Else
                  
                    If InStr(UCase(tmpArr(i, ColIndex)), UCase(FindStr)) Then Dic.Add i, ""
                  
                End If
              
            Next
          
        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
      
        FilterMCLArray = Arr
      
    End Function
Phải công nhận đoạn code này cao siêu và phức tạp thiệt. Riêng tôi thì chỉ cần 1 dòng code của AdvancedFilter thì đã lọc được các cái.
Dù sao cũng cảm ơn bạn đã viết bài, vì dạo này ít bài quá cũng hơi lạnh nguội, mất cơ hội cho tui thể hiện này nọ
 
Upvote 0
Web KT

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

Back
Top Bottom