Filter je Spalte prüfen
#1
Liebe Excelfreaks,

mit folgendem Code prüfe ich je Spalte, ob ein Filter aktiv ist:

Public Function AF_IST_AN(Bereich As Range) As Boolean
With Bereich.Parent
If .AutoFilterMode Then
With .AutoFilter
AF_IST_AN = .Filters(Bereich.Column - .Range.Column + 1).On
End With
End If
End With
End Function
'Diese Funktion wird dann so verwendet: =AF_IST_AN(A$2)

Das funktioniert prima, solange die Filter "von Hand" gesetzt werden. Sobald Makros zum Filtern eingesetzt werden, steht #WERT! in allen Formeln :s ...Excel 2003 kann es, 2010 nicht :s: huh:

Ich hoffe, jemand weiß Rat :17: Eine Musterdatei ist im Anhang.

Viele Grüße
Tom


Angehängte Dateien
.xlsm   TEST AF_IST_AN.xlsm (Größe: 16,77 KB / Downloads: 8)
Top
#2
Hallo,

teste mal:

Code:
Sub Makro1()
   Application.Calculation = xlCalculationManual
    Selection.AutoFilter Field:=3, Criteria1:="2"
   Application.Calculation = xlCalculationAutomatic
End Sub

Wenn Berechnung vorher anders gestellt war, dann kann man den zustand vorher auch in eine Variable einlesen und am Ende den ursprünglichen Zustand wieder herstellen.
Gruß Atilla
Top
#3
Hallo Atilla und @all,

das ist ja interessant, dass UDFs in E2010 nicht so funktionieren wie in E2003,
wenn VBA ins Spiel kommt. Gibt es dafür eine Erklärung bzw. ist das irgendwo dokumentiert?
Oder gibt es in E2010 noch irgendwo anders eine einstellbare Option diesbezüglich?

Gruß Uwe
Top
#4
Hallo Atilla,

danke für die schnelle Antwort :23: Das funzt, aber ich habe eine Monsterdatei mit unendlich vielen Filtercodes :( ...da bin ich ne Weile beschäftigt bei allen Filtern die Codes zu ergänzen. Das wäre ja wirklich eine Verschlechterung gegenüber Excel 2003 :22:

Viele Grüße
Tom

Public Function AF_IST_AN(Bereich As Range) As Boolean
With Bereich.Parent
If .AutoFilterMode Then
With .AutoFilter
AF_IST_AN = .Filters(Bereich.Column - .Range.Column + 1).On
End With
End If
End With
End Function
'Diese Funktion wird dann so verwendet: =AF_IST_AN(A$2)k
Top
#5
Hallo zusammen,

Uwe, Du schreibst:
Zitat:das ist ja interessant, dass UDFs in E2010 nicht so funktionieren wie in E2003

Das kann ich nicht beantworten. Ich glaube aber, dass das nicht generell die UDF's betrifft, sondern die, die mit dem Autofilter zu tun haben.

Ich habe mal eine andere UDF genutzt und die arbeitet völlig normal.

Das Filter mit Makrosteuerung ab 2007 anders laufen, konnte ich schon öfter beobachten.
Vor allem dann, wenn nach Zahlen oder Datum gefiltert wird. Manuell gesetzter Filter funktioniert.
Der gleiche Filter aufgezeichnet und ausgeführt funktioniert dann nicht. Da müsste eigentlich Peter Haserodth doch mal was zu schreiben, oder hat er das schon?

Ich habe es jetzt mit Excel 2007 getestet, jetzt müsste mal jemand mit 2013 testen, ob sich das da auch noch so verhält, wie von Tom beschrieben.

Mit dem Abschalten der Berechnung war einfach ein Schuss ins Blau, und hat funktioniert.
Warum weiß ich auch nicht, denn das Calculate Ereignis wird erst nach Durchlauf der UDF angestoßen.
Also findet zu Beginn gar keine Berechnung statt. Ist schon alles etwas komisch. Aber ich bin noch am rummachen hier, :@ mal sehen, ob ich etwas fundierteres beobachten oder erkennen kann
Gruß Atilla
Top
#6
Hallo Atilla,

danke für Deine Antwort.
Das Thema fing eigentlich hier an. Da hatte ich es leider nicht mit E2010 getestet, weil ich nicht auf die Idee kam, dass es tatsächlich Unterschiede bei den Versionen gibt. Und Peter Haserodt hat sich dazu leider auch nicht geäußert. Wink
Nun stellte Tom hier die Frage noch einmal mit Datei und ich konnte es nachvollziehen.
Entschuldige bitte, dass ich das nicht ernster genommen hatte, Tom. [Bild: sm6.gif]
Großer Mist ist das ja schon, wenn bisher funktionierende VBA-Funktionen ausfallen.
Aber Dank Deiner Lösung geht es ja nun auch in E2010, wenn auch leider mit viel Änderungsarbeit.
Oder gibt es vielleicht doch eine versteckte Einstellung, die das beeinflusst?

Gruß Uwe
Top
#7
Hallo zusammen,

ich habe jetzt etwas rumprobiert und habe noch eine alternative Lösung bzw ein Workaround gefunden.

Code zum Setzen und Aufheben des Filters so:

Code:
Sub Makro1()
   Selection.AutoFilter Field:=3, Criteria1:="2"
   ActiveSheet.Calculate
End Sub

Sub Makro2()
    Selection.AutoFilter Field:=3
    ActiveSheet.Calculate
End Sub

Und in der Function kommt ein neuer Befehl hinzu:

Code:
Public Function AF_IST_AN(Bereich As Range) As Boolean
   Application.Volatile
   With Bereich.Parent
      If .AutoFilterMode Then
         With .AutoFilter
            AF_IST_AN = .Filters(Bereich.Column - .Range.Column + 1).On
         End With
      End If
   End With
End Function

Offensichtlich wird beim Setzen oder Aufheben des Filters die Berechnung vor dem Funktionsaufruf angestoßen und danach wird nicht mehr neu berechnet.

Aber warum es mit dem Ein-und Ausschalten der Berechnung auch funktioniert, habe ich trotzdem nicht verstanden.Huh

@Uwe
Zitat:Peter Haserodt hat sich dazu leider auch nicht geäußert. Wink

Dann stoß ihn mal darauf, dass er sich der Sache mal annimmt. Dann gibt es sicher wieder etwas Spannendes und Witziges zu lesen. Blush
Gruß Atilla
Top
#8
Hallo zusammen,

nur zum Verstehen...
Was macht denn die Funktion und was wird damit bezweckt?

Gruß
Max
Top
#9
Hallo Atilla,

gerade das Application.Volatile würde ich nicht ins Spiel bringen wollen.
Ich werde Peter demnächst mal auf dieses Thema ansprechen. [Bild: sm7.gif]

Gruß Uwe
Top
#10
Hallo Max,

gedacht ist/war diese Funktion eigentlich für die Bedingte Formatierung,
um beim AF die gerade aktiven/gefilterten Spalten hervorzuheben.

Gruß Uwe
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste