Seite 1 von 1
Einfacher Autofilter in CALC
Verfasst: Sa, 14.09.2013 12:06
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?
Re: Einfacher Autofilter in CALC
Verfasst: Sa, 14.09.2013 17:22
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?
Re: Einfacher Autofilter in CALC
Verfasst: So, 15.09.2013 09:06
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.
Re: Einfacher Autofilter in CALC
Verfasst: Mi, 18.09.2013 10:24
von komma4
Prima.
OK, noch der Vollständigkeit halber:
ob ein
AutoFilter gesetzt ist oder nicht, erkennt man an
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)
