Hàm sắp xếp mảng ngang dọc với Thuật toán QuickSort (sắp xếp Tiếng Việt) cho Excel

Blue Softs Liên hệ QC

Hôm nay tôi lại chia sẻ cho các bạn các Hàm UDF được viết bằng VBA, nhằm mục đích để sắp xếp mảng một cách tối ưu nhất.


HÀM UDF SẮP XẾP PHÂN TẦNG (ĐA HÀNG ĐA CỘT)

  1. Hàm S_SortV - Hàm trả lại mảng Sắp xếp dọc, Hàm S_SortVW là hàm ghi ra mảng cho bảng tính Excel
  2. Hàm S_SortH - Hàm trả lại mảng Sắp xếp ngang, Hàm S_SortHW là hàm ghi ra mảng cho bảng tính Excel
Hàm S_SortVW và hàm S_SortHW là hai hàm tự động ghi ra mảng ra bảng tính hoàn toàn sau khi gõ hàm, giá trị vùng thay đổi thì hàm thực thi.


Mục tiêu đạt được:
  1. Sắp xếp cả mảng ngang và mảng dọc.
  2. Sắp xếp phân tầng (đa cột).
  3. Sắp xếp Tiếng Việt.
  4. Giao diện đẹp mắt.
Hướng dẫn sử dụng hàm:

Vị tríTham sốKiểuChức năng
1​
CellsVùng cần tổngNhận vùng cần sắp xếp
2​
Columns / RowsSố cột hoặc Mảng các cộtNếu nhập số âm thì sắp xếp giảm dần, bằng 0 sx tất cả, -99999 xs từ cột cuối
3​
MatchCaseCó/KhôngSắp xếp không phân biệt hoa thường
4​
HeaderCó/KhôngVùng có đầu đề
5​
colorSốMàu, Nếu đặt màu nhỏ hơn 0 thì không tô màu
6​
TargetVùng tô màuVùng trả kết quả
7​
NaturalStartingSốVị trí bắt đầu phân màu
8​
NaturalFactorSốTỉ lệ phân màu
9​
DefaultFontColorSốMàu phông chữ mặc định
10​
DefaultBackColorSốMàu nền mặc đinh


Ví dụ viết hàm vào bảng tính (sắp xếp dọc):
1. Sắp xếp mảng A2:Z10000 với các phân tầng là tất cả cột, lớn dần
=S_SortVW(A2:Z10000, 0, FALSE)
2. Sắp xếp mảng A2:Z10000 với cột thứ 3, lớn dần gõ 3, nhỏ dần gõ -3
=S_SortVW(A2:Z10000, 3, FALSE)
3. Sắp xếp mảng A2:Z10000 với các phân tầng là 1, 3, 5, 7 (thứ tự cột), lớn dần
=S_SortVW(A2:Z10000, {1, 3, 5, 7}, FALSE)
4. Sắp xếp mảng A2:Z10000 với các phân tầng là 8, 3, 5, 4 (thứ tự cột), lớn dần
=S_SortVW(A2:Z10000, {8, 3, 5, 4}, FALSE)
5. Sắp xếp mảng A2:Z10000 với các phân tầng là -8, -3, -5, -4 (thứ tự cột), giảm dần
=S_SortVW(A2:Z10000, {-8, -3, -5, -4}, FALSE)

Ví dụ sắp xếp ngang tương tự chỉ đổi Hàm

Ví dụ viết code VBA với S_SortV và S_SortH:
PHP:
Dim Arr
Arr =S_SortV([A2:Z10000], 0, FALSE)



QuickSort Highlight Color - Excel UDF


Các bạn có thể tham khảo thêm hàm sắp xếp mảng khác:

Các bạn muốn học VBA nhanh nhất có thể hãy tham khảo tool hỗ trợ lập trình VBA:
 

File đính kèm

  • S_QSort_Color.xlsm
    482.8 KB · Đọc: 36
