VBA Autofilter
16.05.2024 07:51:35
Slartibartfast
Der Excel Autofilter macht mir Probleme. Folgendes Problem:
Auf Sheets("Verwaltung") wird vom Benutzer in der Range("MonatFilter") per dropdown-Auswahl ein Monat zwischen "Januar" und "Dezember" ausgewaählt, oder "Alle". Die Auswahl wird wie Folgt verarbeitet:
Dim sh As Worksheet
Private Sub Worksheet_Change(ByVal Target As Range)
Dim MonatFilter As Range
Dim FilterValue As String
If Not Intersect(Target, Sheets("Verwaltung").Range("MonatFilter")) Is Nothing Then
Set MonatFilter = Sheets("Verwaltung").Range("MonatFilter")
FilterValue = MonatFilter.Value
For Each sh In ThisWorkbook.Sheets
If Not IsWorksheetToSkip(sh.Name) Then
If FilterValue > "Alle" Then
ApplyMonthFilter sh, ConvertMonthToNumber(FilterValue)
Else
sh.ListObjects(1).Range.AutoFilter Field:=2
End If
End If
Next sh
End If
End Sub
Private Sub ApplyMonthFilter(ByVal sh As Worksheet, ByVal month As Integer)
sh.ListObjects(1).Range.AutoFilter Field:=2, Criteria1:=">=" & DateSerial(Year(Date), month, 1), _
Operator:=xlAnd, Criteria2:="=" & DateSerial(Year(Date), month + 1, 28)
End Sub
Die verwendeten Funktionen sind so definiert:
Function ConvertMonthToNumber(monthName As String) As Integer
Select Case monthName
Case "Januar"
ConvertMonthToNumber = 1
Case "Februar"
ConvertMonthToNumber = 2
Case "März"
ConvertMonthToNumber = 3
Case "April"
ConvertMonthToNumber = 4
Case "Mai"
ConvertMonthToNumber = 5
Case "Juni"
ConvertMonthToNumber = 6
Case "Juli"
ConvertMonthToNumber = 7
Case "August"
ConvertMonthToNumber = 8
Case "September"
ConvertMonthToNumber = 9
Case "Oktober"
ConvertMonthToNumber = 10
Case "November"
ConvertMonthToNumber = 11
Case "Dezember"
ConvertMonthToNumber = 12
Case Else
MsgBox "Ungültiger Monat ausgewählt!", vbExclamation
End Select
End Function
Function IsWorksheetToSkip(sheetName As String) As Boolean
Dim sheetsToSkip As Variant
sheetsToSkip = Array("Verwaltung")
Dim i As Integer
For i = LBound(sheetsToSkip) To UBound(sheetsToSkip)
If sheetName = sheetsToSkip(i) Then
IsWorksheetToSkip = True
Exit Function
End If
Next i
IsWorksheetToSkip = False
End Function
Der Filter wird korrekt gesetzt. Das mache ich daran aus, dass ich mir den Filter auf den Sheets explizit anschaue. Jedoch wird er nicht korrekt angewandt. Die gefilterten Listen sind leer. Wenn ich dann aber den gesetzten Filter einfach mit "Ok" bestätige, wird der Filter letztlich korrekt angewandt. Meine Vermutung war zunächst, dass es Diskrepanzen zwischen deutscher und englischer (VBA) Formatierung von Datumswerten gibt. Habe dazu verschiedene Formatierungen in VBA ausprobiert wie: CStr(Format(firstDay, "DD.MM.YYYY")). Ohne Erfolg bzw. mit dem selben Ergebniss.
Letztlich sollen alle Listen, nach dem auf Sheets("Verwaltung") in Range("MonatFilter") angegebene Monat und dem Folgemonat, gefiltert werden. Vielleicht hat jemand eine bessere Idee, wie ich das erreichen kann?
Hier die Beispieldatei:
https://www.herber.de/bbs/user/169500.xlsm
Anzeige