Autofilter für 3 Bereiche, ausgabe gleiches Tabellenblatt

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Autofilter für 3 Bereiche, ausgabe gleiches Tabellenblatt

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

von balu » Sa, 09.04.2011 13:24

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

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

von Karolus » Sa, 09.04.2011 12:49

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

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

von turtle47 » Sa, 09.04.2011 12:33

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

Autofilter für 3 Bereiche, ausgabe gleiches Tabellenblatt

von balu » Sa, 09.04.2011 11:36

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

Nach oben