Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 23. 9. 2019 11:22:32

davef6
Člen
Registrace: 21. 11. 2018
Příspěvků: 15

Řazení sloupců - VYŘEŠENO

Zdravím,

řeším teď jeden menší problém a věřím, že tady mi s ním tady bude schopen někdo poradit. Mám soubor ve kterém je několik listů. Ve druhém listu je sloupec, který potřebuji seřadit sestupně od nejvyššího čísla, ale zároveň aby se to řazení dostalo i do listu 3 a 4, kde je sloupec ze druhého listu vložen jako např. =$list2.F2. Samozřejmě je podmínka, aby i ostatní sloupce se seřadili. Jak na to makrem? Toto se děje po několika dalších věcech, které dělá makro, jen mi jen čistě o řazení. Díky za nakopnutí

Editoval davef6 (11. 10. 2019 14:14:54)

Offline

#2 23. 9. 2019 12:21:23

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,465

Re: Řazení sloupců - VYŘEŠENO

Sub Sort_4
   Dim Doc As Object
   Dim Sheet As Object
   Dim oCell As Object
   Dim SortRange As Object
   Dim oSortDesc(1) As New com.sun.star.beans.PropertyValue
   Dim oSortField(0) As New com.sun.star.table.TableSortField
   Doc = ThisComponent
   Sheet = Doc.Sheets(0)
   SortRange = Sheet.getCellRangeByName("G10:G81")            
   oSortField(0).Field = 0
   oSortField(0).IsAscending = True
   oSortField(0).FieldType = com.sun.star.table.TableSortFieldType.AUTOMATIC  
   oSortDesc(0).Name = "SortFields"
   oSortDesc(0).Value = oSortField
   oSortDesc(1).Name = "ContainsHeader"
   oSortDesc(1).Value = False
   SortRange.sort(oSortDesc)  
End Sub

     Alespoň nástřel. Já mám mezi nejčastěji používanými makry 8 takových které nějak, nebo něco řadí. (Například řádky, víceúrovňově - podle více sloupců, nebo text či čísla). Takže toto makro by vám mělo pomoci.
     Podle toho co píšete :

davef6 napsal(a)

..........., kde je sloupec ze druhého listu vložen jako např. =$list2.F2. Samozřejmě je podmínka, aby i ostatní sloupce se seřadili. Jak na to makrem? Toto se děje po několika dalších věcech, které dělá makro, jen mi jen čistě o řazení

     Toto makro by v této podobě umělo řadit jen jediný úsek o více sloupcích. Aby to fungovalo musel byste buď na každý seznam použít explicitně toto makro (s tím že uvedete "sheet" a "SortRange"). Ale technicky stačí předávat tomuto makru parametry - nejméně sešit - pokud jsou ty úseky na různých listech stejné. Číslo sešitu deklarujte jako "integer", nebo jako "string" pokud chcete posílat na jméno listu (aby nedošlo k záměně - protože stačí přehodit listy a makra půjdou úplně jinam podle aktuálního umístění v sešitě:-)


     Když by Vám to nechtělo chodit udělejte kopii sešitu jen se simulovanými daty a popisem. Ale data by měla mít stejný formát jako originál. "SortDescriptor" býva prohnaná potvora.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#3 23. 9. 2019 13:21:30

davef6
Člen
Registrace: 21. 11. 2018
Příspěvků: 15

Re: Řazení sloupců - VYŘEŠENO

Díky, funguje to, ale seřadí to pouze ten jeden sloupec a ostatní nechá na místě a pak data nesedí. Potřeboval bych, aby to dělalo to stejné, jako když označím celý sloupec a dám seřadit z-a, vyskočí dialogové okno rozsah řazení a tam je tlačítko rozšířit výběr. Po kliknutí se přehází i celé řádky a i v ostatních listech. Nyní mám toto:

Sub sortingData
	Dim Doc As Object
	Dim Sheet As Object
	Dim oCell As Object
	Dim SortRange As Object
	Dim oSortDesc(1) As New com.sun.star.beans.PropertyValue
	Dim oSortField(0) As New com.sun.star.table.TableSortField
	Doc = ThisComponent
	Sheet = Doc.Sheets(1)
	SortRange = Sheet.getCellRangeByName("F2:F"&GetLastRow(1)+1)
	oSortField(0).Field = 0
	oSortField(0).IsAscending = false
	oSortField(0).FieldType = com.sun.star.table.TableSortFieldType.AUTOMATIC  
	oSortDesc(0).Name = "SortFields"
	oSortDesc(0).Value = oSortField
	oSortDesc(1).Name = "ContainsHeader"
	oSortDesc(1).Value = False
	SortRange.sort(oSortDesc)  
End Sub

Function GetLastRow(ByVal i as integer) 'Čte zadaný list podle pořadí v sešitě = proměnná "i"
Dim x as integer 'x je nyní 0 - tedy první sloupec "A"
oSheet = ThisComponent.getSheets().getByIndex(i)
oTargetCell = oSheet.getCellByPosition(x, 0) 
If IsNull(oTargetCell) then
GetLastRow =oTargetCell.getRangeAddress.EndRow
Else 
oCursor = oSheet.createCursorByRange(oTargetCell) 
oCursor.gotoEnd 
GetLastRow = oCursor.getRangeAddress.EndRow  
End if 
End Function

Offline

#4 23. 9. 2019 17:32:05

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,465

Re: Řazení sloupců - VYŘEŠENO

Celý problém bude v téhle konstrukci :

SortRange = Sheet.getCellRangeByName("F2:F"&GetLastRow(1)+1)

Pravděpodobně se správně, nebo včas nevytvoří textový výraz pro array. Jsou dvě cesty :

     
A) Deklarovat
x as long
x = GetLastRow(1)

SortRange = oSheet.getCellRangeByPosition(0,0,3,x) '(StartCol,StartRow,EndCol,EndRow)

B) Před pole SortRange = Sheet.getCellRangeByName("F2:F"&GetLastRow(1)+1) nastavt

sVar = "F2:F"&GetLastRow(1)+1
print sVar

Když to bude v pohodě:

SortRange = Sheet.getCellRangeByName(sVar)

Editoval neutr (23. 9. 2019 17:35:16)


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#5 24. 9. 2019 07:23:08

davef6
Člen
Registrace: 21. 11. 2018
Příspěvků: 15

Re: Řazení sloupců - VYŘEŠENO

Díky, už mi to funguje, používal jsem to trochu jinak, než bylo potřeba

Offline

Zápatí