[Gelöst]: Autofilter als Makro

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Autofilter als Makro

Beitrag von komma4 »

Uwe,

das Aufzeichnen von Makros in OOo ist meist unvollständig.


Fü�eine Makrolös�g benöti�t zunächs�eine Referenz auf den Bereich(1), Dann wird ein Filter erstellt(2), zuletzt der Filter auf die Daten angewendet(3).

Wenn Du "filtern und kopieren" möchte�, dann ist der Standardfilter in BASIC um zwei Eigenschaften(4) erweiterbar.
Wir befinden uns in einer Calc-Datei mit den Blättern�quot;Tabelle1" (mit den Daten zum Filtern) und "Tabelle3" (Blatt zur Ausgabe, warum nicht Tabelle3).

Code: Alles auswählen

'(1)
' Dokument
oDok = ThisComponent

' Tabellenblatt mit Daten
oDatenSheet = _
 oDok.getSheets().getByName( "Tabelle1" )


' Bereich
oBereichAlleDaten = _
 oDatenSheet.getCellRangeByName( "A1:D12" )


'(2)
' FILTER erstellen
oFilterBeschreib = _
 oBereichAlleDaten.createFilterDescriptor ( TRUE ) 


'
oFilterFeld = _
 createUnoStruct( "com.sun.star.sheet.TableFilterField" )
With oFilterFeld
 .Field = 0 ' Spalte A
 .Operator = com.sun.star.sheet.FilterOperator.EQUAL
 .StringValue = "Treffer"
End With



' Feld auf Filter anwenden
oFilterBeschreib.setFilterFields( Array( oFilterFeld ) ) 



' (4)
' Ausgabebereich des Filters festlegen 
' ========
oFilterBeschreib.CopyOutputData = TRUE


' ----><> Startzelle des Ausgabebereichs
oZielZelle = _
 oDok.Sheets().getByName( "Tabelle3" )._
 getCellByPosition( 2 , 0 ) ' Spalte/Zeile
 
 
' Zieladresse zuweisen
oFilterBeschreib.OutputPosition = _
 oZielZelle.CellAddress




' Filter auf Datenbereich anwenden
oBereichAlleDaten.filter( oFilterBeschreib ) 




Wenn Du in Calc nicht weisst wie gross Dein Datenbereich ist, ermittelt dies bspw. eine solche Funktion
aus: calc_colorRows

Code: Alles auswählen

' ========================================================================
' rein: Sheet als Object 
' raus: Nummer der letzten Zeile/Spalte (bei Null beginnend)
Function getLastUsedColumn(oSheet as Object) as Integer
Dim oCell As Object
Dim oCursor As Object
Dim aAddress As Variant
oCell = oSheet.GetCellbyPosition( 0, 0 )
oCursor = oSheet.createCursorByRange(oCell)
oCursor.GotoEndOfUsedArea(True)
aAddress = oCursor.RangeAddress
GetLastUsedColumn = aAddress.EndColumn
End Function

Function getLastUsedRow(oSheet as Object) as Long
Dim oCell As Object
Dim oCursor As Object
Dim aAddress As Variant
oCell = oSheet.GetCellbyPosition( 0, 0 )
oCursor = oSheet.createCursorByRange(oCell)
oCursor.GotoEndOfUsedArea(True)
aAddress = oCursor.RangeAddress
GetLastUsedRow = aAddress.EndRow
End Function





Vielleicht findest Du das Codebeispiel zum CSV-Import auch hilfreich:
insertCSV2Calc
[quote="insertCSV2Calc"]Einfügen de�Daten einer CSV-Datei in eine Tabelle einer Calc-Datei.
Dokumentation im ODT-Format. Modul leistet als Beispiel den Import gleichartig strukturierter, durch ein Trennzeichen getrennter Daten in eine neue Tabelle einer Calc-Datei. Durch ein mitgeliefertes Hilfsmakro können di�nötigen Fi�eroptionen einfach ermittelt werden.
Code Anpassungen nötig![/quo�]


Hilft Dir das weiter?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)