Einfacher Autofilter in CALC

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

Moderator: Moderatoren

CalcWeiss
**
Beiträge: 32
Registriert: Sa, 17.08.2013 13:26

Einfacher Autofilter in CALC

Beitrag von CalcWeiss »

Ich habe ein Problem beim Autofilter, also den kleinen Dreiecken, mit denen man Zeilen filtern und ausblenden kann. Diese Filter lassen sich über Data-Filter-Autofilter ein/ausschalten. Diese Filter sollen bei "A1:L1" angezeigt werden und ich habe folgendes Makro dazu geschrieben:

Code: Alles auswählen

sub SetAutoFilter
	dim odoc
	dim oDispatcher
	dim args(0) as new com.sun.star.beans.PropertyValue

	oDoc   = ThisComponent.CurrentController
	oDispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
	
	args(0).Name = "ToPoint"
	args(0).Value = "A1:L65536"
	oDispatcher.executeDispatch(oDoc, ".uno:DataFilterAutoFilter", "", 0, args())
end sub
Das Makro funktioniert, allerdings schaltet es beim zweiten Aufruf die Autofilter wieder ab und beim dritten wieder an. Mir fehlt ein Indiz, ob die Autofilter bereits aktiv sind oder nicht. Bei Excel ging das Abschalten mit "ActiveSheet.AutoFilterMode = False" und damit hatte ich einen definierten Startpunkt. Wie gehe ich hier am besten vor?
Win-XP32, LO4.1.1.2 (en)
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Einfacher Autofilter in CALC

Beitrag von komma4 »

CalcWeiss hat geschrieben:ich habe folgendes Makro dazu geschrieben
Naja... Du hast es aufgezeichnet und verändert
CalcWeiss hat geschrieben:Mir fehlt ein Indiz, ob die Autofilter bereits aktiv sind oder nicht
Beim Filter selbst gibt es keine Eigenschaft, die abgefragt werden könnte - der Autofilter ist immer vorhanden, auch wenn er noch nie eingesetzt wurde bzw. nicht angezeigt wird.

Work-Around (wenn es sich nur um das eine Blatt handelt):
setze eine globale Variable, die -falls gesetzt- Deine Routine direkt verlässt.

Setze die globale Variable zurück, wenn der Autofilter rausgenommen wird.
Dieses machst Du dann über ein anderes Makro, nicht über das Menü.

Code: Alles auswählen

GLOBAL myFilterGesetzt AS BOOLEAN


SUB resetFilter
' Vorlage DFrench http://www.oooforum.org/forum/viewtopic.phtml?t=5096
' 
' Name des aktuellen Blatts
oCurrentController = ThisComponent.getCurrentController()
oAktivesBlatt = oCurrentController.getActiveSheet()
sBlattName = oAktivesBlatt.getName()
' anpassen!
oBereich = oAktivesBlatt.getCellRangeByPosition( 0, 0, 6, 60000 )

 ' the filter rules are set up in this 
oFilterDesc = oBereich.createFilterDescriptor( TRUE )
' set the filter description up 
oFilterDesc.setFilterFields( Array() ) 'set the filter rules by assigning the array of fields 
oBereich.filter( oFilterDesc )  'do the filter operation 

myFilterGESETZT = FALSE


Hilft 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)
CalcWeiss
**
Beiträge: 32
Registriert: Sa, 17.08.2013 13:26

Re: Einfacher Autofilter in CALC

Beitrag von CalcWeiss »

Das hat sehr geholfen. Ich habe jetzt einige Codesnippets eingebaut und das Ganze soweit es geht vereinfacht. Übrig geblieben ist:

Code: Alles auswählen

Sub SetAutoFilter
	Dim odoc, osheet
	Dim oFilter
	Dim args(0) as new com.sun.star.beans.PropertyValue

	oDoc = ThisComponent.CurrentController
	oSheet = oDoc.activeSheet
	
	oFilter = oSheet.createFilterDescriptor(True)
	oSheet.filter(oFilter)
	
	oFilter = createUnoService("com.sun.star.frame.DispatchHelper")
	args(0).Name = "ToPoint"
	args(0).Value = "A1:L65536"
	oFilter.executeDispatch(oDoc, ".uno:GoToCell", "", 0, args())
	oFilter.executeDispatch(oDoc, ".uno:DataFilterAutoFilter", "", 0, args())
	
	oDoc.Select(oSheet.getCellRangeByName("A2"))
End Sub
Zuerst wird der alte Filter gelöscht (unabhängig, ob ein Filter existiert) und danach mein neuer generiert. Die letzte Zeile dient lediglich dazu, den Cursor auf eine definierte Position zu setzen.
Win-XP32, LO4.1.1.2 (en)
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Einfacher Autofilter in CALC

Beitrag von komma4 »

Prima.

OK, noch der Vollständigkeit halber:

ob ein AutoFilter gesetzt ist oder nicht, erkennt man an

Code: Alles auswählen

ThisComponent.DatabaseRanges( 0 ).AutoFilter 
Anmerkung: pro Dokument gibt es nur einen AutoFilter, der heisst dann immer "unbenannt" [in einer deutschen OOo Version] mit Index 0 der DataBaseRanges

Und.. natürlich hat auch Andrew eine Antwort

Code: Alles auswählen

Sub AddNewDatabaseRange() 
  Dim oRange    ' The DatabaseRange object. 
  Dim oAddr     ' The cell address range for the database range. 
  Dim oSheet    ' The first sheet, which will contain the range. 
  Dim oDoc      ' Reference ThisComponent with a shorter name. 
  oDoc = ThisComponent 
  If NOT oDoc.DatabaseRanges.hasByName("MyName") Then 
    oSheet = ThisComponent.getSheets().getByIndex(0) 
    oAddr = oSheet.getCellRangeByName("A1:F10").getRangeAddress() 
    oDoc.DatabaseRanges.addNewByName("MyName", oAddr) 
  End If 
  oRange = oDoc.DatabaseRanges.getByName("MyName") 
  oRange.AutoFilter = True 
End Sub
Quelle: http://www.oooforum.org/forum/viewtopic.phtml?t=22153


Für diejenigen, die mal die Suchfunktion benutzen (Gruss an Google-Bot) 8)
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)
Antworten