Sortowanie zakresu komórek

Z Henryk Dąbrowski
Przejdź do nawigacji Przejdź do wyszukiwania
04.10.2020



Sortowanie zakresu komórek według jednej kolumny

Procedura Sort1() sortuje zakres komórek oRng według jednej (i tylko jednej) kolumny Col, gdzie Col oznacza indeks kolumny w sortowanym zakresie! Wartość parametru IsAscending (True lub False) decyduje o tym, czy sortowanie będzie wykonywane rosnąco (True), czy malejąco (False).

Sub Sort1(oRng as Object, Col as Long, IsAscending as Boolean)
    'sortowanie zakresu komórek oRng według jednej kolumny Col tego zakresu
    'parametr IsAscending określa rodzaj sortowania: rosnące (True) i malejące (False)
    Dim aProperty(0) as New com.sun.star.beans.PropertyValue
    Dim aFields(0) as New com.sun.star.util.SortField 'deklarowany rozmiar musi odpowiadać liczbie kolumn
    aFields(0).Field = Col 'numeracja kolumn odnosi się do zakresu komórek oRng, np. 0 - pierwsza kolumna oRng
    aFields(0).SortAscending = IsAscending
    aProperty(0).Name = "SortFields"
    aProperty(0).Value = aFields()
    oRng.Sort(aProperty())
End Sub
Sub Sortowanie1()
    Dim oSht as Object, oRng as Object
    Dim k as Long
    oSht = ThisComponent.getCurrentController().getActiveSheet() 'uchwyt do aktywnego arkusza
    oSht.getCellRangeByName("A1").String = "komórka A1"
    oSht.getCellRangeByName("B2").String = "komórka B2"
    For k = 0 to 20
        oSht.getCellByPosition(3, k).Value = RandNum(0, 100) 'przypadkowe liczby z przedziału [0,100)
    Next k
    MsgBox "Zobacz postać wyjściową kolumny D"
    oRng = oSht.getCellRangeByPosition(3, 0, 3, 20) 'definiujemy zakres od D1 do D21
    Call Sort1(oRng, 0, True) 'liczba 0 oznacza kolumnę D arkusza
    MsgBox "Zobacz ponownie kolumnę D"
    oRng = oSht.getCellRangeByPosition(0, 0, 3, 20) 'definiujemy zakres od A1 do D21
    Call Sort1(oRng, 3, False) 'liczba 3 oznacza kolumnę D arkusza
    MsgBox "Zobacz po raz kolejny kolumnę D"
End Sub



Sortowanie zakresu komórek według dwóch kolumn

Procedura Sort2() sortuje zakres komórek oRng według dwóch kolumn: najpierw według kolumny Col1, a następnie według kolumny Col2. Liczby Col1 i Col2 oznaczają indeksy kolumn w sortowanym zakresie! Wartość parametrów IsAscending1 i IsAscending2 (True lub False) decyduje o tym, czy sortowanie będzie wykonywane rosnąco (True), czy malejąco (False).

Sub Sort2(oRng as Object, Col1 as Long, IsAscending1 as Boolean, _
                          Col2 as Long, IsAscending2 as Boolean)
    'sortowanie zakresu komórek oRng według kolumny Col1 tego zakresu, a następnie według kolumny Col2
    'parametry IsAscending1 i IsAscending2 określają rodzaj sortowania: rosnące (True) i malejące (False)
    Dim aProperty(0) as New com.sun.star.beans.PropertyValue
    Dim aFields(1) as New com.sun.star.util.SortField 'deklarowany rozmiar musi odpowiadać liczbie kolumn
    aFields(0).Field = Col1 'numeracja kolumn odnosi się do zakresu komórek oRng, np. 0 - pierwsza kolumna oRng
    aFields(0).SortAscending = IsAscending1
    aFields(1).Field = Col2 'numeracja kolumn odnosi się do zakresu komórek oRng, np. 1 - druga kolumna oRng
    aFields(1).SortAscending = IsAscending2
    aProperty(0).Name = "SortFields"
    aProperty(0).Value = aFields()
    oRng.Sort(aProperty())
