Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA Autofilter

VBA Autofilter
16.05.2024 07:51:35
Slartibartfast
Hallo liebe Community,

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

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Autofilter
16.05.2024 08:33:17
Kuwer
Hallo,

Private Sub ApplyMonthFilter(ByVal sh As Worksheet, ByVal month As Integer)


sh.ListObjects(1).Range.AutoFilter Field:=2, Criteria1:=">=" & CDbl(DateSerial(Year(Date), month, 1)), _
Operator:=xlAnd, Criteria2:="" & CDbl(DateSerial(Year(Date), month + 1, 1))
End Sub


Gruß, Uwe
Anzeige
AW: VBA Autofilter
20.05.2024 19:47:10
Oppawinni
Deine Umsetzung des Monats könnte vielleicht auch etwas kürzer ausfallen ?
Etwa so:


Function ConvertMonthToNumber(monthName As String) As Integer
Const m = ";januar;februar;märz;april;mai;juni;juli;august;september;oktober;november;dezember;jan;feb;mär;apr;jun;jul;aug;sep;okt;nov;dez;"
If InStr(m, ";" & LCase(monthName) & ";") > 0 Then
ConvertMonthToNumber = Month(CDate("1 " & monthName))
Else
MsgBox "Ungültiger Monat ausgewählt!", vbExclamation
ConvertMonthToNumber = 0
End If
End Function

ohne Fehlerprüfung bräuchte es die ganze Funktion nicht, da würde es
.. = Month(CDate("1 " & monthName))
tun
Anzeige
AW: VBA Autofilter
21.05.2024 10:51:17
daniel
Hi
hier mal eine (bzw zwei) Varianten.
deine zusätzlichen Hilfsfunktionen (Convert..., IsWorksheetToSkip) werden nicht benötigt, da sich das ganze einfacher darstellen lässt:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim MonatFilter As Range
Dim FilterValue As Long

If Not Intersect(Target, Sheets("Verwaltung").Range("MonatFilter")) Is Nothing Then
Set MonatFilter = Sheets("Verwaltung").Range("MonatFilter")
FilterValue = Application.Match(MonatFilter.Value, Range(MonatFilter.Validation.Formula1), 0)
For Each sh In ThisWorkbook.Sheets
Select Case sh.Name
Case "Verwaltung"
Case Else
With h.ListObjects(1).Range
If FilterValue = 1 Then
.AutoFilter Field:=2
Else
'.AutoFilter Field:=2, Criteria1:=FilterValue + 19, Operator:=11, Criteria2:=0, SubField:=0
.AutoFilter Field:=2, Operator:=xlFilterValues, Criteria2:=Array(1, FilterValue - 1 & "/31/" & Range("L1").Value)
End If
End With

End Select
Next sh
End If
End Sub


auskommentierte Filterzeile kann alternativ verwendet werden, allerdings wird hier tatsächlich nur nach dem Monat gefiltert und nicht nach dem Jahr, dh wenn du damit nach "Januar" filterst, werden die Werte aus Januar 24 und Januar 25 angezeigt.
die aktive Zeile filtert nach Monat und Jahr (Jahr wird aus Zelle L1 genommen)
beachte, dass im Autofilter ein zu filternder Monatswert immer im amerikanischen Format angegeben werden muss (Monat/Tag/Jahr).

Gruß Daniel
Anzeige
AW: VBA Autofilter
21.05.2024 07:46:13
daniel
Hi
Da man die Monatsliste ja schon als Vorlage für das Dropdown hat, könnte man die Nummer auch einfach in einer Zelle mit der Funktion VERGLEICH() berechnen.
Gruß Daniel
AW: VBA Autofilter
21.05.2024 09:43:07
Oppawinni
Ok, so tief bin ich in das Thema nicht eingestiegen, hab nur den Code überflogen.
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige