Tabela przestawna zakres danych w makro

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO
szlejk
Posty: 12
Rejestracja: ndz mar 26, 2017 1:00 pm

Tabela przestawna zakres danych w makro

Post autor: szlejk »

Witam,
Tworząc tabelę przestawną ręcznie zakres tabeli ustawia się automatycznie, jak to osiągnąć w Basic?
Obecnie zakres jest określany za pomocą

Kod: Zaznacz cały

getCellRangeByName("A1:N200")
Niestety często dane do tabeli mają zmienny zakres.

Pozdrawiam i dziękuję
Libreoffice 6.0.4.2 Windows 10/ Ubuntu 18.04 Libreoffice 6.0.4.2
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Tabela przestawna zakres danych w makro

Post autor: belstar »

Możliwości masz sporo, ja podpowiem tylko trzy.
1. Nazwany zakres danych, zmieniający się dynamicznie.
2. W bibliotece Tools jest funkcja GetLastUsedRow, wykorzystaj ją
3. Użyj funkcji arkuszowych (np. ILE.NIEPUSTYCH), i na tej podstawie pobierz adres zakresu.
LibreOffice 5.1.2.2 Ubuntu 16 LTS
szlejk
Posty: 12
Rejestracja: ndz mar 26, 2017 1:00 pm

Re: Tabela przestawna zakres danych w makro

Post autor: szlejk »

Dziękuje za wskazówki, zainteresowała mnie opcja druga tylko jak tego użyć z GetLastUsedRow.
proszę o jakiś przykład

Kod: Zaznacz cały

Sub test()
	GlobalScope.BasicLibraries.LoadLibrary("Tools")
end sub

Pozdrawiam
Libreoffice 6.0.4.2 Windows 10/ Ubuntu 18.04 Libreoffice 6.0.4.2
belstar
Posty: 654
Rejestracja: czw mar 17, 2011 9:08 am

Re: Tabela przestawna zakres danych w makro

Post autor: belstar »

Kod: Zaznacz cały

Sub DataPilotTable
	Dim oSheet
	Dim oRange
	Dim oRangeAddress
	Dim oTables
	Dim oTDescriptor
	Dim oAllFields
	Dim oField
	Dim oCellAddress as new com.sun.star.table.CellAddress
	Dim ile
	'Sprawdzenie czy biblioteka jest załadowana
	If (Not GlobalScope.BasicLibraries.isLibraryLoaded("Tools")) Then
	'Wynik negatywny załaduj bibliotekę
		GlobalScope.BasicLibraries.LoadLibrary("Tools")
	End If

		Arkusze = ThisComponent.Sheets
	'Czy arkusz istnieje
	'W tym przykładzie dane źródłowe są w arkuszu o nazwi "Dane"
		If NOT Arkusze.hasByName("Dane") then
			Arkusze.insertNewByName("Dane", Arkusze.getCount())	
		End If
		oSheet = ThisComponent.Sheets.getByName("Dane")
	'Wykorzystanie funkcji z biblioteki Tools, wykorzystamy zmienną "ile"
		'ile = GetLastUsedRow(oSheet)
		'oRange = oSheet.getCellRangeByName("A1:N" & Ile + 1)
	'Tu to samo bez dodatkowej zmiennej, można jej deklaracje usunąć - "Dim ile"
		oRange = oSheet.getCellRangeByName("A1:N" & GetLastUsedRow(oSheet) + 1)
		
		oRangeAddress = oRange.getRangeAddress()
		oCellAddress.Sheet = oRangeAddress.Sheet
		oCellAddress.Column = oRangeAddress.StartColumn
		oCellAddress.Row = oRangeAddress.EndRow + 2
			
		
		oTables = oSheet.getDataPilotTables()
	' Krok1	Utworzenie descriptora
		oTDescriptor = oTables.createDataPilotDescriptor()
	' Krok2 Dane źródłowe
		oTdescriptor.setSourceRange(oRangeAddress)
	' Krok3 ustawienie pól
		oAllFields = oTDescriptor.getDataPilotFields()
	'Zdefiniuj kolumny
		oField = oAllFields.getByIndex(0)
		oField.Orientation = com.sun.star.sheet.DataPilotFieldOrientation.ROW

		oField = oAllFields.getByIndex(1)
		oField.Orientation = com.sun.star.sheet.DataPilotFieldOrientation.COLUMN

		oField = oAllFields.getByIndex(3)
		oField.Orientation = com.sun.star.sheet.DataPilotFieldOrientation.DATA
		oField.Function = com.sun.star.sheet.GeneralFunction.SUM
	'Wstaw tabelę przestawną
		oTables.insertNewByName("DataPilot", oCellAddress, oTDescriptor)		
End Sub
LibreOffice 5.1.2.2 Ubuntu 16 LTS
szlejk
Posty: 12
Rejestracja: ndz mar 26, 2017 1:00 pm

Re: Tabela przestawna zakres danych w makro

Post autor: szlejk »

Przepraszam że tak późno, dziękuję za wskazówki i proszę o pomoc. Kod wyświetla mi błąd w załączniku.
Załączniki
Zrzut ekranu z 2019-04-18 16-58-47.png
Libreoffice 6.0.4.2 Windows 10/ Ubuntu 18.04 Libreoffice 6.0.4.2
ODPOWIEDZ