Lần chỉnh sửa cuối:
Thôi được, hôm nay thứ 7 mà cũng ngại ra ngoài quá nên làm giải trí. Bạn tự kiểm tra.
Xin chào bạn, vẫn dữ liệu trong file bạn gửi kèm tôi thử như sau:
Mã:
Sub Button3_Click()
Dim Arr, test, i, j, k
    test = Sheet5.Range("A1:C10").Value
    ReDim Arr(1 To UBound(test, 1), 1 To UBound(test, 2))
    For i = 1 To UBound(test, 1)
        If test(i, 3) < 20 Then
            k = k + 1
            For j = 1 To UBound(test, 2)
                Arr(k, j) = test(i, j)
            Next j
        End If
    Next i
    Sheet5.Range("E1").Resize(UBound(Arr, 1), UBound(Arr, 2)).Value = Sort2DArray(Arr, 1, True, cc_uni, False, 2, True, cc_uni, False, 3, True, cc_nothing, False)
End Sub
Thì càng dòng không có dữ liệu sẽ sắp xếp lên trên, bạn có thể sửa giúp tôi nếu sắp xếp A đến Z điều kiện True trong với cột nào thì dữ liệu trống trong cột đó đưa xuống dưới được không?
 
Upvote 0
Xin chào bạn, vẫn dữ liệu trong file bạn gửi kèm tôi thử như sau:
...
Thì càng dòng không có dữ liệu sẽ sắp xếp lên trên, bạn có thể sửa giúp tôi nếu sắp xếp A đến Z điều kiện True trong với cột nào thì dữ liệu trống trong cột đó đưa xuống dưới được không?
Tôi viết đã 8-9 năm rồi. Bây giờ mà ngồi sửa thì tôi không có hứng, mà rất có thể sẽ phải sửa nhiều.

Nhưng nếu có những dòng hoàn toàn trống ở dưới cùng, tức các phần tử của mỗi dòng đó đều rỗng, thì có thể sửa code để không sắp xếp các dòng đó. Trong trường hợp này không cần sửa nhiều.

