openoffice-users-de mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Bernd Obermayr <li...@bobermayr.de>
Subject [SOLVED] Re: Calc Autofilter aktiv?
Date Fri, 12 Jun 2015 09:52:24 GMT
Jörg Schmidt schrieb:
> Hallo, 
>
>> From: Bernd Obermayr [mailto:lists@bobermayr.de] 
>> ich möchte mit Basic feststellen ob in einem Sheet ein Autofilter
>> aktiv ist.
>> Ich habe im Netz gesucht, aber nur Code für die Einrichtung eines
>> Autofilters gefunden oder z.B sowas hier:
>>
>> Thiscomponent.DatabaseRanges.getByName("_autoRange1").AutoFilter
>>
>> Das gibt mir die Antwort, ob überhaupt ein Bereich für einen Filter
>> vorhanden ist. (True)
>>
>> Gibts nicht sowas wie' "oSheet.filtered" :)
> Ich fürchte nein, aber ich bin nicht 100%ig sicher.
>
> Was könnte man tun?
> Z.B. Prüfen ob alle Zeilen sichtbar sind und wenn das der Fall ist annehmen das
> kein Filter aktiv ist.
>
> Möglicherweise könnte man auch mit einem Listener den Filterevent bei der
> Anwendung des Filter detektieren und den Filterzustand dann in einer Variable
> 'aufbewahren'.
Hallo  Jörg,
danke für Deine Mühe. Mir hat das keine Ruhe gelassen.
Bei forum.openoffice.org hab ich dann einen Hinweis gefunden. Zusammen mit Xray
konnte ich dann die Stelle ermitteln:

filters=ubound(Thiscomponent.DatabaseRanges.getByName(Rg).Filterdescriptor.filterfields)

Gibt die Anzahl der Filter (beginnend bei Null) oder -1 wenn kein Filter
definiert ist.

Das ist ja perfekt,  das ist wie "oSheet.filtered" :)

Rg ist eine NamedRange die die Range des Filterbereichs enthält. Zu sehen
unter >Daten>Bereich festlegen.
in filterfields() findet man noch mehr Info über den Filter:
---------8<---------
Connection                com.sun.star.sheet.FilterConnection          0 
enum: com.sun.star.sheet.FilterConnection.AND
Field                     long                                         5  
IsNumeric                 boolean                                  False  
NumericValue              double                                       0  
Operator                  com.sun.star.sheet.FilterOperator            2 
enum: com.sun.star.sheet.FilterOperator.EQUAL
StringValue               string                              "Mobilkom"  
---------8<---------

Schon seit langem verwende ich in Calc (und auch in Excel) folgendes
Man braucht eine Zelle mit einer Spaltensumme z.B summe(a10:A100) und eine
Zelle mit Teilergebnis
z.B: teilergebnis(9;A10:a100)
nun kann man eine Zelle mit Bedingter Formatierung "$A$1 != $A$2"  z.B Rot
einfärben, wenn die beiden Zellen unterschiedliche
Ergebnisse anzeigen.

Das hat sich im Job sehr bewährt, es passiert immer wieder (mir auch) dass
ein aktiver Filter übersehen wird (Die Marker sind so winzig :) )

Fürs Archiv hier noch die Function, die ich jetzt benutze:
Ich habe einen Dialog zur Datenbearbeitung in einem Tabellenblatt, der
funktioniert nur richtig, wenn
kein Filter aktiv ist. Das prüfe ich hiermit:

---------8<---------
'' Wenn ein Autofilter in der NamedRange mit dem Namen 'Rg:string' aktiv ist
'' gibt die Function den Suchbegriff und die Spalte zurück
'' ansonsten -1
'' Parameter:
''    Rg = STRING:DatabaseRange
''    dummy = VARIANT
''        Ist nötig, damit die Function auch in einem Sheet benutzt werden
kann.
"        hier wird eine Zelle angegeben, die automatisch berechnet wird
(z.B: eine Summe)
'' Tip gefunden in
<https://forum.openoffice.org/en/forum/viewtopic.php?t=1049>
''
public Function isFilterActive(Rg$,optional dummy) as string
 dim isfiltered%, filters% ,i%
 dim res$
    isfiltered=-1

    on error resume next
    '' Wenns hier einen Laufzeitfehler gibt, heisst das: Es ist kein Filter
vorhanden oder rg existiert nicht
    '' In dem Fall bleibt isfiltered auf -1
       
filters=ubound(Thiscomponent.DatabaseRanges.getByName(Rg).Filterdescriptor.filterfields)
        'Xray Thiscomponent.DatabaseRanges.getByName(rg).Filterdescriptor
        if filters >= 0 then
            for i% = 0 to filters
           
isfiltered=Thiscomponent.DatabaseRanges.getByName(Rg).Filterdescriptor.filterfields(i).Field

            res = res  &
Thiscomponent.DatabaseRanges.getByName(Rg).Filterdescriptor.filterfields(i).StringValue
& " (" & chr(isfiltered + 65) & ")" & chr(13)
            next i
        end if
    on error goto 0

    if isfiltered >= 0 then
        isFilterActive=res
    else
        isFilterActive=-1
    end if
end function
---------8<---------


-- 
Gruss 
  Bernd


---------------------------------------------------------------------
To unsubscribe, e-mail: users-de-unsubscribe@openoffice.apache.org
For additional commands, e-mail: users-de-help@openoffice.apache.org


Mime
View raw message