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

Dyskusje dotyczące tworzenia makropoleceń, pisania skryptów oraz programowania przy użyciu UNO

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

Postprzez szlejk » Wt lip 25, 2017 12:09 pm

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) Pobrane 13 razy
Libreoffice 5.20 Windows 10/ Ubuntu 16.04
szlejk
 
Posty: 6
Dołączył(a): N mar 26, 2017 1:00 pm

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

Postprzez belstar » So sie 05, 2017 4:39 pm

szlejk napisał(a):Proszę o wskazówki jak w makro używać filtrów.

Zamiast wskazówek dostajesz gotowe makro.
Kod: Zaznacz cały   Rozszerz widokZwiń widok
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
belstar
 
Posty: 625
Dołączył(a): Cz mar 17, 2011 9:08 am

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

Postprzez szlejk » So sie 19, 2017 3:19 pm

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 5.20 Windows 10/ Ubuntu 16.04
szlejk
 
Posty: 6
Dołączył(a): N mar 26, 2017 1:00 pm


Powrót do Makra i programowanie

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość