Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1168to1172
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Liste filtern mit Hilfe von Makro

Liste filtern mit Hilfe von Makro
Makro
Guten Morgen,
Ich hoffe jemand kann mir mit der folgenden Frage helfen:
Ich muss 100 mal am Tag eine Excel Liste/Tabelle nach verschiedene Kriterien filtern und basierend darauf fuer jeden einzelnen Fall eine Entscheidung treffen. Da dies viel Zeit nimmt habe ich mich gewundert ob es nicht mit der Hilfe einer oder zwei Makros schneller gemacht werden koennte.
Die Liste hat einen Auto Filter in der Reihe 4.
Was ich brauche ist ein Makro das beim Starten zwei prompts zeigt fuer dennen Werte eingegeben muessen wie folgt:
Makro Starten
1) Prompt/Eingabekaestchen: “Geben Sie Wert fuer filter in Spalte 5 (Zelle E4): “ z.B 60
2) Prompt/Eingabekaestchen: “Geben Sie Wert fuer filter in Spalte 8 (Zelle H4): “ z.B 4.00
3) Dann soll die Spalte 5 so gefiltert werden dass in dem Beispiel oben alle Werte 60+-2 gezeigt werden: also 58,59,60,61,62 oder >57; 4) Aehnlich mit der Spalte 8, aber hier alle Werte 4+- 0.10, also 3,90;3,91;3,92;3,93 …. 3,99; 4,00; 4,01; 4,02 …. 4,09; 4,10 oder >3,89 ; Es kann sein dass es fuer einige davon keine Werde vorhanden sind. Diese sollte das Makro ignorieren.
Dann braeuchte ich ein zweites Makro dass alle Filterkriterien loescht. Ich bin nicht sicher ob es eine solche Funktion in Excel schon gibt, dann wuerde ich natuerlich das Makro nicht brauchen.
Hoffe ich habe es mehr oder weniger gut erklaert und dass jemand mir damit helfen kann
Vielen Dank im Voraus
Peter
AW: Liste filtern mit Hilfe von Makro
08.08.2010 09:11:36
Makro
Hallo,
kannst mal diesen Code testen.
Ich gehe davon aus, dass die Überschrift in Zeile 4 ist.
Sub FilterSetzen()
Dim Wert1, Wert2

'Abfrage Werte 
Wert1 = Application.InputBox("Geben Sie Wert fuer filter in Spalte 5 (Zelle E4):", Type:=1)
Wert2 = Application.InputBox("Geben Sie Wert fuer filter in Spalte 8 (Zelle H4):", Type:=1)

If Not IsNumeric(Wert1) And Not IsNumeric(Wert2) Then Exit Sub

Application.ScreenUpdating = False

'Benutzter Bereich 
With ActiveSheet.Range("A4:H" & Rows.Count)
    
    'Wert1 filtern 
    If IsNumeric(Wert1) Then
        .AutoFilter Field:=5, Criteria1:=">=" & Wert1 - 4, _
            Operator:=xlAnd, Criteria2:="<=" & Wert1 + 4
    End If
    
    'Wert2 filtern 
    If IsNumeric(Wert2) Then
        .AutoFilter Field:=8, Criteria1:=">=" & Wert1 - 0.1, _
            Operator:=xlAnd, Criteria2:="<=" & Wert2 + 0.1
        
        If .SpecialCells(xlCellTypeVisible).Rows.Count < 5 Then
            .AutoFilter Field:=8
        End If
    End If

End With
Application.ScreenUpdating = True

End Sub

Sub Filter_Loeschen()
If ActiveSheet.FilterMode Then
    ActiveSheet.ShowAllData
End If
End Sub
Gruß Tino
Anzeige
AW: Liste filtern mit Hilfe von Makro
08.08.2010 10:43:30
Makro
Hallo Tino,
Vielen Dank. Es funktioniert halbwegs so weit.
Also das Makro Filter Loeschen ist perfekt.
Das andere Makro Filter setzen filtert nur den ersten Wert, nicht den zweiten.
Es hat sich herausgestellt dass es Spalten 4 und 7 sind (nicht 5 und 8). Ich habe das Code dementsprechend angepasst aber wie gesagt - das Filtern funktionirt nur fuer die Spalte 4, nicht fuer 7.
Ich nehme an es ist etwas kleines dass ich uebersehen habe.
Hier ist das angepasste Code, koenntest Du bitte es Dir ankucken ob etwas nicht stimmt?
Danke
Peter
Sub FilterSetzen()
Dim Wert1, Wert2
'Abfrage Werte
Wert1 = Application.InputBox("Geben Sie Wert fuer filter in Spalte 4 (Zelle D4):", Type:=1)
Wert2 = Application.InputBox("Geben Sie Wert fuer filter in Spalte 7 (Zelle G4):", Type:=1)
If Not IsNumeric(Wert1) And Not IsNumeric(Wert2) Then Exit Sub
Application.ScreenUpdating = False
'Benutzter Bereich
With ActiveSheet.Range("A4:W" & Rows.Count)
'Wert1 filtern
If IsNumeric(Wert1) Then
.AutoFilter Field:=4, Criteria1:=">=" & Wert1 - 2, _
Operator:=xlAnd, Criteria2:="=" & Wert1 - 0.1, _
Operator:=xlAnd, Criteria2:="

