Sortowanie zakresu komórek: Różnice pomiędzy wersjami
(Nie pokazano 1 pośredniej wersji utworzonej przez tego samego użytkownika) | |||
Linia 146: | Linia 146: | ||
− | [[LibreOffice Calc – makra | <b>LibreOffice Calc – makra</b>]] [[Henryk Dąbrowski | <b>Strona główna</b>]] | + | [[LibreOffice Calc – makra – przykłady | <b>LibreOffice Calc – makra – przykłady</b>]] [[Henryk Dąbrowski | <b>Strona główna</b>]] |
Aktualna wersja na dzień 15:27, 24 maj 2024
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 – przykłady Strona główna