Seite 1 von 1

CALC: Liste mit Formeln per Standardfilter filtern

Verfasst: Do, 14.02.2013 12:32
von balu
Hallo liebe Gemeinde,

ich hab da in Calc eine Liste die per Formeln erstellt wird. Nun möchte ich diese Liste von Leerzellen befreit gefiltert an anderer Stelle ausgeben.

Eigentlich habe ich da ja schon ein funktionierendes Makro dafür erstellt, jedoch gefällt mir meine Lösung noch nicht so richtig. Denn ich gehe dabei folgenden Weg.

Als erstes kopiere ich die Liste hiermit

Code: Alles auswählen

	dim aDatArray()
	aDatArray = oQuelle.getCellRangeByName("A1:A1000").getDataArray
	oQuelle.getCellRangeByName("B1:B1000").setDataArray(aDatArray)
in einen anderen Zellbereich. Dadurch verschwinden schon mal die Formeln.
Und im nächstem Schritt filtere ich die Daten.

Code: Alles auswählen

		oBereichAlleDaten = oQuelle.getCellRangeByName("B1:B1000")
		oFilterBeschreib = oBereichAlleDaten.createFilterDescriptor (True)
		oFilterFeld = createUnoStruct("com.sun.star.sheet.TableFilterField")
		
			With oFilterFeld
				.Operator = com.sun.star.sheet.FilterOperator.NOT_EMPTY
			End With
			
		oFilterBeschreib.setFilterFields(Array(oFilterFeld))
		oFilterBeschreib.CopyOutputData = True
		
		oZielCelle = oCSV.getCellByPosition(20, iLetzteZelle + iCellIDX)
		oFilterBeschreib.OutputPosition = oZielCelle.CellAddress
		oBereichAlleDaten.filter(oFilterBeschreib)
Beide zitierte Codes sind auf das wesentliche reduziert, und wie schon erwähnt funktioniert das auch alles.

Ich frage mich jetzt nur ob sich das nicht vielleicht doch ein wenig vereinfachen lässt, also ohne den zwischenschritt die Daten zu kopieren?

Ich denke mir das vielleicht noch irgendwo im eigentlichem Filter-Abschnitt noch etwas eingetragen werden kann, dass die Formeln irgendwie nicht berücksichtigt werden. Aber in der deutschen Übersetzung von Andrew Pitonyak find ich momentan keinen Weg dazu, oder übersehe ich da was?

Oder kann ich meine Methode durchaus so lassen, da ein Ausbau des Filter-Abschnitt zu Umfangreich werden kann?

Ach ja!
Natürlich habe ich auch hier die SuFu benutzt, aber noch nicht das passende gefunden. Falls ich nicht wieder zu Blind war.


Ich freu mich auf eure Antworten :).



Gruß
balu

Re: CALC: Liste mit Formeln per Standardfilter filtern

Verfasst: Do, 14.02.2013 12:46
von Stephan
Ich frage mich jetzt nur ob sich das nicht vielleicht doch ein wenig vereinfachen lässt, also ohne den zwischenschritt die Daten zu kopieren?
Du hast es doch bereits hingeschrieben:

Code: Alles auswählen

oFilterBeschreib.OutputPosition = oZielCelle.CellAddress
Ohne es geprüft zu haben ist doch das der Bereich (die linke obere Zelle des Bereichs) wohin die gefilterten Daten ausgeben werden, womit dann ein Ändern der Zeile:

Code: Alles auswählen

oBereichAlleDaten = oQuelle.getCellRangeByName("B1:B1000")
zu:

Code: Alles auswählen

oBereichAlleDaten = oQuelle.getCellRangeByName("A1:A1000")

genügen sollte.



Gruß
Stephan

Re: CALC: Liste mit Formeln per Standardfilter filtern

Verfasst: Do, 14.02.2013 16:16
von balu
Hallo Stephan,

Danke für deine Antwort. Jedoch habe ich mich anscheind nicht deutlich genung ausgedrückt, sorry dafür, und folglich hilft mir dein Vorschlag nicht wirklich.

Also noch mal etwas deutlicher.
Bei einer Liste, die z.B. durch folgende Formel

Code: Alles auswählen

=WENN(X1<>"";X1;"")
erstellt wird, funktioniert der Filter-Code nicht wie gewünscht, da die Zellen samt Formeln 'übertragen' werden. Es muss also erst eine Formelfreie Liste durch kopieren und unformatierten Text einfügen erstellt werden, die man dann erst anschließend filtern kann. Und genau so gehe ich ja auch im Makro vor. Nur möchte ich jetzt wissen ob man meinen Filter-Code so umbauen/ergänzen kann, das ohne Kopieren und einfügen die Formeln nicht berücksichtigt werden und ein direktes filtern möglich ist? Oder muss man so vorgehen wie ich es bis jetzt mache?

Ich hoffe es ist jetzt verständlicher.



Gruß
balu

Re: CALC: Liste mit Formeln per Standardfilter filtern

Verfasst: Do, 14.02.2013 20:22
von Stephan
Augenscheinlich geht das mit einem Standardfilter nicht, es sollte aber mit einem Spezialfilter gehen, leider muß ich zunächst passen was den dafür nötigen Code betrifft.

Raten würde ich Dir in Deiner Datei zunächst einmal händisch zu prüfen ob Du einen entsprechenden Spezialfilter einrichten kannst, das hätte den Vorteil dann zu wissen das es überhaupt geht. Wenn das der Fall ist sollte es eigentlich auch mit Code gehen und man muß dann nochmal darüber nachdenken.


Andererseits verstehe ich aber auch nicht so ganz was bei einer Formel =WENN(X1<>"";X1;"") nicht mit Standardfilter gehen könnte, denn das Ergebnis ist doch immer entweder Zahl oder Text.?


Gruß
Stephan

Re: CALC: Liste mit Formeln per Standardfilter filtern

Verfasst: Do, 14.02.2013 23:06
von balu
Hallo Stephan,

ich rauf mir noch aus lauter Verzweiflung hier die Haare ausm Koppe. Wetter geht mir tierisch aufm S..., und unsere Zentralheizung ist nur noch ein Schatten seiner selbst, und das bei dem Wetter, grrrrr-brrr! So, den Frust musste ich erstmal Los werden.

Augenscheinlich geht das mit einem Standardfilter nicht, es sollte aber mit einem Spezialfilter gehen, leider muß ich zunächst passen was den dafür nötigen Code betrifft.
Da hatte ich heute Mittag auch schon mal kurz reingeschaut, genauer gesagt in das dementsprechende Dialogfenster. Aber auch nur ein Blick, und schon war ich wieder raus. Ich hatte mir da wohl zu dem Zeitpunkt etwas erhofft zu sehen, was es nicht zu sehen gibt. Irgendwas in der Richtung von "Formeln abwählen", oder so ähnliches. Aber das Dialogfenster zeigt ja auch nicht die ganze Wahrheit, denn egal ob beim Standardfilter oder beim Spezialfilter kann man per Makro nicht nur Spalten, sondern auch Zeilen filtern, was nirgend im Fenster zu sehen ist.

Raten würde ich Dir in Deiner Datei zunächst einmal händisch zu prüfen ob Du einen entsprechenden Spezialfilter einrichten kannst, das hätte den Vorteil dann zu wissen das es überhaupt geht. Wenn das der Fall ist sollte es eigentlich auch mit Code gehen und man muß dann nochmal darüber nachdenken.
Ja, das werd ich mal testen. Auch wenn ich mir ziemlich sicher bin das es mir nicht helfen wird. Außer, das ich allgemein was über den Spezialfilter lernen kann, da ich noch nie mit ihm gearbeitet habe.

Andererseits verstehe ich aber auch nicht so ganz was bei einer Formel =WENN(X1<>"";X1;"") nicht mit Standardfilter gehen könnte, denn das Ergebnis ist doch immer entweder Zahl oder Text.?
Ich weiß jetzt nicht ob ich aus lauter Frust mich noch immer nicht richtig ausgedrückt habe, oder ob Du etwas nicht richtig verstehst. Denn wenn in der Spalte X irgendwelche Daten stehen (oder nicht), egal ob Text oder Werte, und die Spalte A mit der zitierten Formel gefiltert werden soll, dann geht das nicht. Zumindest wenn man bei Filterkriterien die Einstellung bei Wert auf "nicht leer" setzt. Viele Möglichkeiten gibt es jas nicht bei Wert.

Du hast mich da wohl auf eine Idee gebracht, die ich auch schon in der deutschen Übersetzung von Andrew Pitonyak gelesen hatte, die aber leider nicht wie erhofft funktioniert. Die Rede ist von IsNumeric. Hier mal der angepasste Code