Bạn tự kiểm tra lại hàm Sort2DArray.
Mã:
Function Sort2DArray(ByVal Arr, ByVal fromRow As Long, ByVal toRow As Long, ParamArray Args())
'    Arr là mảng cần sắp xếp
'    chỉ các dòng từ fromRow đến toRow tham gia sắp xếp, các dòng còn lại ở nguyên vị trí.
'    Args: các tham số dùng để sắp xếp. Mỗi cột cần sắp xếp được mô tả bằng 4 tham số: <cột cần sắp xếp> (long), <sắp xếp từ A đến Z> (boolean), <mã hóa cột> (convert_col), <phân biệt chữ hoa chữ thường> (boolean)
'    vd. sắp xếp theo cột 4, 2 và 8. Cột 2 và 4 dùng cc_uni, sắp xếp tăng dần, cột 8 dùng cc_nothing và sắp xếp giảm ần. Cả 3 cột không phân biệt chữ hoa chữ thường thì tham số Args là:
'    Args = 4, True, cc_uni, False, 2, True, cc_uni, False, 8, False, cc_nothing, False
'    Mảng trả về bởi Sort2DArray đã được sắp xếp
'   Ta mã hóa các cột có các ký tự tiếng Việt. Nếu cột sắp xếp có ký tự unicode (dựng sẵn hoặc tổ hợp), VNI hay TCVN3 thí ta truyền tham số convert là
'    cc_uni, cc_vni hoặc cc_vn3. Nếu cột sắp xếp không có chứa các ký tự Việt thì truyền cc_nothing.
'    Nếu không phân biệt chữ hoa thường trong khi sắp xếp thì truyền FALSE, nếu phân biệt thì truyền TRUE
Dim first As Long, last As Long, i As Long, j As Long, c As Long, index As Long, UBoundtmpArr1 As Long
Dim tmpArr, arr_index() As Long, SortCols() As Long, SortRanges
    tmpArr = Arr
    If UBound(Args) - LBound(Args) + 1 = 0 Then GoTo end_
   
    On Error GoTo error_
   
    ReDim SortCols(1 To (UBound(Args) - LBound(Args) + 1) \ 4)
    For i = 1 To UBound(SortCols)
        SortCols(i) = Args((i - 1) * 4)
    Next i
    UBoundtmpArr1 = UBound(tmpArr, 1)
    ReDim arr_index(LBound(tmpArr) To UBoundtmpArr1)
    For index = LBound(tmpArr) To UBoundtmpArr1
        arr_index(index) = index
    Next index
    If Args(2) > cc_nothing Then
        For index = LBound(tmpArr) To UBoundtmpArr1
            tmpArr(index, Args(0)) = ma_hoa_chuoi(tmpArr(index, Args(0)), Args(2), Args(3))
        Next index
    End If
    first = fromRow     '   LBound(tmpArr)
    last = toRow        'UBoundtmpArr1
    QuickSort tmpArr, arr_index, first, last, SortCols, 1, Args(1)
   
    ReDim SortRanges(1 To 2, 1 To 1)
    SortRanges(1, 1) = fromRow      '   LBound(tmpArr, 1)
    SortRanges(2, 1) = toRow        '   UBoundtmpArr1
    SortRanges = CreateSortRanges(tmpArr, SortRanges, SortCols(1))
    If Not IsEmpty(SortRanges) Then
        For i = 2 To UBound(SortCols)
            For c = 1 To UBound(SortRanges, 2)
                If Args((i - 1) * 4 + 2) > cc_nothing Then
                    For index = LBound(tmpArr) To UBoundtmpArr1
                        tmpArr(index, Args((i - 1) * 4)) = ma_hoa_chuoi(tmpArr(index, Args((i - 1) * 4)), Args((i - 1) * 4 + 2), Args((i - 1) * 4 + 3))
                    Next index
                End If
                first = SortRanges(1, c)
                last = SortRanges(2, c)
                QuickSort tmpArr, arr_index, first, last, SortCols, i, Args((i - 1) * 4 + 1)
            Next c
            If i < UBound(SortCols) Then
                SortRanges = CreateSortRanges(tmpArr, SortRanges, SortCols(i))
                If IsEmpty(SortRanges) Then Exit For
            End If
        Next i
    End If
   
    For i = LBound(tmpArr) To UBoundtmpArr1
        For j = LBound(tmpArr, 2) To UBound(tmpArr, 2)
            tmpArr(i, j) = Arr(arr_index(i), j)
        Next j
    Next i
end_:
    Sort2DArray = tmpArr
    Exit Function
error_:
End Function

Các thay đổi so với phiên bản cũ:.
1. Thêm 2 tham số fromRow và toRow.
Nếu mảng có chứa tiêu đề thì để dòng tiêu đề không tham gia sắp xếp cần truyền fromRow = 2, toRow = UBound(Arr, 1).
2. Sửa 2 dòng nằm trước dòng QuickSort tmpArr, arr_index, first, last, SortCols, 1, Args(1)
3. Sửa 2 dòng nằm trước dòng SortRanges = CreateSortRanges(tmpArr, SortRanges, SortCols(1))
----------
Mã:
Sub Button3_Click()
Dim Arr, test, i, j, k
    test = Sheet5.Range("A1:C10").Value
    ReDim Arr(1 To UBound(test, 1), 1 To UBound(test, 2))
    For i = 1 To UBound(test, 1)
        If test(i, 3) < 20 Then
            k = k + 1
            For j = 1 To UBound(test, 2)
                Arr(k, j) = test(i, j)
            Next j
        End If
    Next i
    Sheet5.Range("E1").Resize(k, UBound(Arr, 2)).Value = Sort2DArray(Arr, 1, k, 1, True, cc_uni, False, 2, True, cc_uni, False, 3, True, cc_nothing, False)
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi viết đã 8-9 năm rồi. Bây giờ mà ngồi sửa thì tôi không có hứng, mà rất có thể sẽ phải sửa nhiều.

Nhưng nếu có những dòng hoàn toàn trống ở dưới cùng, tức các phần tử của mỗi dòng đó đều rỗng, thì có thể sửa code để không sắp xếp các dòng đó. Trong trường hợp này không cần sửa nhiều.

