anhtuan1066
Thành viên gạo cội
- Tham gia
- 10/3/07
- Bài viết
- 5,802
- Được thích
- 6,911
Đầu tiên xin mời các bạn xem qua topic này:
http://www.giaiphapexcel.com/forum/showthread.php?38005-Sắp-xếp-mảng-dữ-liệu-không-sử-dụng-vòng-lặp&
Ở đây người ta dùng JScript để sort mảng 1 chiều
Mượn tạm sự trợ giúp này, tôi xây dụng code sort mảng 2 chiều như sau:
Code thử nghiệm
Sort dữ liệu 10000 dòng, 3 cột, kết quả gần như nháy mắt
----------------------------------------
Tạm thời vẫn chưa biết cách nào để sort được các cột chứa Number (chỉ sort dạng Text mà thôi)
Các bạn down file về thử nghiệm và cải tiến giúp những chổ còn thiếu sót nhé. Cảm ơn
http://www.giaiphapexcel.com/forum/showthread.php?38005-Sắp-xếp-mảng-dữ-liệu-không-sử-dụng-vòng-lặp&
Ở đây người ta dùng JScript để sort mảng 1 chiều
Mượn tạm sự trợ giúp này, tôi xây dụng code sort mảng 2 chiều như sau:
PHP:
Function Sort1DArray(Arr, Optional isText As Boolean = False, Optional isDESC As Boolean = False)
Dim sCommand As String
sCommand = "('" & Join(Arr, vbBack) & "').split('" & vbBack & "').sort("
If isText Then
sCommand = sCommand & ")"
Else
sCommand = sCommand & "function(a,b){return (a-b)})"
End If
If isDESC Then sCommand = sCommand & ".reverse()"
sCommand = sCommand & ".join('" & vbBack & "')"
With CreateObject("MSScriptControl.ScriptControl")
.Language = "JavaScript"
Sort1DArray = Split(.Eval(sCommand), vbBack)
End With
End Function
PHP:
Function Sort2DArray(sArray, ColIndex As Long, Order As Boolean, HasTitle As Boolean)
Dim TmpArr, Title, i As Long, j As Long, Dic, SortArr, SortArr2
Dim Arr, iR As Long, Tmp, Chk As Boolean
Set Dic = CreateObject("Scripting.Dictionary")
On Error Resume Next
TmpArr = sArray
'Chk = IsNumeric(TmpArr(LBound(TmpArr, 1) - HasTitle, ColIndex))
For i = LBound(TmpArr, 1) - HasTitle To UBound(TmpArr, 1)
Tmp = TmpArr(i, ColIndex)
If Dic.Exists(Tmp) Then
Tmp = Tmp & vbTab & i
TmpArr(i, ColIndex) = Tmp
End If
Dic.Add Tmp, i
Next
Arr = TmpArr
SortArr = Sort1DArray(Dic.Keys, Not Chk, Order)
For i = LBound(TmpArr, 1) - HasTitle To UBound(TmpArr, 1)
iR = Dic.Item(SortArr(i + HasTitle - 1))
For j = LBound(sArray, 2) To UBound(sArray, 2)
Arr(i, j) = Replace(TmpArr(iR, j), vbTab & iR, "")
Next
Next
Sort2DArray = Arr
End Function
PHP:
Sub TestHasTitle()
Dim sArray, Arr
sArray = Range("A1:C10000").Value
Arr = Sort2DArray(sArray, 2, False, True)
Range("E1:G10000").Value = Arr
End Sub
PHP:
Sub TestNoTitle()
Dim sArray, Arr
sArray = Range("A2:C10000").Value
Arr = Sort2DArray(sArray, 2, False, False)
Range("I2:K10000").Value = Arr
End Sub
----------------------------------------
Tạm thời vẫn chưa biết cách nào để sort được các cột chứa Number (chỉ sort dạng Text mà thôi)
Các bạn down file về thử nghiệm và cải tiến giúp những chổ còn thiếu sót nhé. Cảm ơn