End Sub
Sub Sortowanie2()
    Dim oSht as Object, oRng as Object
    Dim k as Long
    oSht = ThisComponent.getCurrentController().getActiveSheet() 'uchwyt do aktywnego arkusza
    oSht.getCellRangeByName("A1").String = "komórka A1"
    oSht.getCellRangeByName("B2").String = "komórka B2"
    For k = 0 to 20
        oSht.getCellByPosition(3, k).String = Chr( Int( RandNum(65, 73) ) ) 'przypadkowe litery od A do H
        oSht.getCellByPosition(4, k).Value = RandNum(0, 100) 'przypadkowe liczby z przedziału [0,100)
    Next k
    MsgBox "Zobacz postać wyjściową kolumn D i E"
    oRng = oSht.getCellRangeByPosition(3, 0, 4, 20) 'definiujemy zakres od D1 do E21
    Call Sort2(oRng, 0, True , 1, True) 'liczby 0 i 1 oznaczają odpowiednio kolumny D i E arkusza
    MsgBox "Zobacz ponownie kolumny D i E"
    oRng = oSht.getCellRangeByPosition(0, 0, 4, 20) 'definiujemy zakres od A1 do E21
    Call Sort2(oRng, 3, False, 4, False) 'liczby 3 i 4 oznaczają odpowiednio kolumny D i E arkusza
    MsgBox "Zobacz po raz kolejny kolumny D i E"
End Sub



Sortowanie zakresu komórek według trzech kolumn

Procedura Sort3() sortuje zakres komórek oRng według trzech kolumn: najpierw według kolumny Col1, następnie według kolumny Col2 i w następnej kolejności według kolumny Col3. Liczby Col1, Col2 i Col3 oznaczają indeksy kolumn w sortowanym zakresie! Wartość parametrów IsAscending1, IsAscending2 i IsAscending3 (True lub False) decyduje o tym, czy sortowanie będzie wykonywane rosnąco (True), czy malejąco (False).

Sub Sort3(oRng as Object, Col1 as Long, IsAscending1 as Boolean, _
                          Col2 as Long, IsAscending2 as Boolean, _
                          Col3 as Long, IsAscending3 as Boolean)
    'sortowanie zakresu komórek oRng według kolumny Col1, a następnie według kolumn Col2 oraz Col3
    'parametry IsAscending1, IsAscending2 i IsAscending3 określają rodzaj sortowania: rosnące (True) i malejące (False)
    Dim aProperty(0) as New com.sun.star.beans.PropertyValue
    Dim aFields(2) as New com.sun.star.util.SortField 'deklarowany rozmiar musi odpowiadać liczbie kolumn
    aFields(0).Field = Col1 'numeracja kolumn odnosi się do zakresu komórek oRng, np. 0 - pierwsza kolumna oRng
    aFields(0).SortAscending = IsAscending1
    aFields(1).Field = Col2 'numeracja kolumn odnosi się do zakresu komórek oRng, np. 1 - druga kolumna oRng
    aFields(1).SortAscending = IsAscending2
    aFields(2).Field = Col3 'numeracja kolumn odnosi się do zakresu komórek oRng, np. 2 - trzecia kolumna oRng
    aFields(2).SortAscending = IsAscending3
    aProperty(0).Name = "SortFields"
    aProperty(0).Value = aFields()
    oRng.Sort(aProperty())
End Sub
Sub Sortowanie3()
    Dim oSht as Object, oRng as Object
    Dim d as Date
    Dim k as Long
    oSht = ThisComponent.getCurrentController().getActiveSheet() 'uchwyt do aktywnego arkusza
    oSht.getCellRangeByName("A1").String = "komórka A1"
    oSht.getCellRangeByName("B2").String = "komórka B2"
    For k = 0 to 20
        d = Int( RandNum(36892, 37986) ) 'przypadkowe daty z lat 2001 - 2003
        oSht.getCellByPosition(3, k).Value = Year(d) 'rok daty d
        oSht.getCellByPosition(4, k).Value = Month(d) 'miesiąc daty d
        oSht.getCellByPosition(5, k).Value = Day(d) 'dzień miesiąca daty d
    Next k
    MsgBox "Zobacz postać wyjściową kolumn D, E i F"
    oRng = oSht.getCellRangeByPosition(3, 0, 5, 20) 'definiujemy zakres od D1 do F21
    Call Sort3(oRng, 0, True , 1, True, 2, True) 'liczby 0, 1, 2 oznaczają odpowiednio kolumny D, E, F arkusza
    MsgBox "Zobacz ponownie kolumny D, E i F"
    oRng = oSht.getCellRangeByPosition(0, 0, 5, 20) 'definiujemy zakres od A1 do F21
    Call Sort3(oRng, 3, False, 4, False, 5, False) 'liczby 3, 4, 5 oznaczają odpowiednio kolumny D, E, F arkusza
    MsgBox "Zobacz po raz kolejny kolumny D, E i F"
End Sub



Sortowanie zakresu komórek według czterech lub większej liczby kolumn

Jeśli potrzebujemy posortować dane według n kolumn w przypadku, gdy n > 3, to postępujemy analogicznie, jak w wypisanych wyżej procedurach. Musimy pamiętać o umieszczeniu następującej deklaracji

Dim aFields(n - 1) as New com.sun.star.util.SortField

Tak, aby deklarowany rozmiar odpowiadał liczbie kolumn.





LibreOffice Calc – makra                   Strona główna