Anzeige
AW: Liste filtern mit Hilfe von Makro
08.08.2010 10:49:51
Makro
Hallo,
versuch es nochmal so.
Sub FilterSetzen()
Dim Wert1, Wert2

'Abfrage Werte 
Wert1 = Application.InputBox("Geben Sie Wert fuer filter in Spalte 4 (Zelle D4):", Type:=1)
Wert2 = Application.InputBox("Geben Sie Wert fuer filter in Spalte 7 (Zelle G4):", Type:=1)

If Not IsNumeric(Wert1) And Not IsNumeric(Wert2) Then Exit Sub

Application.ScreenUpdating = False

'Benutzter Bereich 
With ActiveSheet.Range("A4:W" & Rows.Count)
    
    'Wert1 filtern 
    If IsNumeric(Wert1) Then
        .AutoFilter Field:=4, Criteria1:=">=" & Wert1 - 2, _
            Operator:=xlAnd, Criteria2:="<=" & Wert1 + 2
    End If
    
    'Wert2 filtern 
    If IsNumeric(Wert2) Then
        .AutoFilter Field:=7, Criteria1:=">=" & Wert2 - 0.1, _
            Operator:=xlAnd, Criteria2:="<=" & Wert2 + 0.1
        
        If .SpecialCells(xlCellTypeVisible).Rows.Count < 5 Then
            .AutoFilter Field:=7
        End If
    End If

End With
Application.ScreenUpdating = True

End Sub
Gruß Tino
Anzeige
AW: Liste filtern mit Hilfe von Makro
08.08.2010 11:01:32
Makro
Hi Tino,
Immer dasselbe: Filter fuer die Spalte D funktiniert, Splalte G, aber zeigt immer noch alle felder ohne filter.
Danke
Peter
Lade mal ein Beispiel. oT.
08.08.2010 11:06:50
Tino
versuch mal noch
08.08.2010 11:11:15
Tino
Hallo,
und mach aus der Zeile
If .SpecialCells(xlCellTypeVisible).Rows.Count 
diese
If .SpecialCells(xlCellTypeVisible).Rows.Count 
Gruß Tino
AW: versuch mal noch
08.08.2010 11:27:37
Peter
Hallo Tino,
Ich habe versucht mit dem neuen Code, funktioniert immer noch nicht.
Ich habe die Beispiel Datei upload gemacht, vielleicht wird es klarer.
Vielen Dank fuer die Hilfe, hoffentlich funktioniert es!
Anzeige
ich falle immer darauf rein
08.08.2010 11:47:59
Tino
Hallo,
mit dem Punkt und dem Komma.
Die Zahl wird im Filter Code in einen String umgewandelt und
daher macht VBA aus 1,2 nicht "1.2" sondern "1,2"
und weil VBA nun mal mit Punkt als Dezimalzeichen arbeitet geht es so nicht.
Also helfen wir etwas nach.
Sub FilterSetzen()
Dim Wert1, Wert2, MaxWert, MinWert


'Abfrage Werte 
Wert1 = Application.InputBox("Geben Sie Wert fuer filter in Spalte 4 (Zelle D4):", Type:=1)
Wert2 = Application.InputBox("Geben Sie Wert fuer filter in Spalte 7 (Zelle G4):", Type:=1)

If Not IsNumeric(Wert1) And Not IsNumeric(Wert2) Then Exit Sub

Application.ScreenUpdating = False