Bạn tự kiểm tra lại hàm Sort2DArray.
Mã:
Function Sort2DArray(ByVal Arr, ByVal fromRow As Long, ByVal toRow As Long, ParamArray Args())
'    Arr là mảng cần sắp xếp
'    chỉ các dòng từ fromRow đến toRow tham gia sắp xếp, các dòng còn lại ở nguyên vị trí.
'    Args: các tham số dùng để sắp xếp. Mỗi cột cần sắp xếp được mô tả bằng 4 tham số: <cột cần sắp xếp> (long), <sắp xếp từ A đến Z> (boolean), <mã hóa cột> (convert_col), <phân biệt chữ hoa chữ thường> (boolean)
'    vd. sắp xếp theo cột 4, 2 và 8. Cột 2 và 4 dùng cc_uni, sắp xếp tăng dần, cột 8 dùng cc_nothing và sắp xếp giảm ần. Cả 3 cột không phân biệt chữ hoa chữ thường thì tham số Args là:
'    Args = 4, True, cc_uni, False, 2, True, cc_uni, False, 8, False, cc_nothing, False
'    Mảng trả về bởi Sort2DArray đã được sắp xếp
'   Ta mã hóa các cột có các ký tự tiếng Việt. Nếu cột sắp xếp có ký tự unicode (dựng sẵn hoặc tổ hợp), VNI hay TCVN3 thí ta truyền tham số convert là
'    cc_uni, cc_vni hoặc cc_vn3. Nếu cột sắp xếp không có chứa các ký tự Việt thì truyền cc_nothing.
'    Nếu không phân biệt chữ hoa thường trong khi sắp xếp thì truyền FALSE, nếu phân biệt thì truyền TRUE
Dim first As Long, last As Long, i As Long, j As Long, c As Long, index As Long, UBoundtmpArr1 As Long
Dim tmpArr, arr_index() As Long, SortCols() As Long, SortRanges
    tmpArr = Arr
    If UBound(Args) - LBound(Args) + 1 = 0 Then GoTo end_
  
    On Error GoTo error_
  
    ReDim SortCols(1 To (UBound(Args) - LBound(Args) + 1) \ 4)
    For i = 1 To UBound(SortCols)
        SortCols(i) = Args((i - 1) * 4)
    Next i
    UBoundtmpArr1 = UBound(tmpArr, 1)
    ReDim arr_index(LBound(tmpArr) To UBoundtmpArr1)
    For index = LBound(tmpArr) To UBoundtmpArr1
        arr_index(index) = index
    Next index
    If Args(2) > cc_nothing Then
        For index = LBound(tmpArr) To UBoundtmpArr1
            tmpArr(index, Args(0)) = ma_hoa_chuoi(tmpArr(index, Args(0)), Args(2), Args(3))
        Next index
    End If
    first = fromRow     '   LBound(tmpArr)
    last = toRow        'UBoundtmpArr1
    QuickSort tmpArr, arr_index, first, last, SortCols, 1, Args(1)
  
    ReDim SortRanges(1 To 2, 1 To 1)
    SortRanges(1, 1) = fromRow      '   LBound(tmpArr, 1)
    SortRanges(2, 1) = toRow        '   UBoundtmpArr1
    SortRanges = CreateSortRanges(tmpArr, SortRanges, SortCols(1))
    If Not IsEmpty(SortRanges) Then
        For i = 2 To UBound(SortCols)
            For c = 1 To UBound(SortRanges, 2)
                If Args((i - 1) * 4 + 2) > cc_nothing Then
                    For index = LBound(tmpArr) To UBoundtmpArr1
                        tmpArr(index, Args((i - 1) * 4)) = ma_hoa_chuoi(tmpArr(index, Args((i - 1) * 4)), Args((i - 1) * 4 + 2), Args((i - 1) * 4 + 3))
                    Next index
                End If
                first = SortRanges(1, c)
                last = SortRanges(2, c)
                QuickSort tmpArr, arr_index, first, last, SortCols, i, Args((i - 1) * 4 + 1)
            Next c
            If i < UBound(SortCols) Then
                SortRanges = CreateSortRanges(tmpArr, SortRanges, SortCols(i))
                If IsEmpty(SortRanges) Then Exit For
            End If
        Next i
    End If
  
    For i = LBound(tmpArr) To UBoundtmpArr1
        For j = LBound(tmpArr, 2) To UBound(tmpArr, 2)
            tmpArr(i, j) = Arr(arr_index(i), j)
        Next j
    Next i
