[VBA] Nietypowe sortowanie wg nazwisk w Excelu 2007

0

Witam!

Ostatnio w gazecie KŚ Ekspert 1-2/2009 był pewien kod w VBA, dzięki któremu można posortować imiona i nazwiska osób względem nazwisk. Wygląda on następująco:

Public Sub sortuj()
Dim liczbaWierszy As Integer
liczbaWierszy = Application.Selection.Rows.Count
Application.ScreenUpdating = False
Call qsort(1, liczbaWierszy)
End Sub


Private Sub qsort(lewa, prawa)
Dim m As Integer
Dim i As Integer
If lewa < prawa Then
m = lewa
i = lewa + 1
Do While (i <= prawa)
If porównaj(i, lewa) < 0 Then
m = m + 1
Call zamień(m, i)
End If
i = i + 1
Loop
Call zamień(lewa, m)
Call qsort(lewa, m - 1)
Call qsort(m + 1, prawa)

End If
End Sub


Private Function porównaj(i1, i2) As Integer
c1 = Application.Selection.Rows(i1).Cells(1, 1)
c2 = Application.Selection.Rows(i2).Cells(1, 1)

poz1 = InStr(c1, " ")
poz2 = InStr(c2, " ")

If poz1 Then
str1 = Mid(c1, poz1 + 1)
Else
str1 = ""
End If

If poz2 Then
str2 = Mid(c2, poz2 + 1)
Else
str2 = ""
End If
porównaj = StrComp(str1, str2, vbTextCompare)
End Function</span>


Private Sub zamień(i1, i2)
If i1 = i2 Then
Exit Sub
End If
If i1 > i2 Then
Dim temp
temp = i2
i2 = i1
i1 = temp

End If
Application.Selection.Rows(i1).Copy
Application.Selection.Rows(i2).Insert
Application.Selection.Rows(i2 + 1).Copy (Application.Selection.Rows(i1))
Application.Selection.Rows(i2 + 1).Delete
End Sub

Wkleiłem to do [quote] ponieważ zaznaczyłem kilka fragmentów do których mam pytanie. (Aha, jeszcze wspomnę, że aby zrozumieć działanie tego programu, niezbędne jest znanie też algorytmu QuickSort, gdzie element osiowy znajduje się na samym początku).

<font size="3">1.</span>

Rozumiem funkcję porównaj (zaznaczona jest na fioletowo) - chodzi tam mniej więcej o to, że w nazwie funkcji są arg. i1 i i2, czy jak się to tam nazywa (już dawno nie programowałem w żadnym języku więc trochę wyleciało mi z głowy). I jak jest wywołanie funkcji tej to tam jest i i lewa (ten fragment zaznaczyłem na podkreślony zielony, ponieważ jak już mówiłem zapomniałem trochę definicji z programowania, jak to się dokładniej nazywa). Więc można powiedzieć, że i to jest i1 (a dokładniej str1) - czyli zmienna, która może się zmieniać. Natomiast str2 to lewa i ta zmienna pozostaje bez zmian, ponieważ lewa zawsze oznacza pierwszą komórkę. I w czasopiśmie jest fragment:

Funkcja porównaj ma porównać wartości wierszy wskazywane przez zmienne i i lewa. Jeśli drugi z nich jest większy, ma zwrócić wartość mniejszą od zera (...)

Większy tutaj oznacza dalszy w kolejności alfabetycznej. I wszystko się zgadza to co mówiłem, tak ???

<font size="3">2.</span>

Czy ktoś mógłby mi zrozumiale wytłumaczyć co robią linijki zaznaczone na niebiesko w funkcji zamień ?

<font size="3">3.</span>

Funkcja zamień ma 2 arg. - i1 i i2. Wywołanie tej funkcji pojawia się w kodzie dwa razy - jest to zaznaczone na czerwono ^^...

Na początek chciałbym się zapytać odnośnie 2 - go wywołania. Na początku funkcji zamień sprawdzane jest czy lewa i m są równe - jeżeli są to nie trzeba nic zamieniać ponieważ zdarzyło się tak, że w programie nie potrzebne było sortowanie - wszystkie elementy od 1 - szej komórki (zmienna lewa) są od niej większe (dalsze w kol. alfabetycznej).

Ale tam jest jeszcze 1-sze wywołanie. I jeżeli i1 > i2, czyli podstawiamy, że m jest większe od i to wywołuje się dalsze instrukcje. Ale o co chodzi z tym i1 > i2 ? Nie rozumiem tego.

<font size="3">4.</span>

W kodzie zaznaczyłem na pomarańczowo dwa wywołania rekurencyjne - nie wiem czym są te wyrażenia rekurencyjne, ponieważ jeszcze się ich nie uczyłem - ale czy do zrozumienia działania tego makra, konieczna jest ich znajomość ?

To tyle pytań. Chciałbym nadmienić jeszcze, że kod ogólnie rozumiem, tylko nie rozumiem niektórych działań funkcji. Wspomnę jeszcze, że nie znam wcale VB - to jest moja pierwsza przygoda z nim.

Z góry wielkie, ale to wielkie dzięki za pomoc ;] ;] ;]

0

Skoro już tu trafiłem to Ci kolego odpowiem, choć już dawno pewnie o tym wiesz :)
To czego nie rozumiesz polega na tym, że musisz na chwilę przechować wartość i2. Służy do tego zmienna temp
Dim temp deklaracja zmiennej
temp = i2 ponieważ za chwilę i2 zmieni wartość, która będzie Ci potrzebna, to zapamiętujesz ją w zmiennej temp
i2 = i1 zmieniasz i2 na i1 i teraz gdybyś nie miał zapamiętanej i2 sprzed zmiany, to nie mógłbyś zmienić
i1 = temp i1 na stare i2

Całe to działanie polega na zamianie wartości pomiędzy i2 i i1. Gdyby nie dodatkowa zmienna nie dałoby się tego zrobić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1