'Benutzter Bereich 
With ActiveSheet.Range("A4:W" & Rows.Count)
    
    'Wert1 filtern 
    If IsNumeric(Wert1) Then
        MinWert = Replace(CStr(Wert1 - 2), ",", ".")
        MaxWert = Replace(CStr(Wert1 + 2), ",", ".")
        .AutoFilter Field:=4, Criteria1:=">=" & MinWert, _
            Operator:=xlAnd, Criteria2:="<=" & MaxWert
    End If
    
    'Wert2 filtern 
    If IsNumeric(Wert2) Then
        MinWert = Replace(CStr(Wert2 - 0.1), ",", ".")
        MaxWert = Replace(CStr(Wert2 + 0.1), ",", ".")
        .AutoFilter Field:=7, Criteria1:=">=" & MinWert, _
            Operator:=xlAnd, Criteria2:="<=" & MaxWert
        
        If ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row < 5 Then
            .AutoFilter Field:=7
        End If
    End If

End With
Application.ScreenUpdating = True

End Sub
Gruß Tino
Anzeige
Genial!!!
08.08.2010 11:56:12
Peter
Herzlichen Dank, Tino!
Echt genial! Das wird mir viiiieel Zeit sparen!
Danke nochmals und einen schoenen Sonntag!
Peter
AW: Anmerkungen und Probleme
08.08.2010 12:53:32
mpb
Hallo Tino,
sind die Abfragen auf IsNumeric nicht überflüssig, da ja Type=1 in dem Inputbox-Statement die Eingabe von nichtnumerischen Zeichen schon unterbindet?
Unabhängig davon, müsste in der ersten If-Abfrage nicht ein OR statt dem AND stehen?
Generell akzeptieren die Inputbox und die IsNumeric-Abfragen jetzt Dezimalzahlen mit Punkt oder Komma als Dezimaltrennzeichen. Bei einem Komma werden beide Filter gesetzt. Wenn man für den zweiten Wert z.B. 1.29 statt 1,29 eingibt, wird der zweite Filter nicht gesetzt.
Gruß
Martin
Anzeige
AW: Anmerkungen und Probleme
08.08.2010 13:25:36
Tino
Hallo,
1. drücke mal bei der Inputbox auf abbrechen.
Natürlich könnte man so einstellen, dass nur einmal abbrechen gedrückt werden muss,
dies war aber nicht gefordert.
2. wieso Oder? es sollen doch die Werte gefiltert werden,
die zwischen dem kleinen und dem großen Wert stehen.
Bei Oder wären ja alle die größer = Min sind und alle die kleiner = Max sind,
dass sind bei mir eigentlich alle.
3. woher soll der User wissen was er eingeben muss?
Generell gibt der User das Dezimaltrennzeichen ein das er auch sonst auf seinem System verwendet.
Ich bin es nun mal gewöhnt, dass Komma zu verwenden,
weil mein System überall auf Deutsch eingestellt ist.
Eine komplett unabhängige Eingabe müsste man als String machen.

Dim Wert1$, Wert2$, MaxWert, MinWert
'Abfrage Werte
Wert1 = Application.InputBox("Geben Sie Wert fuer filter in Spalte 4 (Zelle D4):")
Wert2 = Application.InputBox("Geben Sie Wert fuer filter in Spalte 7 (Zelle G4):")
'...
Gruß Tino
Anzeige
AW: Anmerkungen und Probleme
08.08.2010 13:39:25
mpb
Hallo Tino,
zu 1: Zweimal abbrechen gedrückt. Ergebnis: das Exit Sub wird nicht ausgelöst, das Makro läuft durch, setzt den Filter in Spalte D, aber nicht in Spalte G, und es bleiben Null gefilterte Zeilen übrig.
zu 2: Missverständnis. Ich meinte diese Code-Zeile
If Not IsNumeric(Wert1) And Not IsNumeric(Wert2) Then Exit Sub
Das Exit Sub würde so doch nur dann ausgelöst, wenn beide Eingaben nicht numerisch sind. Ich halte OR für besser, damit der Abbruch auch dann erfolgt, wenn einer der beiden Werte nicht numerisch ist. Aber die Zeile wird ja wegen Type=1 m.E. sowieso nie relevant.
zu 3: Ich fand es interessant, dass sowohl 1.29 als auch 1,29 als zulässige Angaben akzeptiert werden, obwohl Type =1 und eine Prüfung auf "IsNumeric" erfolgt. Und dass das Ergebnis der Filterung unterschiedlich ist.
Gruß
Martin
Anzeige
AW: Anmerkungen und Probleme
08.08.2010 13:59:49
Tino
Hallo,
eine Optimierung auf Deine Bedürfnisse wo die Eingabe egal ist müsste so gehen.
Allerdings wird nun auch gefiltert, wenn nur eine Eingabe abgebrochen wird. (sonst wie alter Code)
Sub FilterSetzen()
Dim Wert1$, Wert2$, MaxWert, MinWert
Dim KommaOrPunkt$