Code: Alles auswählen

          oBereichAlleDaten = oQuelle.getCellRangeByName("B1:B1000")
          oFilterBeschreib = oBereichAlleDaten.createFilterDescriptor (True)
          oFilterFeld = createUnoStruct("com.sun.star.sheet.TableFilterField")
          
             With oFilterFeld
                .Operator = com.sun.star.sheet.FilterOperator.NOT_EMPTY
			     .IsNumeric = False ' <= hinzugekommen
			     .StringValue = ".*"  ' <= hinzugekommen
             End With
             
          oFilterBeschreib.setFilterFields(Array(oFilterFeld))
          oFilterBeschreib.CopyOutputData = True
     	   oFilterBeschreib.UseRegularExpressions = True ' <= hinzugekommen
          
          oZielCelle = oCSV.getCellByPosition(20, iLetzteZelle + iCellIDX)
          oFilterBeschreib.OutputPosition = oZielCelle.CellAddress
          oBereichAlleDaten.filter(oFilterBeschreib)
Ich weiß jetzt aber noch nicht ob ich vielleicht die Reihenfolge im Code irgendwie ändern muss, denn das habe ich noch nicht getestet.


Wie auch immer. Für heute ist Feierabend.



Gruß
balu

Re: CALC: Liste mit Formeln per Standardfilter filtern

Verfasst: Fr, 15.02.2013 09:27
von Stephan
Ich weiß jetzt nicht ob ich aus lauter Frust mich noch immer nicht richtig ausgedrückt habe, oder ob Du etwas nicht richtig verstehst.


doch, schon.
Denn wenn in der Spalte X irgendwelche Daten stehen (oder nicht), egal ob Text oder Werte, und die Spalte A mit der zitierten Formel gefiltert werden soll, dann geht das nicht.
Und die Frage ist ob das überhaupt nötig ist.
Es ist doch ein Unterschied ob Du prüfen mußt ob etwas Leer ist oder ob nur keine Zahl und kein Buchstabe drinsteht, denn der Standardfilter lässt reguläre Ausdrücke zu.

Man kann das Problem auch noch anders angehen indem man schreibt:

Code: Alles auswählen

=WENN(X1<>"";X1;" ")
denn nun ist aus dem 'Leer-Fall' ein klarer " "-Fall geworden und der lässt sich im Filter mit dem regulären Ausdruck "[:space:]?" erkennen.

Diese Lösung ist dann schlecht, wenn Du etwas lernen wolltest, diese Lösung wäre hingegen funktional ausreichend wenn es Dir nur um irgendeine Lösung geht denn auch falls die Zellinhalte irgendwo im Tabellenblatt weiterverarbeitet werden lässt sich ja das " " per Formel entfernen.



Gruß
Stephan

Re: CALC: Liste mit Formeln per Standardfilter filtern

Verfasst: Fr, 15.02.2013 12:49
von balu
Hallo Stephan,

verzeih, aber ich glaube wir verstehen uns nicht richtig.

Ich hatte nur als BEISPIEL eine Formel genannt, die zeigen sollte das die zu filternden Daten in der betroffenen Spalte auf dem Ergebnis einer Formel beruhen. Sprich, sie sind nicht von Hand eingetragen worden, oder aber z.B. als unformatierter Text eingefügt worden. Was das für eine Formel ist, spielt absolut keine Rolle. Du jedoch versteifst dich momentan voll auf die Formel, was aber Falsch ist da es nicht um die Formel als solches geht.

Es ist doch folgender Fakt: das mann eine Liste, deren sichtbaren Ergebnis durch Formeln erstellt wurde, eben nicht mit dem Standardfilter filtern und an einem anderen Ort ausgeben kann, da die Formeln automatisch mit an den anderen Ort kopiert/übertragen werden. Es werden folglich nicht die sichtbaren Ergebnisse gefiltert, sondern lediglich die Formeln kopiert.

denn nun ist aus dem 'Leer-Fall' ein klarer " "-Fall geworden und der lässt sich im Filter mit dem regulären Ausdruck "[:space:]?" erkennen.
Tja, schön wärs ja. Aber dem ist bis jetzt bei mir nicht der Fall, trotz verschiedener Versuche. Denn egal was ich auch für Einstellungen im Dialogfenster für den Standardfilter vornehme, ja auch mit dem regulären Ausdruck "[:space:]?", es werden immer die Formeln kopiert. Und was folgt daraus? Die Zellbezüge der Formeln ändern sich, und es wird dann dementsprechend nichts mehr angezeigt da die Zellbezüge auf leere Zellen verweisen.


Ich würd wohl sagen, dass mein Weg den ich momentan gehe der Richtige ist. Also erst die Liste kopieren und dadurch die Formeln elemenieren, um anschließend zu Filtern.



Gruß
balu