end_:
    Sort2DArray = tmpArr
    Exit Function
error_:
End Function

Các thay đổi so với phiên bản cũ:.
1. Thêm 2 tham số fromRow và toRow.
Nếu mảng có chứa tiêu đề thì để dòng tiêu đề không tham gia sắp xếp cần truyền fromRow = 2, toRow = UBound(Arr, 1).
2. Sửa 2 dòng nằm trước dòng QuickSort tmpArr, arr_index, first, last, SortCols, 1, Args(1)
3. Sửa 2 dòng nằm trước dòng SortRanges = CreateSortRanges(tmpArr, SortRanges, SortCols(1))
----------
Mã:
Sub Button3_Click()
Dim Arr, test, i, j, k
    test = Sheet5.Range("A1:C10").Value
    ReDim Arr(1 To UBound(test, 1), 1 To UBound(test, 2))
    For i = 1 To UBound(test, 1)
        If test(i, 3) < 20 Then
            k = k + 1
            For j = 1 To UBound(test, 2)
                Arr(k, j) = test(i, j)
            Next j
        End If
    Next i
    Sheet5.Range("E1").Resize(k, UBound(Arr, 2)).Value = Sort2DArray(Arr, 1, k, 1, True, cc_uni, False, 2, True, cc_uni, False, 3, True, cc_nothing, False)
End Sub
Cảm ơn bạn rất nhiều.
 
Upvote 0
Tôi viết đã 8-9 năm rồi. Bây giờ mà ngồi sửa thì tôi không có hứng, mà rất có thể sẽ phải sửa nhiều.

Nhưng nếu có những dòng hoàn toàn trống ở dưới cùng, tức các phần tử của mỗi dòng đó đều rỗng, thì có thể sửa code để không sắp xếp các dòng đó. Trong trường hợp này không cần sửa nhiều.