'Abfrage Werte 
Wert1 = Application.InputBox("Geben Sie Wert fuer filter in Spalte 4 (Zelle D4):")
Wert2 = Application.InputBox("Geben Sie Wert fuer filter in Spalte 7 (Zelle G4):")

Application.ScreenUpdating = False

'Benutzter Bereich 
With ActiveSheet.Range("A4:W" & Rows.Count)
    KommaOrPunkt$ = IIf("0.5" * 2 = 1, ".", ",")
    
    'Wert1 filtern 
    If IsNumeric(Wert1) Then
        Wert1 = Replace(Wert1, ",", KommaOrPunkt$)
        Wert1 = Replace(Wert1, ".", KommaOrPunkt$)
        MinWert = Replace(CStr(Wert1 - 2), ",", ".")
        MaxWert = Replace(CStr(Wert1 + 2), ",", ".")
        .AutoFilter Field:=4, Criteria1:=">=" & MinWert, _
            Operator:=xlAnd, Criteria2:="<=" & MaxWert
    End If
    
    'Wert2 filtern 
    If IsNumeric(Wert2) Then
        Wert2 = Replace(Wert2, ",", KommaOrPunkt$)
        Wert2 = Replace(Wert2, ".", KommaOrPunkt$)
        MinWert = Replace(CStr(Wert2 - 0.1), ",", ".")
        MaxWert = Replace(CStr(Wert2 + 0.1), ",", ".")
        .AutoFilter Field:=7, Criteria1:=">=" & MinWert, _
            Operator:=xlAnd, Criteria2:="<=" & MaxWert
        
        If ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row < 5 Then
            .AutoFilter Field:=7
        End If
    End If

End With
Application.ScreenUpdating = True

End Sub
Gruß Tino
Anzeige
AW: Perfekt...
08.08.2010 14:11:04
mpb
... und nichts für ungut wegen meinen Anmerkungen, ich wollte Dir keine Zusatzarbeit verschaffen.
Gruß
Martin
AW: ich falle immer darauf rein
09.08.2010 17:52:53
Peter
Hallo,
Ich habe noch eine zusaetzliche Frage zu diesem Makro:
Ist es moeglich dass Wert1 und Wert2 in dem Code anstatt durch einen InputBox, automatisch vom Makro aus Zellen K1 fuer Wert1 und O1 fuer Wert2 genommen werden?
Ich habe realisiert dass diese zellen K1 und O1 die Werte sowieso enthalten von da her wird es viel einfacher wenn das Makro sie automatisch zieht.
Vielen Dank
Peter
AW: ich falle immer darauf rein
09.08.2010 18:30:42
KlausF
Hallo Peter,
Wert1 = ActiveSheet.Range("K1").Value
Wert2 = ActiveSheet.Range("O1").Value
Gruß
Klaus
AW: ich falle immer darauf rein
10.08.2010 09:15:14
Tino
Hallo,
teste mal so.
Sub FilterSetzen()
Dim MaxWert$, MinWert$

If Not IsNumeric(Range("K1")) And Not IsNumeric(Range("O1")) Then
    MsgBox "keine Zahl in K1 oder O1", vbExclamation
    Exit Sub
End If

Application.ScreenUpdating = False
'Benutzter Bereich 
With ActiveSheet.Range("A4:W" & Rows.Count)
    
    'Wert1 filtern 
    If IsNumeric(Range("K1")) Then
        MinWert = Replace(CStr(Range("K1") - 2), ",", ".")
        MaxWert = Replace(CStr(Range("K1") + 2), ",", ".")
        .AutoFilter Field:=4, Criteria1:=">=" & MinWert, _
            Operator:=xlAnd, Criteria2:="<=" & MaxWert
    End If
    
    'Wert2 filtern 
    If IsNumeric(Range("O1")) Then
        MinWert = Replace(CStr(Range("O1") - 0.1), ",", ".")
        MaxWert = Replace(CStr(Range("O1") + 0.1), ",", ".")
        
        .AutoFilter Field:=7, Criteria1:=">=" & MinWert, _
            Operator:=xlAnd, Criteria2:="<=" & MaxWert
        
        If ActiveSheet.Cells(ActiveSheet.Rows.Count, 7).End(xlUp).Row < .Cells(2, 1).Row Then
            .AutoFilter Field:=7
        End If
    End If

End With
Application.ScreenUpdating = True

End Sub
Gruß Tino

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige