Tabela przestawna jak użyć filtrów 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 jak użyć filtrów w makro

Post autor: szlejk »

Witam
Proszę o wskazówki jak w makro używać filtrów. Po wykonywaniu makra jest możliwość filtrowania ręcznie, a czy jest możliwe by makro wykonało to za użytkownika?
W załączniku screen i plik z makrem.
Załączniki
Zrzut ekranu z 2017-07-25 12-01-49.png
Test.ods
(18.03 KiB) Pobrany 184 razy
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 jak użyć filtrów w makro

Post autor: belstar »

szlejk pisze:Proszę o wskazówki jak w makro używać filtrów.
Zamiast wskazówek dostajesz gotowe makro.

Kod: Zaznacz cały

Sub Tabela_Terminy
	Dim FileProperties(1) As New com.sun.star.beans.PropertyValue
	Dim FilterFields(2) as New com.sun.star.sheet.TableFilterField
	Dim Doc As Object
	Dim Sheet As Object
	Dim Row As Object
	Dim Col As Object
	Dim Col2 As Object
	Dim I As Integer
	
	Const SColumns = "A,B,E,G,H,I,J,K" 'ascending
	
	ThisComponent.Sheets(0).Rows.removeByIndex(wiersz, 1)
	aColumns = Split(SColumns,",")
	oSheet = ThisComponent.CurrentController.ActiveSheet
	for i = uBound(aColumns) to 0 step -1
		oColumn = oSheet.Columns.getbyname(aColumns(i))
		oColumn.Columns.removebyindex(0,1)
	next i
	
	doc = ThisComponent
	sheetName1 = "Tabela"
	If doc.Sheets.hasByName(sheetName1) THEN
	   doc.Sheets.removeByName(sheetName1)
	END If
	doc.Sheets().insertNewByName(sheetName1, 1)
	
	
	datasheet = doc.Sheets.getByName("Arkusz1")
	sheet1 = doc.Sheets.getByName("Tabela")
	oController = doc.CurrentController
	oController.setActiveSheet(datasheet)
	
	oSheetObj = oController.ActiveSheet
	DataCellRange = osheetObj.getCellRangeByName("A1:G12")
	RangeAddress = DataCellRange.RangeAddress
	oController.setActiveSheet(sheet1)
	oSheetObj = oController.ActiveSheet
	Tables = oSheetObj.DataPilotTables()
	Descriptor = Tables.createDataPilotDescriptor()
	Descriptor.ShowFilterButton = True
	Descriptor.DrillDownOnDoubleClick = True
	Descriptor.setSourceRange(RangeAddress)
	Fields = Descriptor.getDataPilotFields            
	
	Field1 = Fields.getByIndex(2)
	Field1.Orientation = com.sun.star.sheet.DataPilotFieldOrientation.ROW
	
	Field2 = Fields.getByIndex(0)
	Field2.Orientation = com.sun.star.sheet.DataPilotFieldOrientation.ROW
	
	Field3 = Fields.getByIndex(1)
	Field3.Orientation = com.sun.star.sheet.DataPilotFieldOrientation.ROW
	'Field3.Function = com.sun.star.sheet.GeneralFunction.SUM
	
	Field4 = Fields.getByIndex(4)
	Field4.Orientation = com.sun.star.sheet.DataPilotFieldOrientation.PAGE
	'Field4.Function = com.sun.star.sheet.GeneralFunction.SUM
	
	Field5 = Fields.getByIndex(3)
	Field5.Orientation = com.sun.star.sheet.DataPilotFieldOrientation.DATA
	Field5.Function = com.sun.star.sheet.GeneralFunction.SUM
	
	Field6 = Fields.getByIndex(5)
	Field6.Orientation = com.sun.star.sheet.DataPilotFieldOrientation.PAGE
	
	Field7 = Fields.getByIndex(6)
	Field7.Orientation = com.sun.star.sheet.DataPilotFieldOrientation.PAGE
	
	Descriptor.RowGrand = "true"
	Cell = oSheetObj.getCellrangeByName("A2")
	Tables.insertNewByName("NewDataPilot", Cell.CellAddress, Descriptor)
	
	Table = Tables.getByName("NewDataPilot")
	Descriptor = Table.getFilterDescriptor
	FilterFields(0).Field = 3
	FilterFields(0).Operator = com.sun.star.sheet.FilterOperator.NOT_EQUAL
	FilterFields(0).IsNumeric = True
	FilterFields(0).NumericValue = 99
	
	FilterFields(1).Field = 3
	FilterFields(1).Operator = com.sun.star.sheet.FilterOperator.NOT_EQUAL
	FilterFields(1).IsNumeric = True
	FilterFields(1).NumericValue = 109
	FilterFields(1).Connection = com.sun.star.sheet.FilterConnection.AND
	
	FilterFields(2).Field = 3
	FilterFields(2).Operator = com.sun.star.sheet.FilterOperator.NOT_EQUAL
	FilterFields(2).IsNumeric = True
	FilterFields(2).NumericValue = 119
	FilterFields(2).Connection = com.sun.star.sheet.FilterConnection.AND
	
	Descriptor.FilterFields = FilterFields
	 
	Col2 = sheet1.Columns(4)
	Col2.Width = (10)
	 
	For I = 0 To 3
		Col = sheet1.Columns(I)
		Col.OptimalWidth = true
	Next I
	 
	Row = sheet1.Rows()
	Row.OptimalHeight = true
	sheet1.isTextWrapped = true
 
 
End Sub
Wskazówkę dostaniesz dotyczącą optymalizacji makra. W kilku miejscach aktywujesz arkusze po to żeby pobrać dane, które możesz wyciągnąć bez tej czynności, ewentualnie na końcu makra to wstawić żeby aktywować arkusz z tabelą. Zyska na tym szybkość wykonywania makra.

Pytanie do admina.
Dlaczego ten wątek nie pojawił się w aktywnych? Osobiście uważam że każdy temat powinien się tam pojawiać, zwiększając możliwości udzielenia pomocy.
LibreOffice 5.1.2.2 Ubuntu 16 LTS
szlejk
Posty: 12
Rejestracja: ndz mar 26, 2017 1:00 pm

Re: Tabela przestawna jak użyć filtrów w makro

Post autor: szlejk »

W kilku miejscach aktywujesz arkusze po to żeby pobrać dane, które możesz wyciągnąć bez tej czynności, ewentualnie na końcu makra to wstawić żeby aktywować arkusz z tabelą. Zyska na tym szybkość wykonywania makra.
Dziękuję bardzo za pomoc. Makro jest zbieraniną kilku makr które połączyłem ze sobą, i wiem że nie udolnie. Moja wiedza jest znikoma i tu prośba o wskazówki co do poprawienia efektywności makra.

Pozdrawiam i dziękuje
Libreoffice 6.0.4.2 Windows 10/ Ubuntu 18.04 Libreoffice 6.0.4.2
ODPOWIEDZ