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

Forumthread: Filtern nach Monat mit Makro

Filtern nach Monat mit Makro
02.04.2019 08:00:05
MaBlu
Hallo zusammen
Ich habe eine Liste erstellt mit Angaben zu Werkzeugen die auch sehr gut funktioniert,
jetzt sollte ich diese Auswerten und zwar Monatsweise und da stehe ich an!
Ich hatte versucht mit dem Makrorekorder aber wie ich den Monat einstellen soll keine Ahnung.
Ich weiss nicht wie ich diese einfach Filtern kann, Es werden mehrere Personen daran Arbeiten und da dachte ich an ein Makro habe aber keine Ahnung wie ich das bewerkstelligen kann.
Was möchte ich tun:
Auf dem Blatt ASW_WZ-Detail möchte ich den Monat wählen Zelle A1 dann sollte mir das Makro das Register-Blatt Eingabetabelle die Spalte D nach dem eingestellten Monat sortieren, in der Spalte C sollte es nur den Code Werkzeugproblem Filtern.
Anschliessend sollte es mir die Werkzeuge auf dem Blatt ASW_WZ-Deatail auflisten
Werkzeug mit Anzahl wievielmal kommt es vor zB. Im Januar
den Aufwand im Monat
und diese nach den ersten 12 Rangen nach Aufwand sortieren ich habe es mal von Hand dargestellt.
Nun meine Frage wie kann man das Automatisch machen kann mir hier jemand helfen?
Für eure Hilfe besten dank
Gruss MaBlu
hier die Vorlage
https://www.herber.de/bbs/user/128833.zip
Anzeige

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Filtern nach Monat mit Makro
02.04.2019 10:35:47
Nepumuk
Hallo MaBlu,
dein ZIP-Folder ist leer.
Gruß
Nepumuk
AW: Filtern nach Monat mit Makro
02.04.2019 10:53:47
MaBlu
Hallo Nepomuk
Danke für die Meldung, weiss nicht wie das passiert ist sorry
hier die Datei:
https://www.herber.de/bbs/user/128838.zip
Gruss MaBlu
AW: Filtern nach Monat mit Makro
02.04.2019 20:03:28
Nepumuk
Hallo Martin,
warum machst du das Ganze nicht über den AutoFilter in deiner Liste?
Gruß
Nepumuk
Anzeige
AW: Filtern nach Monat mit Makro
03.04.2019 08:43:57
MaBlu
Hallo Nepumuk
zu deiner Nachfrage, ich mache das heute so, aber es ist sehr aufwendig weil ich ja alle Werkzeuge dann einzeln Filtern muss um die Anzahl zu bestimmen dann muss ich diese aufschreiben und so die Auswertung zu machen, ich denke mit einem Makro könnte man das viel eleganter machen nur weiss ich nicht wie?
Gruss MaBlu
Anzeige
AW: Filtern nach Monat mit Makro
03.04.2019 14:09:48
MaBlu
Hallo Nepumuk
Ich dachte schon perfekt..aber
ich hatte noch ein paar Einträge im April eingegeben und dann Funktioniert es nicht korrekt,
es trägt dann das gefundene bereits ab der ersten Zeile ein warum?
Ich wollte noch im Blatt ASW_WZ-Detailelle Zelle D1 die Summe einfügen, wenn der Fehler auftritt überschreibst den?
Man muss es dann von Hand löschen dann geht's wieder.
Schön wäre auch wenn der gesetzte Filter auf der Eingabetabelle am Schluss nach dem Eintragen wieder gelöscht würde.
Aber zuerst mal vielen Dank dass du dich meinem Problem angenommen hast,
schön wenn man solche Unterstützung bekommt.
Gruss MaBlu
https://www.herber.de/bbs/user/128889.zip
Anzeige
AW: Filtern nach Monat mit Makro
03.04.2019 14:30:44
Nepumuk
Hallo Martin,
so besser?
Option Explicit

