Excel VBA: Simpel sortering i et array
Hej eksperter!Jeg har kreeret en procedure til eget brug hvor jeg skal sortere et array.
Jeg forsøger at gøre det på den helt simple måde - i stil med håndsortering.
Jeg tager 2 poster ad gangen og sammenligner hvilken værdi der er størst, og bytter dem rund hvis nødvendigt. Sådan løber jeg hele arrayet igennem, og sammenligner kun 2 poster der kommer lige efter hinanden, så hvia den første post er større end den næste så byttes de rundt
Så forestiller jeg mig at det kun er st spørgsmål om at køre dette gennem løb tilstrækkeligt mange gange, og så vil jeg altid stå tilbage med at fuldt sorteret array.
Mit spørgsmål er nu:
Er der en begrænsning i denne metode?
Det kunne måske være antal poster i arrayet, eller antal gange jeg gennemløber…
Med mine hurtige tests med mindre arrays, så er jeg end med rigtig sortering, men jeg håber nogen kan udfordre metoden og spotte hvad der skal til for at metoden fejler, eller ikke fuldender sortering.
Jeg ved godt at der kan findes nogle færdige procedurer på nettet, til at klare det (eksempelvis bubble sort og vist også andre lignende) men det er vigtigt at jeg selv forstår hver eneste linje, fordi jeg senere skal have en kolonne mere med i min sortering, da jeg har en tilhørende værdi i kolonne 2, som jeg skal bruge, sorteret efter de tilhørende talværdier.
Sub TestSort()
Dim ArrayUnsorted As Variant
Dim ArraySorted As Variant
Dim str As String
ArrayUnsorted = Array(8, 2, 4, 5, 9, 5, 4, 2)
ArraySorted = ArrayUnsorted ' kopierer arrayet til et arbejdskopi der skal ende med at blivedet sortedede array
For ii = 1 To UBound(ArrayUnsorted, 1) ' jeg vælger at køre sorteringsloopet lige så mange gange som der er poster i arrayet
For i = 0 To UBound(ArrayUnsorted, 1) - 1 ' her gennemløber vi arrayet går vi ind og sammenligner jeg 2 poster ad gangen, og smider værdierne ind i nogle midlertidige variabler.
' og fra nu af er det kun det sorterede array vi arbejder med - det skal ihvertfald ende emed at blive sorteret undevejs
If ArraySorted(i) > ArraySorted(i + 1) Then
' Hvis ArraySorted(i) var større end ArraySorted(i + 1), så skal de jo byttes rundt
' så vil jeg smide de 2 sammenlignede values ind i nogle midlertidige variabler
SwabValue1 = ArraySorted(i) ' bytter rundt på de 2 værdier i arrayet
SwabValue2 = ArraySorted(i + 1) ' bytter stadig rundt på de 2 værdier i arrayet
ArraySorted(i + 1) = SwabValue1
ArraySorted(i) = SwabValue2
End If
Next i
Next ii
' for at teste sorteringen gennemløber jeg det sorterede array, og "udskriver" med msgbox i hvert loop - så skal de gerne være sorteret stigende
For i = 0 To UBound(ArraySorted, 1)
MsgBox ArraySorted(i)
Next i
End Sub
Dim ArrayUnsorted As Variant
Dim ArraySorted As Variant
Dim str As String
ArrayUnsorted = Array(8, 2, 4, 5, 9, 5, 4, 2)
ArraySorted = ArrayUnsorted ' kopierer arrayet til et arbejdskopi der skal ende med at blivedet sortedede array
For ii = 1 To UBound(ArrayUnsorted, 1) ' jeg vælger at køre sorteringsloopet lige så mange gange som der er poster i arrayet
For i = 0 To UBound(ArrayUnsorted, 1) - 1 ' her gennemløber vi arrayet går vi ind og sammenligner jeg 2 poster ad gangen, og smider værdierne ind i nogle midlertidige variabler.
' og fra nu af er det kun det sorterede array vi arbejder med - det skal ihvertfald ende emed at blive sorteret undevejs
If ArraySorted(i) > ArraySorted(i + 1) Then
' Hvis ArraySorted(i) var større end ArraySorted(i + 1), så skal de jo byttes rundt
' så vil jeg smide de 2 sammenlignede values ind i nogle midlertidige variabler
SwabValue1 = ArraySorted(i) ' bytter rundt på de 2 værdier i arrayet
SwabValue2 = ArraySorted(i + 1) ' bytter stadig rundt på de 2 værdier i arrayet
ArraySorted(i + 1) = SwabValue1
ArraySorted(i) = SwabValue2
End If
Next i
Next ii
' for at teste sorteringen gennemløber jeg det sorterede array, og "udskriver" med msgbox i hvert loop - så skal de gerne være sorteret stigende
For i = 0 To UBound(ArraySorted, 1)
MsgBox ArraySorted(i)
Next i
End Sub
Jeggentager lige at jeg håber nogen kan udfordre metoden og spotte hvad der skal til for at metoden fejler, eller ikke fuldender sortering.
Jeg har blot udfordret metoden med at start-array med 8 poster
Men er det antal poster der bliver begrænsningen, eller hvilke forhold kan påvirke sorteringsmetoden?
