Home |
Search |
Today's Posts |
#1
Posted to microsoft.public.excel.programming
|
|||
|
|||
Save & Sort
Hello,
I have a very big excel file (approx. 58 MB) and every time I open my worksheet I run a module which go thru each row (in 4 different columns ex. | Ticker | Name | Category | Country ) and save the data in a dictionary and once finished (which means approx after 8000 rows) I sort the result using the following function : Public Function SortArray(MyArray As Variant) As Variant 'Sort array For lLoop = 0 To UBound(MyArray) For lLoop2 = lLoop To UBound(MyArray) If UCase(MyArray(lLoop2)) < UCase(MyArray(lLoop)) Then str1 = MyArray(lLoop) str2 = MyArray(lLoop2) MyArray(lLoop) = str2 MyArray(lLoop2) = str1 End If Next lLoop2 Next lLoop 'Output sorted array SortArray = MyArray End Function My question is : Is there a way to save the result faster and also sort it faster than the one I use at the moment ? Thanks in advance. Cheers! |
#2
Posted to microsoft.public.excel.programming
|
|||
|
|||
Save & Sort
Bubble sorts, as you have discovered, are simple to code but excruciatingly
slow when sorting large arrays. You can copy your array to a scratch worksheet and use the Excel Sort function on it, or here is a very fast "Heap" sort. This function I adapted from a Fortran Heap sort function I wrote circa 1983. It has ugly "GoTo" statements but I tested it to be faster than those versions that were later rewritten to remove the GoTo's. My version uses 1-based string Arrays. I modified it to use 0-based Variants for you but have not tested it. Google "Heap Sort" and "Quick Sort" for other sorting algorithms. Have Fun, Charlie Public Function SortList(List() As Variant) As Variant ' ' fast "Heap" sort alogrithm from Knuth - The Art of Computer Programming ' Dim i As Long Dim j As Long Dim nent As Long Dim ist As Long Dim lst As Long Dim tmp As String Dim buf() As String ' ' set sort pointers to the midpoint and endpoint of the array (NOTE - use the ' integer division operator!) ' nent = UBound(List) ist = nent \ 2 + 1 lst = nent buf = List ' ' do an ascending sort ' 110: If ist 0 Then ist = ist - 1 tmp = buf(ist) Else tmp = buf(lst) buf(lst) = buf(1) lst = lst - 1 If lst = 1 Then buf(lst) = tmp SortList = buf Exit Function End If End If ' j = ist ' 120: i = j j = j * 2 ' If j = lst Then If tmp = buf(j) Then buf(i) = tmp GoTo 110 End If buf(i) = buf(j) GoTo 120 End If ' If j lst Then buf(i) = tmp GoTo 110 End If ' If buf(j) < buf(j + 1) Then j = j + 1 If tmp = buf(j) Then buf(i) = tmp GoTo 110 End If ' buf(i) = buf(j) GoTo 120 ' End Function "Redan" wrote: Hello, I have a very big excel file (approx. 58 MB) and every time I open my worksheet I run a module which go thru each row (in 4 different columns ex. | Ticker | Name | Category | Country ) and save the data in a dictionary and once finished (which means approx after 8000 rows) I sort the result using the following function : Public Function SortArray(MyArray As Variant) As Variant 'Sort array For lLoop = 0 To UBound(MyArray) For lLoop2 = lLoop To UBound(MyArray) If UCase(MyArray(lLoop2)) < UCase(MyArray(lLoop)) Then str1 = MyArray(lLoop) str2 = MyArray(lLoop2) MyArray(lLoop) = str2 MyArray(lLoop2) = str1 End If Next lLoop2 Next lLoop 'Output sorted array SortArray = MyArray End Function My question is : Is there a way to save the result faster and also sort it faster than the one I use at the moment ? Thanks in advance. Cheers! |
#3
Posted to microsoft.public.excel.programming
|
|||
|
|||
Save & Sort
By the way, this sort function is Case Sensitive. You will need to add the
UCase statements, or try using Option Compare Text. "Charlie" wrote: Bubble sorts, as you have discovered, are simple to code but excruciatingly slow when sorting large arrays. You can copy your array to a scratch worksheet and use the Excel Sort function on it, or here is a very fast "Heap" sort. This function I adapted from a Fortran Heap sort function I wrote circa 1983. It has ugly "GoTo" statements but I tested it to be faster than those versions that were later rewritten to remove the GoTo's. My version uses 1-based string Arrays. I modified it to use 0-based Variants for you but have not tested it. Google "Heap Sort" and "Quick Sort" for other sorting algorithms. Have Fun, Charlie Public Function SortList(List() As Variant) As Variant ' ' fast "Heap" sort alogrithm from Knuth - The Art of Computer Programming ' Dim i As Long Dim j As Long Dim nent As Long Dim ist As Long Dim lst As Long Dim tmp As String Dim buf() As String ' ' set sort pointers to the midpoint and endpoint of the array (NOTE - use the ' integer division operator!) ' nent = UBound(List) ist = nent \ 2 + 1 lst = nent buf = List ' ' do an ascending sort ' 110: If ist 0 Then ist = ist - 1 tmp = buf(ist) Else tmp = buf(lst) buf(lst) = buf(1) lst = lst - 1 If lst = 1 Then buf(lst) = tmp SortList = buf Exit Function End If End If ' j = ist ' 120: i = j j = j * 2 ' If j = lst Then If tmp = buf(j) Then buf(i) = tmp GoTo 110 End If buf(i) = buf(j) GoTo 120 End If ' If j lst Then buf(i) = tmp GoTo 110 End If ' If buf(j) < buf(j + 1) Then j = j + 1 If tmp = buf(j) Then buf(i) = tmp GoTo 110 End If ' buf(i) = buf(j) GoTo 120 ' End Function "Redan" wrote: Hello, I have a very big excel file (approx. 58 MB) and every time I open my worksheet I run a module which go thru each row (in 4 different columns ex. | Ticker | Name | Category | Country ) and save the data in a dictionary and once finished (which means approx after 8000 rows) I sort the result using the following function : Public Function SortArray(MyArray As Variant) As Variant 'Sort array For lLoop = 0 To UBound(MyArray) For lLoop2 = lLoop To UBound(MyArray) If UCase(MyArray(lLoop2)) < UCase(MyArray(lLoop)) Then str1 = MyArray(lLoop) str2 = MyArray(lLoop2) MyArray(lLoop) = str2 MyArray(lLoop2) = str1 End If Next lLoop2 Next lLoop 'Output sorted array SortArray = MyArray End Function My question is : Is there a way to save the result faster and also sort it faster than the one I use at the moment ? Thanks in advance. Cheers! |
#4
Posted to microsoft.public.excel.programming
|
|||
|
|||
Save & Sort
Thanks Charlie !
"Charlie" wrote in message ... By the way, this sort function is Case Sensitive. You will need to add the UCase statements, or try using Option Compare Text. "Charlie" wrote: Bubble sorts, as you have discovered, are simple to code but excruciatingly slow when sorting large arrays. You can copy your array to a scratch worksheet and use the Excel Sort function on it, or here is a very fast "Heap" sort. This function I adapted from a Fortran Heap sort function I wrote circa 1983. It has ugly "GoTo" statements but I tested it to be faster than those versions that were later rewritten to remove the GoTo's. My version uses 1-based string Arrays. I modified it to use 0-based Variants for you but have not tested it. Google "Heap Sort" and "Quick Sort" for other sorting algorithms. Have Fun, Charlie Public Function SortList(List() As Variant) As Variant ' ' fast "Heap" sort alogrithm from Knuth - The Art of Computer Programming ' Dim i As Long Dim j As Long Dim nent As Long Dim ist As Long Dim lst As Long Dim tmp As String Dim buf() As String ' ' set sort pointers to the midpoint and endpoint of the array (NOTE - use the ' integer division operator!) ' nent = UBound(List) ist = nent \ 2 + 1 lst = nent buf = List ' ' do an ascending sort ' 110: If ist 0 Then ist = ist - 1 tmp = buf(ist) Else tmp = buf(lst) buf(lst) = buf(1) lst = lst - 1 If lst = 1 Then buf(lst) = tmp SortList = buf Exit Function End If End If ' j = ist ' 120: i = j j = j * 2 ' If j = lst Then If tmp = buf(j) Then buf(i) = tmp GoTo 110 End If buf(i) = buf(j) GoTo 120 End If ' If j lst Then buf(i) = tmp GoTo 110 End If ' If buf(j) < buf(j + 1) Then j = j + 1 If tmp = buf(j) Then buf(i) = tmp GoTo 110 End If ' buf(i) = buf(j) GoTo 120 ' End Function "Redan" wrote: Hello, I have a very big excel file (approx. 58 MB) and every time I open my worksheet I run a module which go thru each row (in 4 different columns ex. | Ticker | Name | Category | Country ) and save the data in a dictionary and once finished (which means approx after 8000 rows) I sort the result using the following function : Public Function SortArray(MyArray As Variant) As Variant 'Sort array For lLoop = 0 To UBound(MyArray) For lLoop2 = lLoop To UBound(MyArray) If UCase(MyArray(lLoop2)) < UCase(MyArray(lLoop)) Then str1 = MyArray(lLoop) str2 = MyArray(lLoop2) MyArray(lLoop) = str2 MyArray(lLoop2) = str1 End If Next lLoop2 Next lLoop 'Output sorted array SortArray = MyArray End Function My question is : Is there a way to save the result faster and also sort it faster than the one I use at the moment ? Thanks in advance. Cheers! |
Reply |
Thread Tools | Search this Thread |
Display Modes | |
|
|
Similar Threads | ||||
Thread | Forum | |||
Is there a way to Auto sort or save a sort? | Excel Discussion (Misc queries) | |||
save sort order ? | Excel Discussion (Misc queries) | |||
how do i save the sort settings | Setting up and Configuration of Excel | |||
Auto sort & save | Excel Worksheet Functions | |||
Sort By Date and Save | Excel Programming |