Bạn tự kiểm tra lại hàm Sort2DArray.
Mã:
Function Sort2DArray(ByVal Arr, ByVal fromRow As Long, ByVal toRow As Long, ParamArray Args())
'    Arr là mảng cần sắp xếp
'    chỉ các dòng từ fromRow đến toRow tham gia sắp xếp, các dòng còn lại ở nguyên vị trí.
'    Args: các tham số dùng để sắp xếp. Mỗi cột cần sắp xếp được mô tả bằng 4 tham số: <cột cần sắp xếp> (long), <sắp xếp từ A đến Z> (boolean), <mã hóa cột> (convert_col), <phân biệt chữ hoa chữ thường> (boolean)
'    vd. sắp xếp theo cột 4, 2 và 8. Cột 2 và 4 dùng cc_uni, sắp xếp tăng dần, cột 8 dùng cc_nothing và sắp xếp giảm ần. Cả 3 cột không phân biệt chữ hoa chữ thường thì tham số Args là:
'    Args = 4, True, cc_uni, False, 2, True, cc_uni, False, 8, False, cc_nothing, False
'    Mảng trả về bởi Sort2DArray đã được sắp xếp
'   Ta mã hóa các cột có các ký tự tiếng Việt. Nếu cột sắp xếp có ký tự unicode (dựng sẵn hoặc tổ hợp), VNI hay TCVN3 thí ta truyền tham số convert là
'    cc_uni, cc_vni hoặc cc_vn3. Nếu cột sắp xếp không có chứa các ký tự Việt thì truyền cc_nothing.
'    Nếu không phân biệt chữ hoa thường trong khi sắp xếp thì truyền FALSE, nếu phân biệt thì truyền TRUE
Dim first As Long, last As Long, i As Long, j As Long, c As Long, index As Long, UBoundtmpArr1 As Long
Dim tmpArr, arr_index() As Long, SortCols() As Long, SortRanges
    tmpArr = Arr
    If UBound(Args) - LBound(Args) + 1 = 0 Then GoTo end_
  
    On Error GoTo error_
  
    ReDim SortCols(1 To (UBound(Args) - LBound(Args) + 1) \ 4)
    For i = 1 To UBound(SortCols)
        SortCols(i) = Args((i - 1) * 4)
    Next i
    UBoundtmpArr1 = UBound(tmpArr, 1)
    ReDim arr_index(LBound(tmpArr) To UBoundtmpArr1)
    For index = LBound(tmpArr) To UBoundtmpArr1
        arr_index(index) = index
    Next index
    If Args(2) > cc_nothing Then
        For index = LBound(tmpArr) To UBoundtmpArr1
            tmpArr(index, Args(0)) = ma_hoa_chuoi(tmpArr(index, Args(0)), Args(2), Args(3))
        Next index
    End If
    first = fromRow     '   LBound(tmpArr)
    last = toRow        'UBoundtmpArr1
    QuickSort tmpArr, arr_index, first, last, SortCols, 1, Args(1)
  
    ReDim SortRanges(1 To 2, 1 To 1)
    SortRanges(1, 1) = fromRow      '   LBound(tmpArr, 1)
    SortRanges(2, 1) = toRow        '   UBoundtmpArr1
    SortRanges = CreateSortRanges(tmpArr, SortRanges, SortCols(1))
    If Not IsEmpty(SortRanges) Then
        For i = 2 To UBound(SortCols)
            For c = 1 To UBound(SortRanges, 2)
                If Args((i - 1) * 4 + 2) > cc_nothing Then
                    For index = LBound(tmpArr) To UBoundtmpArr1
                        tmpArr(index, Args((i - 1) * 4)) = ma_hoa_chuoi(tmpArr(index, Args((i - 1) * 4)), Args((i - 1) * 4 + 2), Args((i - 1) * 4 + 3))
                    Next index
                End If
                first = SortRanges(1, c)
                last = SortRanges(2, c)
                QuickSort tmpArr, arr_index, first, last, SortCols, i, Args((i - 1) * 4 + 1)
            Next c
            If i < UBound(SortCols) Then
                SortRanges = CreateSortRanges(tmpArr, SortRanges, SortCols(i))
                If IsEmpty(SortRanges) Then Exit For
            End If
        Next i
    End If
  
    For i = LBound(tmpArr) To UBoundtmpArr1
        For j = LBound(tmpArr, 2) To UBound(tmpArr, 2)
            tmpArr(i, j) = Arr(arr_index(i), j)
        Next j
    Next i
end_:
    Sort2DArray = tmpArr
    Exit Function
error_:
End Function

Các thay đổi so với phiên bản cũ:.
1. Thêm 2 tham số fromRow và toRow.
Nếu mảng có chứa tiêu đề thì để dòng tiêu đề không tham gia sắp xếp cần truyền fromRow = 2, toRow = UBound(Arr, 1).
2. Sửa 2 dòng nằm trước dòng QuickSort tmpArr, arr_index, first, last, SortCols, 1, Args(1)
3. Sửa 2 dòng nằm trước dòng SortRanges = CreateSortRanges(tmpArr, SortRanges, SortCols(1))
----------
Mã:
Sub Button3_Click()
Dim Arr, test, i, j, k
    test = Sheet5.Range("A1:C10").Value
    ReDim Arr(1 To UBound(test, 1), 1 To UBound(test, 2))
    For i = 1 To UBound(test, 1)
        If test(i, 3) < 20 Then
            k = k + 1
            For j = 1 To UBound(test, 2)
                Arr(k, j) = test(i, j)
            Next j
        End If
    Next i
    Sheet5.Range("E1").Resize(k, UBound(Arr, 2)).Value = Sort2DArray(Arr, 1, k, 1, True, cc_uni, False, 2, True, cc_uni, False, 3, True, cc_nothing, False)
End Sub
Chào bạn,
Bạn có thể xử lý thêm giúp tôi truyền thêm 2 dữ liệu fromCol, toCol được không?
Ví dụ mảng truyền vào có tất 10 cột nhưng chỉ sắp xếp cột từ cột 1 đến cột 8 thôi , còn lại cột 9 và cột 10 bỏ. giống như fromRow và toRow vậy.
Cảm ơn bạn nhiều.
 
Upvote 0
Chào bạn,
Bạn có thể xử lý thêm giúp tôi truyền thêm 2 dữ liệu fromCol, toCol được không?
Ví dụ mảng truyền vào có tất 10 cột nhưng chỉ sắp xếp cột từ cột 1 đến cột 8 thôi , còn lại cột 9 và cột 10 bỏ. giống như fromRow và toRow vậy.
Cảm ơn bạn nhiều.
Tôi không làm nữa đâu. Tôi đã nói ngay từ đầu là tôi không muốn sửa hay tối ưu gì. Mà tôi đã làm thêm khoản sắp xếp với số cột tùy ý và fromRow, toRow.

Nếu bạn có thời gian và muốn thử sức thì tôi cho vài gợi ý. Có thể tôi chưa suy nghĩ thấu đáo nhưng bạn tự thử nghiệm.

1. Thêm fromCol và toCol.

2. Tự bạn phải phục vụ trường hợp người dùng truyền tham số Args không chuẩn. Tức Args chứa các cột cần sắp xếp mà một hoặc tất cả các cột đó lại trùng với các cột cần bỏ (từ đầu tới fromCol-1, và từ toCol+1 tới cuối).Bạn có thể nhớ nhưng người dùng code của bạn có thể không biết hoặc sơ ý. Phải phục vụ tình huống lỗi. Tức các cột từ Args phải >= fromCol và đồng thời <= toCol.

3. Thử thay ở gần cuối sub Sort2DArray
Mã:
For i = LBound(tmpArr) To UBoundtmpArr1
    For j = LBound(tmpArr, 2) To UBound(tmpArr, 2)
        tmpArr(i, j) = Arr(arr_index(i), j)
    Next j
Next i
bằng
Mã:
For i = LBound(tmpArr) To UBoundtmpArr1
    For j = fromCol To toCol
        tmpArr(i, j) = Arr(arr_index(i), j)
    Next j
Next i
Tôi sẽ không làm hộ bạn đâu.
 
Upvote 0
Tôi không làm nữa đâu. Tôi đã nói ngay từ đầu là tôi không muốn sửa hay tối ưu gì. Mà tôi đã làm thêm khoản sắp xếp với số cột tùy ý và fromRow, toRow.

Nếu bạn có thời gian và muốn thử sức thì tôi cho vài gợi ý. Có thể tôi chưa suy nghĩ thấu đáo nhưng bạn tự thử nghiệm.

1. Thêm fromCol và toCol.

2. Tự bạn phải phục vụ trường hợp người dùng truyền tham số Args không chuẩn. Tức Args chứa các cột cần sắp xếp mà một hoặc tất cả các cột đó lại trùng với các cột cần bỏ (từ đầu tới fromCol-1, và từ toCol+1 tới cuối).Bạn có thể nhớ nhưng người dùng code của bạn có thể không biết hoặc sơ ý. Phải phục vụ tình huống lỗi. Tức các cột từ Args phải >= fromCol và đồng thời <= toCol.

3. Thử thay ở gần cuối sub Sort2DArray
Mã:
For i = LBound(tmpArr) To UBoundtmpArr1
    For j = LBound(tmpArr, 2) To UBound(tmpArr, 2)
        tmpArr(i, j) = Arr(arr_index(i), j)
    Next j
Next i
bằng
Mã:
For i = LBound(tmpArr) To UBoundtmpArr1
    For j = fromCol To toCol
        tmpArr(i, j) = Arr(arr_index(i), j)
    Next j
Next i
Tôi sẽ không làm hộ bạn đâu.
Cảm ơn bạn nhiều.
 
Upvote 0
Top Bottom