Quang_Hải
Thành viên gạo cội




- Tham gia
- 21/2/09
- Bài viết
- 6,077
- Được thích
- 8,011
- Nghề nghiệp
- Làm đủ thứ
Công cụ sẵn có của Excel để sort thì không thể bàn cãi thêm.
Tuy nhiên có lẽ có lúc chúng ta cần thực hiện Sort trong mảng 2 chiều và cần ưu tiên chọn cột để đưa kết quả vào 1 ListBox. Qua những kiến thức đã học được từ diễn đàn GPE, mình đã cố gắng mày mò và cuối cùng cũng cho ra được 1 thủ tục Sort trong mảng 2 chiều. Hy vọng từ thủ tục này, các bạn sẽ bổ sung những điểm còn hạn chế để cho ra 1 thủ tục hoàn chỉnh hơn.
Các bạn có thể thêm bớt thay đổi ưu tiên số cột cần sort trong dòng code:
SortOrder = Array(1, 2, 3, 6)
Tuy nhiên có lẽ có lúc chúng ta cần thực hiện Sort trong mảng 2 chiều và cần ưu tiên chọn cột để đưa kết quả vào 1 ListBox. Qua những kiến thức đã học được từ diễn đàn GPE, mình đã cố gắng mày mò và cuối cùng cũng cho ra được 1 thủ tục Sort trong mảng 2 chiều. Hy vọng từ thủ tục này, các bạn sẽ bổ sung những điểm còn hạn chế để cho ra 1 thủ tục hoàn chỉnh hơn.
Các bạn có thể thêm bớt thay đổi ưu tiên số cột cần sort trong dòng code:
SortOrder = Array(1, 2, 3, 6)
PHP:
Sub ArraySort()
'Written by QuangHai
Dim Data(), Temp As String
Dim FirsrtRow As Long, FirstCol As String, SortOrder()
Dim TotalCols As Byte, Row As Long, J As Long
SortOrder = Array(1, 2, 3, 6)
With Sheets("Nguon")
Data = .Range("A3", .[M65536].End(3)).Value
End With
TotalCols = UBound(Data, 2)
ReDim Preserve Data(1 To UBound(Data), 1 To (TotalCols + 1))
For Row = 1 To UBound(Data, 1)
For J = 0 To UBound(SortOrder)
If IsDate(Data(Row, SortOrder(J))) Then
Temp = Temp & CLng(Data(Row, SortOrder(J)))
Else
Temp = Temp & Format(Data(Row, SortOrder(J)), String(15, "0"))
End If
Next
Data(Row, TotalCols + 1) = Temp
Temp = Empty
Next
QuickSort Data, LBound(Data), UBound(Data)
Sheets("Dich").[A3].Resize(UBound(Data), TotalCols) = Data
End Sub
PHP:
Sub QuickSort(Arr(), Min As Long, Max As Long)
Dim MidVal As Variant, TempVal As Variant
Dim TempMin&, TempMax&, LastCol&, TotalCol&
TempMin = Min
TempMax = Max
LastCol = UBound(Arr, 2)
MidVal = Arr((Min + Max) \ 2, LastCol)
Do While TempMin <= TempMax
Do While Arr(TempMin, LastCol) < MidVal And TempMin < Max
TempMin = TempMin + 1
Loop
Do While MidVal < Arr(TempMax, LastCol) And TempMax > Min
TempMax = TempMax - 1
Loop
If TempMin <= TempMax Then
For TotalCol = 1 To LastCol
TempVal = Arr(TempMin, TotalCol)
Arr(TempMin, TotalCol) = Arr(TempMax, TotalCol)
Arr(TempMax, TotalCol) = TempVal
Next
TempMin = TempMin + 1
TempMax = TempMax - 1
End If
Loop
If Min < TempMax Then QuickSort Arr, Min, TempMax
If TempMin < Max Then QuickSort Arr, TempMin, Max
End Sub
