Routines called by test code , Sub TestsStringArray() , in last post:
Code:Sub subSort2DArrayMultiElements( _ sparray() As String, _ spOrder As String _ ) ' Sort an array with TWO dimensions. ' Assume Sort on the 2nd Dimension ' so assumes it IS a 2 Dim array. ' Sort on more than one element. ' ' This uses a merge sort. ' The sort is set up as ascending and not case sensitive. ' ' Use ' subSortMultiElements Array, Order ' ' Ex Order = "1 4 0 3 2". ' Not all elements need be specified. ' Any delimiter may be used. ' Dim lnglArrayIndex As Long Dim lnglElements As Long Dim lnglEndArray As Long Dim lnglKey As Long Dim lnglLbound As Long Dim lnglM As Long Dim lnglN As Long Dim lnglNumSortKeys As Long Dim lnglO As Long Dim lnglP As Long Dim lnglPrevKeyCol As Long Dim lnglThisKeyCol As Long Dim lnglUBound As Long Dim lngSubArrayRows As Long Dim slKeyVal As String Dim slOrder As String Dim slOrderArray() As String Dim slSubArray() As String Dim slTopKeyVal As String lnglElements = UBound(sparray, 2) ' Make an Order Array. slOrder = spOrder ' Delimiter? ' Disappear the numbers. For lnglN = 0 To 9 slOrder = Replace(slOrder, CStr(lnglN), "") Next lnglN slOrder = Trim$(slOrder) ' Should only have the delimiter left. If Len(slOrder) = 0 Then slOrderArray = Split(spOrder, " ") Else slOrderArray = Split(spOrder, Mid$(slOrder, 1, 1)) End If lnglNumSortKeys = UBound(slOrderArray) + 1 ' Always Sort on the FIRST Key. lnglKey = CLng(slOrderArray(0)) subArrayMergeSort sparray, lnglKey ' Only one key? If lnglNumSortKeys = 1 Then Exit Sub End If ' Now go through the rest of the keys. ' We extract a series of arrays based on the KEY - 1. ' Any records to sort? If UBound(slOrderArray) > 0 Then For lnglN = 1 To lnglNumSortKeys - 1 ' Pick up the start Value from Key-1. lnglPrevKeyCol = slOrderArray(lnglN - 1) lnglThisKeyCol = slOrderArray(lnglN) slTopKeyVal = sparray(0, lnglPrevKeyCol) lnglLbound = 0 lnglUBound = UBound(sparray, 1) ' All the same. If sparray(lnglUBound, 0) = slTopKeyVal Then Exit For End If lnglArrayIndex = 0 lnglEndArray = UBound(sparray) Do lnglLbound = lnglArrayIndex slTopKeyVal = sparray(lnglArrayIndex, lnglPrevKeyCol) Do If lnglArrayIndex > lnglEndArray Then Exit Do End If slKeyVal = sparray(lnglArrayIndex, lnglPrevKeyCol) If slKeyVal <> slTopKeyVal Then lnglUBound = lnglArrayIndex - 1 Exit Do End If lnglArrayIndex = lnglArrayIndex + 1 Loop ' No need to sort if there's only ONE row. lngSubArrayRows = lnglUBound - lnglLbound If lngSubArrayRows > 1 Then ' Get those rows. ReDim slSubArray(lnglUBound - lnglLbound, lnglElements) lnglP = 0 For lnglM = lnglLbound To lnglUBound For lnglO = 0 To lnglElements slSubArray(lnglP, lnglO) = sparray(lnglM, lnglO) Next lnglO lnglP = lnglP + 1 Next lnglM ' Sort 'em. subArrayMergeSort slSubArray, lnglThisKeyCol ' Put 'em back. lnglP = 0 For lnglM = lnglLbound To lnglUBound For lnglO = 0 To lnglElements sparray(lnglM, lnglO) = slSubArray(lnglP, lnglO) Next lnglO lnglP = lnglP + 1 Next lnglM End If If lnglArrayIndex > lnglEndArray Then Exit Do End If Loop Next lnglN End If ' *********************************************************************** End Sub




Reply With Quote
Bookmarks