Public Sub ModifyFilter(Range As Excel.Range, Optional Field, Optional Value)
Dim vnt As Variant
If IsMissing(Field) Or IsEmpty(Field) Or IsNull(Field) Then
' remove/disable autofilter
Call Range.AutoFilter
ElseIf IsMissing(Value) Or IsEmpty(Value) Or IsNull(Value) Then
' reset field filter
Call Range.AutoFilter(Field)
Else
' modify field filter
On Error Resume Next
With Range.Worksheet.AutoFilter.Filters(Field)
vnt = .Criteria1
If .Operator = xlOr Then vnt = Array(vnt, .Criteria2)
End With
On Error GoTo 0
If Not IsEmpty(vnt) Then
If IsArray(vnt) Then
ReDim Preserve vnt(LBound(vnt) To UBound(vnt) + 1)
vnt(UBound(vnt)) = Value
Else
vnt = Array(vnt, Value)
End If
Else
vnt = Array(Value)
End If
Call Range.AutoFilter(Field, vnt, xlFilterValues)
End If
End Sub
Field gibt den Spaltenindex im AutoFilterbereich an, also diejenige Spalte die gefiltert werden soll. Der Index läuft von 1 bis N, wobei N die maximale Spaltenanzahl des Bereichs darstellt (bei A1:D1 wäre N = 4).
Wenn Field nicht angegeben bzw. ungültig ist, wird der AutoFilter (das heißt für den gesamten Bereich) deaktiviert (derzeit wird er eigentlich ehern umgeschaltet, an -> aus bzw. aus -> an).
Value ist der Wert nach dem gefiltert werden soll. In dieser Funktion werden jedoch die Filtereinstellungen nicht überschrieben, sondern ggf. um den Wert von Value erweitert.
Wenn Value nicht angegeben bzw. ungültig ist, wird der Filter für die angegebene Spalte zurückgesetzt.
Im Else-Abschnitt wird zuerst versucht bereits vorhandene Kriterien zu ermitteln (das können maximal 2 an der Zahl sein). Da die hier gezeigte Variante stark Fehleranfällig ist, werden Fehlermeldung kurzeitig unterdrückt. Wenn midestens Kriterium1 gelesen werden konnte, dann hat vnt einen Wert ungleich Empty (siehe VBA-Hilfe zu IsEmpty und Empty) - mit vnt wird zum Schluss der Filter gesetzt. Ist es Empty, dann wird Value als zu setzender Wert übernommen (hier als Array). Wenn vnt nicht Empty ist, dann mus es in diesem Fall entweder ein Array oder eine Zeichenkette sein. Wenn es ein Array ist, wird dieses um einen Eintrag vergrößert (Preserve sorgt dafür das Daten im Array nicht verworfen werden) und Value an letzter Stelle eingetragen. Wenn es eine Zeichenkette ist, wird aus diese Zeichenkette und dem Value ein Array gebildet (hieraus wird letztendlich eine Filter mit dem Operator xlOr gebildet).
Anhand von Field und vnt wird letztendlich der Filter dann gesetzt.
|