Tabela przestawna zakres danych w makro

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

Tabela przestawna zakres danych w makro

Postprzez szlejk » Pn sty 29, 2018 6:24 pm

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   Rozszerz widokZwiń widok
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
szlejk
 
Posty: 9
Dołączył(a): N mar 26, 2017 1:00 pm

Re: Tabela przestawna zakres danych w makro

Postprzez belstar » Pn sty 29, 2018 10:18 pm

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
belstar
 
Posty: 637
Dołączył(a): Cz mar 17, 2011 9:08 am

Re: Tabela przestawna zakres danych w makro

Postprzez szlejk » Cz lut 01, 2018 1:35 pm

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   Rozszerz widokZwiń widok
Sub test()
   GlobalScope.BasicLibraries.LoadLibrary("Tools")
end sub


Pozdrawiam
Libreoffice 6.0.4.2 Windows 10/ Ubuntu 18.04 Libreoffice 6.0.4.2
szlejk
 
Posty: 9
Dołączył(a): N mar 26, 2017 1:00 pm

Re: Tabela przestawna zakres danych w makro

Postprzez belstar » N lut 04, 2018 6:03 pm

Kod: Zaznacz cały   Rozszerz widokZwiń widok
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
belstar
 
Posty: 637
Dołączył(a): Cz mar 17, 2011 9:08 am


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ść