Calc: Makro für AutoFilter

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

Moderator: Moderatoren

HansMaulwurf
*
Beiträge: 10
Registriert: Di, 24.04.2012 10:51

Calc: Makro für AutoFilter

Beitrag von HansMaulwurf »

Hallo :)

ich versuche seit Tagen mit meinem Makro den AutoFilter zu setzen, und zwar so, wie es OOo selber macht, wenn man es im Menü auswählt. Bisher bin ich so weit gekommen, dass es mir die Pfeile anzeigt, jedoch ist das Dropdown-Menü (mit dem man ja dann die Tabelle filtern kann) leer.

Code: Alles auswählen

oRange = oWorkingSheet.getCellRangeByPosition(0, 0, iiSpalten, iiZeilen).getRangeAddress()
 oVorlage.DatabaseRanges.addNewByName( "myRange", oRange )
oVorlage.DatabaseRanges.getByName("myRange").AutoFilter=true
oVorlage.DatabaseRanges.removeByName("myRange")
Hab schon viel mit FilterDescriptor rumgespielt, bin jedoch nicht an den Punkt gekommen, an dem OOo den Filter "einfach automatisch ausfüllt".
Hat einer nen Tipp für mich?

mfg
Hans
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc: Makro für AutoFilter

Beitrag von Stephan »

Hat einer nen Tipp für mich?
Ja, poste einen VOLLSTÄNDIGEN Code wenn Du eine sinnvolle Antwort willst. Woher soll hier im Forum jemand z.B. wissen was sich bei Dir hinter der Objektvariable oVorlage verbirgt?

Jedenfalls funktioniert z.B.:

Code: Alles auswählen

oRange = Thiscomponent.Sheets(0).getCellRangeByPosition(0, 0, 3, 12).getRangeAddress()
Thiscomponent.DatabaseRanges.addNewByName( "myRange", oRange )
Thiscomponent.DatabaseRanges.getByName("myRange").AutoFilter=true
bei mir ohne Probleme.



Gruß
Stephan
HansMaulwurf
*
Beiträge: 10
Registriert: Di, 24.04.2012 10:51

Re: Calc: Makro für AutoFilter

Beitrag von HansMaulwurf »

Code: Alles auswählen

oVorlage = StarDesktop.loadComponentFromURL("private:factory/scalc", "_blank", 0, args())
Das ist oVorlage ;) Nichts besonderes. Also auch nichts anderes als thisComponent bei dir.
Und oWorkingSheet ist einfach nur eine Tabelle, ein Arbeitsblatt, also so wie bei dir thisComponent.Sheets(0).
Und ja, es funktioniert auch, es gibt keinen Fehler. Allerdings sieht das Dropdown-Menü dann "nur" so aus:
autoFilter.jpg
autoFilter.jpg (21.5 KiB) 4995 mal betrachtet
Ich will aber, dass ich dort "12.04.2012" und "13.04.2012" zur Auswahl habe. Irgendwie muss es ja möglich sein, da OOo es ja selber macht, wenn ich über Daten->Filter->Autofilter auswähle. Ich hoffe mich versteht jemand ^^
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc: Makro für AutoFilter

Beitrag von Stephan »

Und ja, es funktioniert auch, es gibt keinen Fehler. Allerdings sieht das Dropdown-Menü dann "nur" so aus:
Zumindest bezeichne ich das Verhalten das nichts in der Filterliste steht als Fehler oder dachtest Du etwa bei mir käme bloß kein Laufzeitfehler? Ja, bei mir stehen Werte in der Liste.

Schade das Du nur eine Screenshoot zur Verfügung stellst statt eine Beispieldatei, denn so muß man wieder mutmaßen statt das man konkrete Auskünfte geben könnte.

Mußmaßlich sind die im Screenshot sichtbaren Datumswerte garkeine Datumswerte sondern Text, mußmaßlich dadurch bedingt das in den entsprechenden Zelleinträgen ein Hochkomma vorangestellt ist. Evtl. hilft notfalls (weil es ja auch direkt gehen muß) die Änderung dieser einträge auf richtige DAtumswerte statt Text.

Leider finde ich auf die Schnelle auch keine Lösung, wobei ich geglaubt hätte es könnte mit .isNumeric von "com.sun.star.sheet.TableFilterField" zu tun haben nur kann ich da keine Abhängigkeit der Listeneintäge feststellen.

Ich kann momentan somit nicht weiterhelfen.


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

Re: Calc: Makro für AutoFilter

Beitrag von balu »

Hallo

@Stephan
Ich habe in OOo 3.2.1 & 3.3.0 deinen Code getestet, und keine Probleme festgestellt. Ja selbst das "Text-Datum" macht keine schwierigkeiten.


@Hans
Bleibt dir nix anderes übrig als wie schon von Stephan angesprochen, eine Beispieldatei anzuhängen.



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
HansMaulwurf
*
Beiträge: 10
Registriert: Di, 24.04.2012 10:51

Re: Calc: Makro für AutoFilter

Beitrag von HansMaulwurf »