Public Sub Auswertung(ByVal strMonth As String)
    Dim objDataObject As Object, objDictionary As Object
    Dim strTempString As String
    Dim avntTempRows As Variant, avntRow As Variant
    Dim avntOutput As Variant
    Dim ialngRow As Long, ialngCounter As Long
    Dim lngRows As Long
    With Tabelle1
        With .Rows(3)
            Call .AutoFilter(Field:=3, Criteria1:="Werkzeugproblem")
            Call .AutoFilter(Field:=4, Operator:= _
                xlFilterValues, Criteria2:=Array(1, CStr(Month(CDate("1." & _
                strMonth & ".2000"))) & "/1/" & CStr(Year(Date))))
        End With
        If .Cells(.Rows.Count, 1).End(xlUp).Row = 3 Then
            With Tabelle2
                .Range(.Cells(4, 1), .Cells(.Rows.Count, 4)).ClearContents
            End With
            Call MsgBox(Prompt:="Keine Daten gefunden.", _
                Buttons:=vbExclamation, Title:="Hinweis")
            Exit Sub
        End If
        With .AutoFilter.Range
            Range(.Cells(2, 2), .Cells(.Rows.Count, 8)).Copy
        End With
    End With
    Set objDataObject = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
    Call objDataObject.GetFromClipboard
    strTempString = objDataObject.GetText
    Set objDataObject = Nothing
    Call Tabelle1.ShowAllData
    strTempString = Left$(strTempString, Len(strTempString) - 2)
    avntTempRows = Split(strTempString, vbCrLf)
    Set objDictionary = CreateObject("Scripting.Dictionary")
    For ialngRow = 0 To UBound(avntTempRows, 1)
        avntRow = Split(avntTempRows(ialngRow), vbTab)
        objDictionary.Item(avntRow(0)) = vbNullString
    Next
    lngRows = objDictionary.Count
    Call objDictionary.RemoveAll
    Redim avntOutput(0 To lngRows - 1, 0 To 2)
    For ialngRow = 0 To UBound(avntTempRows, 1)
        avntRow = Split(avntTempRows(ialngRow), vbTab)
        If Not objDictionary.Exists(avntRow(0)) Then
            Call objDictionary.Add(avntRow(0), ialngCounter)
            avntOutput(ialngCounter, 0) = avntRow(0)
            avntOutput(ialngCounter, 1) = 1
            avntOutput(ialngCounter, 2) = CDbl(avntRow(6))
            ialngCounter = ialngCounter + 1
        Else
            avntOutput(objDictionary.Item(avntRow(0)), 1) = _
                avntOutput(objDictionary.Item(avntRow(0)), 1) + 1
            avntOutput(objDictionary.Item(avntRow(0)), 2) = _
                avntOutput(objDictionary.Item(avntRow(0)), 2) + CDbl(avntRow(6))
        End If
    Next
    Set objDictionary = Nothing
    With Application
        .Calculation = xlCalculationManual
        .CutCopyMode = False
        .EnableEvents = False
        .ScreenUpdating = False
    End With
    With Tabelle2
        .Range(.Cells(4, 1), .Cells(.Rows.Count, 4)).ClearContents
        .Range(.Cells(4, 2), .Cells(lngRows + 3, 4)).Value = avntOutput
        Call .Sort.SortFields.Clear
        Call .Sort.SortFields.Add(Key:=.Cells(3, 4), SortOn:=xlSortOnValues, _
            Order:=xlDescending, DataOption:=xlSortNormal)
        Call .Sort.SetRange(Rng:=.Range(.Cells(3, 2), .Cells(.Rows.Count, 4)))
        With .Sort
            .Header = xlYes
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
        .Cells(4, 1).Value = 1
        Call .Range(.Cells(4, 1), .Cells(lngRows + 3, 1)).DataSeries( _
            RowCol:=xlColumns, Type:=xlDataSeriesLinear)
    End With
    With Application
        .Calculation = xlCalculationAutomatic
        .EnableEvents = True
        .ScreenUpdating = True
    End With
End Sub

Gruß
Nepumuk
Anzeige
AW: Filtern nach Monat mit Makro
03.04.2019 15:21:29
MaBlu
Hallo Nepumuk
Vielen vielen Dank,
jetzt ist es schön und Perfekt, ich weiss nicht wie man das so schnell hinbekommt,
aber es macht echt Spass, wünsche dir einen Super Tag
MaBlu
;
Anzeige
Anzeige

Infobox / Tutorial

Filtern nach Monat mit einem Makro in Excel


