Hallo,
bei einer simplen Beispiel-Tabelle, bestehend aus zwei Feldern und einem Kriterium wurde fogendes festgestellt:
Wenn der Befehl mit einer Verweis eine ene einzelne Zelle im Feldnamen gestartet wird, dann funktioniert die Funktion wie gewünscht. Es wird allerdings nur das erste Kriterium zurückgeliefert. Weitere vorhandene Kriterien werden ignoriert.
Die Funktion liefert nur dann ein Ergebnis, wenn die Variable rng auf eine einzelne Zelle verweist. (Im Beispiel entweder auf A1 oder B1)
Getestet mit Excel 2013:
Function FilterKriterien(rng As Range) As String
'Funktion um die Filterkriterien auszulesen
'Gibt an nach welchem Kriterium gefiltert wurde
Dim F As String
Dim flt As Filter
F = ""
'On Error GoTo Finish
With rng.Parent.AutoFilter
If Intersect(rng, .Range) Is Nothing Then GoTo Finish
Set flt = .Filters(rng.Column - .Range.Column + 1)
With .Filters(rng.Column - .Range.Column + 1)
If Not .On Then GoTo Finish
F = .Criteria1
End With
End With
Finish:
FilterKriterien = F
End Function
Sub TESTFilter()
Dim rng As Range
Set rng = ActiveWorkbook.Worksheets(1).Range("A1")
Debug.Print FilterKriterien(rng)
End Sub
Tabelle:
Name |
Zahl |
Feder |
56 |
Kanne |
5 |
Haus |
8 |
Sofa |
4 |
Stuhl |
9 |
Holz |
15 |
Huhn |
40 |
In der ersten Zeile sind Autofilter gesetzt.
Fallsalle Filter ausgelesen werden sollen, kann diese abgeänderte Funktion verwendet werden:
Function FilterKriterien(rngNames As Range) As String
'Funktion um die Filterkriterien auszulesen
'Gibt an nach welchem Kriterium gefiltert wurde
Dim F As String, Fitem As String
Dim flt As Filter
Dim rng As Range
F = ""
'On Error GoTo Finish
For Each rng In rngNames.Cells
With rng.Parent.AutoFilter
If Intersect(rng, .Range) Is Nothing Then GoTo Finish
Set flt = .Filters(rng.Column - .Range.Column + 1)
With .Filters(rng.Column - .Range.Column + 1)
If .On Then
Fitem = rng.Value
Fitem = Fitem & .Criteria1
If flt.Count > 1 Then
Fitem = Fitem & " AND " & .Criteria2
End If
If Not F = "" Then
F = F & IIf(flt.Operator = xlAnd, " AND ", " OR ")
End If
F = F & Fitem
End If
End With
End With
Next
Finish:
FilterKriterien = F
End Function
Sub TESTFilter()
Dim rng As Range
Set rng = ActiveWorkbook.Worksheets(1).Range("A1:B1")
Debug.Print FilterKriterien(rng)
End Sub
In diesem Fall wird Beispielsweise folgende Ausgabe beim Aufruf des Befehls TESTFilter geliefert:
Name=*e* OR Zahl>=5
Hierbei wird vorausgesetzt, dass auch zuvor tatsächlich ein entsprechender Filter gesetzt wurde.
LG, BigBen
|