Ok, nach noch einer Stunde rumprobieren, lag es letztendlich daran, dass ich nachdem ich den AutoFilter gesetzt habe, den DatenBereich wieder gelöscht habe. Das darf man natürlich nicht tun, wenn man genau diesen Bereich zum Filtern benutzt. Also einfach .DatabaseRanges.removeByName auskommentiert und schon funktioniert alles. Eigentlich logisch, aber manchmal hat man eben ein Brett vorm Kopf ;)
Ich danke euch trotzdem.
Stephan
********
Beiträge: 12368
Registriert: Mi, 30.06.2004 19:36
Wohnort: nahe Berlin

Re: Calc: Makro für AutoFilter

Beitrag von Stephan »

Eigentlich logisch
unlogisch nur wenn man eine richtige LÖsung genannt bekommt, diese augenscheinlich dann selbst so abändert das sie nicht funktioniert und dann hier im Forum nachfragt warum sie nicht funktioniert ohne seine eigene Abänderung zu erwähnen ...



Stephan
TrueColor
******
Beiträge: 547
Registriert: Do, 11.03.2010 11:23

Re: Calc: Makro für AutoFilter

Beitrag von TrueColor »

Hallo,

ich habe mal den alten Thread ausgegraben, da ich das 1:1 umsetzen wollte.
Stephan hat geschrieben:Jedenfalls funktioniert z.B.:

Code: Alles auswählen

oRange = Thiscomponent.Sheets(0).getCellRangeByPosition(0, 0, 3, 12).getRangeAddress()
Thiscomponent.DatabaseRanges.addNewByName( "myRange", oRange )
Thiscomponent.DatabaseRanges.getByName("myRange").AutoFilter=true
bei mir ohne Probleme.
Wurde hier inzwischen was geändert, so dass das nicht mehr fkt.? Oder hab ich beim Übernehmen etwas übersehen? AOO bringt eine RuntimeException, LibO stürtzt ab und geht in die Wiederherstellung.

Es geht um die letzten beiden Subs und die beiden blauen Buttons.

Weiß wer einen Rat?
Danke!
Dateianhänge
test_20140509.ods
(13.34 KiB) 128-mal heruntergeladen
System:
LibO 6 + LibO 7
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Calc: Makro für AutoFilter

Beitrag von F3K Total »

Hi,
du mußt darauf achten, das die Indizes der RangeAddress bei 0 (Null) beginnen.
Dies funzt unter AOO401:

Code: Alles auswählen

sub Autofilter_neu_C2F100
    dim oRange as Object
    oRange = ThisComponent.CurrentController.ActiveSheet.getCellRangeByPosition(2, 1, 5, 99).getRangeAddress()
    Thiscomponent.DatabaseRanges.addNewByName("Range_C2F100", oRange)
    Thiscomponent.DatabaseRanges.getByName("Range_C2F100").AutoFilter = True
end sub
Gruß R
TrueColor
******
Beiträge: 547
Registriert: Do, 11.03.2010 11:23

Re: Calc: Makro für AutoFilter

Beitrag von TrueColor »

F3K Total hat geschrieben:du mußt darauf achten, das die Indizes der RangeAddress bei 0 (Null) beginnen.
Das stimmt, das hatte ich nicht beachtet. Aber das ändert zwar den Bereich, wird jedoch in meiner Testdatei nirgendwo weiterverarbeitet wird, somit passiert da nix. Exception (AOO) und Absturz (LibO) bleiben bestehen.

Hab jetzt noch etwas rumprobiert. Die Lösung ist: zuerst den Autofilter ausschalten und dann die DatabaseRange removen. Dann kann man schön wechseln, genau wie ich's mir vorgestellt hab.

Ich hab aber wohl noch irgendwie ne Leiche drin. Wie kann man eine DatabaseRange removen, ohne dass ich den Namen kenne? Hab da in der API-Doc nichts gefunden.
http://www.openoffice.org/api/docs/comm ... anges.html

Danke!
Dateianhänge
test2.ods
(14.81 KiB) 133-mal heruntergeladen
System:
LibO 6 + LibO 7
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Calc: Makro für AutoFilter

Beitrag von F3K Total »

Hi,
es gibt die Eigenschaft removebyindex nicht.
mit diesem Makro kannst du die Namen zum Index auslesen, und dann entscheiden welchen Bereich du löschen möchtest:

Code: Alles auswählen

Sub Show_Databaseranges
    dim oRanges as Object
    dim i as integer
    dim sRangename as String
    oRanges = Thiscomponent.DatabaseRanges
    for i = 0 to ubound(oRanges.ElementNames)
        sRangename = oRanges.elementNames(i)
        msgbox "Index: " & i & "  -> Name: " & sRangename
    next i
end sub
    
HTH R
TrueColor
******
Beiträge: 547
Registriert: Do, 11.03.2010 11:23

Re: Calc: Makro für AutoFilter

Beitrag von TrueColor »

Das hat mir geholfen. Vielen Dank!
System:
LibO 6 + LibO 7
Antworten