Funkcja SortowanieBabelkowe2D   strona główna:
A po co ten Excel ;-)
 
    No właśnie funkcja! Choć dotychczas używałem sortowania jako procedury wywoływanej w kodzie funkcji UDF to jednak już od  
jakiegoś czasu chciałem przerobić to na funkcję. I w końcu zaistniała ku temu potrzeba.  
 
    Zagadnieniem sortowania zajmowałem się już jakiś czas temu i choć wiem że sortowanie bąbelkowe do najszybszych nie należy to   Ciekawych różnych sposobów
jednak gdy danych jest trochu za dużo do takiego sortowania pod ręką znajdują się inne metody (klauzula ORDER BY w SQL), a do   sortowania danych.
Excelowych potrzeb sortowanie to wydaje się nieraz dobrym kompromisem między prostotą a uniwersalnością :-)   Sposobów optymalizowania 
  algorytmów sortujących.
  Testów, przykładów...
Public Function SortowanieBabelkowe2D(rngDane As Excel.Range, _   zapraszam do lekturki mojego art.
                            ParamArray nrKol() As Variant) As Variant   Algorytmy sortujące
    Dim tabl As Variant  
    Dim nr As Variant  
    Dim xMax As Long, yMax As Integer, jTbl As Integer   ORDER BY - SQL
    Dim i As Long, j As Long, a As Long  
    Dim Temp  
      
    tabl = rngDane  
    xMax = UBound(tabl, 1): yMax = UBound(tabl, 2)  
    For Each nr In nrKol  
        a = 2  
        For i = 2 To xMax  
            For j = xMax To a Step -1  
                If tabl(j - 1, nr) > tabl(j, nr) Then  
                    For jTbl = 1 To yMax  
                        Temp = tabl(j - 1, jTbl)  
                        tabl(j - 1, jTbl) = tabl(j, jTbl)  
                        tabl(j, jTbl) = Temp  
                    Next  
                End If  
            Next  
            a = a + 1  
        Next  
    Next  
    With Application.Caller  
        DefiniowanieZawartosciZakresuPozaTablica tabl, _  
                                                .Rows.Count, _  
                                                .Columns.Count  
    End With  
    SortowanieBabelkowe2D = tabl  
End Function  
 
 
Sortowanie bąbelkowe  
          „polega na cyklicznym porównywaniu dwóch sąsiadujących elementów. Jeżeli nie są one ustawione we właściwej kolejności,    
           to następuje ich zamiana.”  
                                                         Algorytmy Bogdan Buczek.   
                                              Wydawnictwo Helion r.2009.  
                                              Rozdział 8. Algorytmy sortowania danych str. 243  
 
Za ten etap działania funkcji odpowiadają dwie wewnętrzne pętle i porównanie ze sobą dwóch sąsiadujących wartości  
        For i = 2 To xMax  
            For j = xMax To a Step -1  
                If tabl(j - 1, nr) > tabl(j, nr) Then  
 
    Uzależnienie wykonania sortowania elementów od zmiennej a odpowiada za przyspieszanie algorytmu sortowania metodą pomijania   
pustych operacji. Idea postępowania opiera się o fakt że po pierwszym przejściu procedury przez wewnętrzną pętlę, porównanie ze  
sobą kolejnych sąsiadujących elementów tablicy spowodowało że element o najmniejszej wartości znalazł się już na pierwszym miejscu  
sortowanej tablicy. Nie więc sensu żeby kolejne porównania sąsiadujących elementów dotyczyły również tego elementu. Po 5 obiegach  
porównań - 5 pierwszych elementów jest już na swoim miejscu, itd.. Porównania zatem dotyczą coraz mniejszej ilości elementów tabl.  
co zasadniczo wpływa na czas wykonania procedury :-)  
Odbywa się to na poniższym fragmencie:  
        a = 2  
        For i = 2 To xMax  
            For j = xMax To a Step -1  
                '...  
            Next  
            a = a + 1  
        Next  
 
Ostatnia pętla  
                    For jTbl = 1 To yMax  
                        Temp = tabl(j - 1, jTbl)  
                        tabl(j - 1, jTbl) = tabl(j, jTbl)  
                        tabl(j, jTbl) = Temp  
                    Next  
odpowiada za zamianę miejscami elementów dwóch porównywanych rekordów tabeli. W jednowymiarowej tablicy nie byłoby tej pętli. T  
po porównaniu ze sobą dwóch sąsiadujących elementów, wykorzystując dodatkową zmienną następuje zamiana elementów miejscami.  
Jednak gdy sortujemy tablicę 2'u wymiarową należy zamienić miejscami dwa rekordy/wiersze tabeli danych. Porównujemy ze sobą dwa,   
wskazane numerem kolumny, elementy dwóch rekordów. Jak zostanie spełniony warunek porównania trzeba w pętli przez wszystkie elementy rekordu  
zamienić miejscami oba rekordy, wszystkie ich elementy.  
 
    Pierwsza pętla podaje właśnie numer/numery kolumny danych po której porównywane będą elementy  
    For Each nr In nrKol   Przykład wykorzystania
       '...   Funkcji SortowanieBabelkowe2D
                If tabl(j - 1, nr) > tabl(j, nr) Then   na excelforum.pl
       '...  
    Next  
  Przykłady wykorzystania
nr to element tablicy nrKol będącej arg. ParamArray omawianej funkcji. Możemy zatem sortować tablicę pod względem wartości kilku     Procedury SortowanieBabelkowe2D
kolumn. Istotna jest jednak kolejność podawania numerów kolumn po których tablica będzie sortowana. Analiza przykładów powinna wyjaśnić resztę    z sortowaniem względem wielu
wątpliwości.   kolumn. W moim art.
  Unikaty
OK. Funkcja sortuje tablicę rosnąco. Jak zmienić ją na sortowanie malejące? Odpowiada za to linia:  
                If tabl(j - 1, nr) > tabl(j, nr) Then  
co tu wyjaśniać?? :-)