Schritt-für-Schritt-Anleitung

  1. Makro aktivieren: Stelle sicher, dass du die Makros in Excel aktivierst. Gehe dazu auf „Datei“ > „Optionen“ > „Sicherheitscenter“ und aktiviere die Makros.

  2. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor zu öffnen.

  3. Modul erstellen: Klicke mit der rechten Maustaste auf "VBAProject (DeineDatei.xlsx)" und wähle „Einfügen“ > „Modul“.

  4. Makro eingeben: Kopiere den folgenden Code in das Modul:

    Option Explicit
    
    Public Sub Auswertung(ByVal strMonth As String)
       Dim objDataObject As Object, objDictionary As Object
       Dim strTempString As String
       Dim avntTempRows As Variant, avntRow As Variant
       Dim avntOutput As Variant
       Dim ialngRow As Long, ialngCounter As Long
       Dim lngRows As Long
    
       With Tabelle1
           With .Rows(3)
               Call .AutoFilter(Field:=3, Criteria1:="Werkzeugproblem")
               Call .AutoFilter(Field:=4, Operator:= _
                   xlFilterValues, Criteria2:=Array(1, CStr(Month(CDate("1." & _
                   strMonth & ".2000"))) & "/1/" & CStr(Year(Date))))
           End With
    
           If .Cells(.Rows.Count, 1).End(xlUp).Row = 3 Then
               With Tabelle2
                   .Range(.Cells(4, 1), .Cells(.Rows.Count, 4)).ClearContents
               End With
               Call MsgBox(Prompt:="Keine Daten gefunden.", Buttons:=vbExclamation, Title:="Hinweis")
               Exit Sub
           End If
    
           ' Hier folgt der Rest des Codes
       End With
    End Sub
  5. Makro anpassen: Stelle sicher, dass die Tabellennamen (Tabelle1, Tabelle2) an deine Excel-Datei angepasst sind.

  6. Makro ausführen: Schließe den VBA-Editor und führe das Makro über ALT + F8 und Auswahl deines Makros aus.


Häufige Fehler und Lösungen

  • Leere Daten: Wenn das Makro meldet, dass keine Daten gefunden wurden, überprüfe, ob in den gefilterten Spalten tatsächlich die Werte vorhanden sind.

  • Falsche Tabellennamen: Achte darauf, dass die Namen der Tabellen in deinem Makro mit den tatsächlichen Namen in der Excel-Datei übereinstimmen.

  • Makro wird nicht ausgeführt: Stelle sicher, dass die Makros aktiviert sind und dass du die Datei im .xlsm-Format speicherst.


Alternative Methoden

  • AutoFilter verwenden: Du kannst den AutoFilter manuell aktivieren, indem du auf das Dropdown-Menü in der Spaltenüberschrift klickst und den gewünschten Monat auswählst.

  • Pivot-Tabellen: Eine weitere Möglichkeit ist die Verwendung von Pivot-Tabellen, um die Daten nach Monat und Werkzeugproblemen zu aggregieren. Dies ermöglicht eine schnelle und einfache Auswertung ohne VBA.


Praktische Beispiele

Angenommen, du hast eine Liste von Werkzeugen mit dem Datum in Spalte D. Um nach dem Monat Januar zu filtern:

  1. Setze in Zelle A1 den Monat „Januar“ ein.
  2. Führe das Makro Auswertung aus, um die Daten entsprechend zu filtern und die Ergebnisse im Blatt ASW_WZ-Detail auszugeben.

Tipps für Profis

  • Datenvalidierung: Verwende Datenvalidierung in Zelle A1, um sicherzustellen, dass nur gültige Monatsnamen eingegeben werden können.

  • Fehlerbehandlung im Makro: Füge Fehlerbehandlungsroutinen in dein Makro ein, um unerwartete Probleme abzufangen und besser zu reagieren.

  • Optimierung der Performance: Deaktiviere die Bildschirmaktualisierung und die Berechnung während der Makroausführung, um die Performance zu verbessern:

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

FAQ: Häufige Fragen

1. Wie kann ich das Makro anpassen, um einen anderen Monat zu filtern? Du kannst den Wert in Zelle A1 ändern, um einen anderen Monat auszuwählen, bevor du das Makro ausführst.

2. Was tun, wenn das Makro nicht die erwarteten Ergebnisse liefert? Überprüfe die Daten in deiner Eingabetabelle und stelle sicher, dass die Spalten korrekt gefüllt sind und die Filterkriterien im Makro stimmen.

3. Kann ich das Makro für andere Tabellen verwenden? Ja, passe die Tabellennamen im Code an, um das Makro auf andere Datenblätter anzuwenden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige