Autofilter für 3 Bereiche, ausgabe gleiches Tabellenblatt

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

Moderator: Moderatoren

Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Autofilter für 3 Bereiche, ausgabe gleiches Tabellenblatt

Beitrag von balu »

Hallo liebe Makrospezialisten.

Im Forum habe ich ein Autofilter-Makro von Winfried (komma4) gefunden, welches mir schon gut gefallen könnte.[Gelöst]: Autofilter als Makro
Jedoch schaffe ich es nicht das Makro so umzuschreiben, das ich kein Monstermakro erstelle welches für 3 anstatt nur 1 Bereich zuständig ist. Mit Monstermakro meine ich, das ich diesen Teil des Makros

Code: Alles auswählen

[...]
    oBereichAlleDaten = oDatenSheet.getCellRangeByName( "A1:B50" )
    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 = "*"
    End With
    oFilterBeschreib.setFilterFields( Array( oFilterFeld ) )
    oFilterBeschreib.CopyOutputData = TRUE
    oZielZelle = oDok.Sheets().getByName( "Tabelle1" ).getCellByPosition( 6,0  ) 'Spalte/Zeile
    oFilterBeschreib.OutputPosition = oZielZelle.CellAddress
    oBereichAlleDaten.filter( oFilterBeschreib )
[...]
3 mal schreibe jedoch mit unterschiedlichen Variablenamen, wie z.B. oFilterFeld1, oFilterFeld2, oFilterFeld3, oFilterBeschreib1, oFilterBeschreib2 ....
Okay, das würde wohl funktionieren, aber das ist ja dann wohl nun doch absoluter schw...

Und deshalb hatte ich mir gedacht, das ich das in eine FOR-NEXT-Schleife packe. Aber genau dabei haperts, und ich hab kein Durchblick mehr, leider :?.

Code: Alles auswählen

[...]
	For i = 0 to 3 step 3
    oBereichAlleDaten = oDatenSheet.getCellRangeByPosition( i,0,i+1,49 )	 
    oFilterBeschreib = oBereichAlleDaten.createFilterDescriptor ( TRUE )
    oFilterFeld = createUnoStruct( "com.sun.star.sheet.TableFilterField" )
    With oFilterFeld
    .Field = i
    .Operator = com.sun.star.sheet.FilterOperator.EQUAL
    .StringValue = "*"
    End With
    oFilterBeschreib.setFilterFields( Array( oFilterFeld ) )
    oFilterBeschreib.CopyOutputData = TRUE
    oZielZelle = oDok.Sheets().getByName( "Tabelle1" ).getCellByPosition( i+6,0  )
    oFilterBeschreib.OutputPosition = oZielZelle.CellAddress
    oBereichAlleDaten.filter( oFilterBeschreib )
    next i
[...]
Wenn ich das Makro so starte, dann werden in diesem Beispiel (nur 2 Datenbereiche anstatt 3) wohl die Bereiche gefiltert, jedoch mit einem negativen Effekt.
Im 1. Durchlauf der FOR-NEXT wird das Suchkriterium * mit dem rechts daneben stehendem Text in den richtigen Spalten ausgegeben.

Im 2. Durchlauf der FOR-NEXT werden nur die Einträge aus dem 2. Datenbereich übernommen die auf gleicher Höhe wie das Ergebnis vom 1. Durchlauf stehen, was natürlich total falsch ist. Also habe ich wohl da noch einen logischen Fehler drin, den ich aber nicht seh und versteh.

Ich hatte zwischenzeitlich auch versucht vor aufruf von "next i" einige Variablenamen zu Redimmen (Redim), was natürlich auch nichts brachte.

Meine Fragen an euch lauten nun:
Wo liegt der Fehler in meiner Überlegung?
Wie muss ich das Makro umbauen, das es 3 Datenbereiche Filtert und ordnungsgemäß an den gewünschten Stellen gefiltert ausgibt?
Oder geht das mit diesem Makro gar nicht und ich muss ein anderes nehmen?
Könnt ihr mir behilflich sein?

Habe eine kleine Beispieldatei angehängt.

Freue mich auf eure Antworten, und bedanke mich schon mal für eure Bemühungen :D.


Gruß
balu
Dateianhänge
FilternUndAusgeben-2-Datenbereiche.ods
(22.44 KiB) 53-mal heruntergeladen
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
turtle47
*******
Beiträge: 1849
Registriert: Mi, 04.01.2006 20:10
Wohnort: Rheinbach

Re: Autofilter für 3 Bereiche, ausgabe gleiches Tabellenblat

Beitrag von turtle47 »

Hallo Balu,

lösche mal die Zeile:

Code: Alles auswählen

.Field = i
dann funktioniert auch Deine Variante. :shock:

Ich würde das aber etwas übersichtlicher gestalten:

Code: Alles auswählen

Sub Main
    oDok = ThisComponent
    oDatenSheet = oDok.getSheets().getByName( "Tabelle1" )
	aBereich = array("A1:B50","D1:E50")
	oRow = 0
	for i = 0 to uBound(aBereich)
	oBereichAlleDaten = oDatenSheet.getCellRangeByName(aBereich(i))
    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 = "*"
    End With
    oFilterBeschreib.setFilterFields( Array( oFilterFeld ) )
    oFilterBeschreib.CopyOutputData = TRUE
    oZielZelle = oDok.Sheets().getByName( "Tabelle1" ).getCellByPosition( oRow+6,0  ) 'Spalte/Zeile
    oFilterBeschreib.OutputPosition = oZielZelle.CellAddress
    oBereichAlleDaten.filter( oFilterBeschreib )
    oRow = oRow +3
    next i
End Sub
Das Array kanst Du einfach beliebig ausbauen. :lol:

Liebe Grüße.

Jürgen
Software hat keinen Verstand - benutze deinen eigenen...!

Win 7 SP1/ LibreOffice 3.4.2 OOO340m1 (Build:203) / Firefox 15.0.1 / Notebook ASUS K70IO 64 Bit-Betriebssytem
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: Autofilter für 3 Bereiche, ausgabe gleiches Tabellenblat

Beitrag von Karolus »

Hallo
Der Index hinter :

Code: Alles auswählen

.Field =
ist relativ zum aktuellen Bereich, daher musst du einfach:

Code: Alles auswählen

.Field = 0
reinschreiben.

Gruß Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Autofilter für 3 Bereiche, ausgabe gleiches Tabellenblat

Beitrag von balu »

Hallo Jürgen und Karo,

Damit hatte ich nun überhaupt nicht gerechnet, dass .Field der Übäldäder war. Hatte mich durch Winfrieds Kommentar im Makro in die Irre führen lassen. Und ja, wenn ich in meiner Schleife das .Field weg lasse oder i durch 0 ersetze, dann funktionierts tatsächlich. *freu*

Nun kann ich dank eurer Hilfe und Hinweise das Makro zufriedenstellend aus/umbauen.

Ich danke euch recht Herzlich. :D


Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
Antworten