[Excel] Mehrere Filter gleichzeitig setzen: Makro?!

Prisoner.o.Time

Admiral
Registriert
Mai 2010
Beiträge
9.917
Guten Abend,

ich hätte da mal eine Frage bezüglich Excel, hab mir da was feines gebaut, was leider nicht ganz so fein zu bedienen ist und hoffe, dass mir jemand einen Weg aufzeigen kann wie ich das ganze einfacher gestalten kann.

Hab mir über das Internet verschiedene Mocktails zusammen gesucht und die Zutaten bzw. Zubereitung in eine Tabelle geschmissen. Ziel ist es nun zu filtern, welche dieser Mocktails ich anhand der Zutaten die ich Zuhause habe, zubereiten kann.

Klar, jetzt könnte ich einen Filter nach den anderen setzen. Aber bei der Auswahl an Zutaten, ist das immer ein ganz schön großer Aufwand. Jetzt wäre es halt schön, wenn ich nur einen einzigen Filter bearbeiten müsste. Angeblich soll mir hier ein Makro weiter helfen. Wo wir dann auch schon das Problem haben.

A. Weiß ich weder ob das der Richtige Weg ist bzw. was ich sonst für Alternativen habe. Und

B. Habe ich 0 Plan von Makros. Hab versucht im Internet was passendes zu finden, jedoch war da nichts leicht verständliches dabei bzw. habe ich jetzt auch nichts gefunden was genau dies bewerkstelligt.

Habt ihr da vielleicht einen Tip zu einem leicht verständlichen Tutorial oder könnt es mir verständlich erklären? Alternativ nehem ich auch gerne andere Herangehensweisen an sofern mich diese an das von mir gewollte Ziel bringen.

So sieht aktuell meine Tabelle aus:

Monin.PNG
 
Ich habe vom «Kochen» (in dem Falle Mixen…) keine Ahnung. Aber um aus einer willkürlichen Vorratsliste etwas herstellen zu können braucht es eine Datenbank die Anhand der Angaben alles passende auswirft.

Filter in Excel scheinen mir falsch, ich kann mir nur DropDowns (Auswahllisten) vorstellen…
→ was mache ich wenn ich 3 Früchte zur Auswahl habe; wie bringe ich alle 3 ins Rennen; das tut mit DropDown auch nicht recht!
…und aus diesen Vorräten müssten Formeln [SVERWEIS vielleicht] die Rezepte angeben die alle Vorräte enthalten.

Wenn nicht Datenbank dann kann (und schon wären wir beim Datenbanknachbau) eine Userform Marke XXL Daten annehmen während dann einfache Bool-Logik in Makro gegossen Resultate auswerfen.

CN8
 
Also ich versteh nur Bahnhof. So viel zu dem Thema leicht verständlich.

Naja, einen kleinen Teil habe ich zu Mindest verstanden. Aber eine Datenbank und "sverweis" wäre in dem Fall eher kontraproduktiv. Hier müsste die Liste stets akkurat sein und kann auch nicht so einfach gefilter werden. z.B. wenn ich jetzt mal alle Mocktails mit Mangosaft wissen möchte

Danke trotzdem für deine Anmerkungen. Würde es aber nach wie vor bevorzugen, wenn ich dies über Filter bewerkstellige, da individuell diese gesetzt werden können, und dann eben auf einen einzigen beschränkt.
 
Prisoner.o.Time schrieb:
So viel zu dem Thema leicht verständlich.
In Verstaendlich:
Displayfuellendes Formular, in dem alle in der Datenbank enthaltenden Zutaten aufgelistet sind.
Damit man nur noch die Zutat anklicken muss.

Deine "feine" Tabelle halte ich fuer dieses Vorhaben fuer unbrauchbar.
Wenn es mit Excel sein muss, waere mein Vorschlag:
- 1. Tabelle: Spalten -> Rezeptbezeichnung; pro Zeile eine Zutat; Schnittmengen werden mit "x" markiert
- 2. "Tabelle": Spalte 1 -> alle Zutaten; Spalte 2 -> Eingabe, was vorhanden ist.
- Rezepte werden ausgelagert, so dass man sie verlinken kann (separates Tabellenblatt oder Datei oder ...)

Makro:
- Eingabe in ein Array laden
- Schleife ueber alle Spalten (Rezepte) in Tabelle 1
- alle Zutaten (x markierte Zeilen) in der Spalte (Rezept) in ein Array laden
- Vergleichen, ob alle Werte von Array 2 in Array 1 vorkommen
--- Wenn ja, schreibe Rezept in Ausgabe (mit Link zum Rezept)
- nächste Spalte (Rezept)

Ein schoenes Projekt zum Einsteigen ...
 
Die Filter(funktion) die Excel anbietet filtert aus einem Datenvorrat gemäß der Filterfähigkeiten Daten heraus.

Was dir vorschwebt ist im Groben formuliert eher das Gegenteil dieser Filterlogik. Der Filter (und ich zweifle, dass das typisches Filtern ist) würde nennen können, dass Rum in diesem und jenem Cocktail vorkommt. Aber: dieses Zustand des ersten Filters wird nicht an den Folgefilter weitergeben. Es sind dann nicht alle Cocktails mit Rum übrig über die dann ein Filter geworfen wird demnach Zitrone im Rezept ist - der Zitronenfilter filtert wieder alle und liefert alle, ob mit oder ohne Rum.

Deswegen eben Datenbank die Bedingungen kaskadieren, addieren, kann. Oder all das selbst programmieren. Eine (vermutlich mehr un- als übersichtliche) Liste aller Zutaten die man auswählt und dann Makro-Programmcode losticken lassen der alle möglichen Treffer liefert.

CN8
 
Uh, mein uebermuedet Hirn hat einen kranken Auswurf ...
Mit Rezept * max_Zutaten an Wennabfragen und weiteren Rechenzellen bei doppelter Anzahl der Rezepten laesst sich das auch ohne VBA loesen :D

Voraussetzung ist ein vergleichbarer Tabellen Aufbau wie in #4 beschrieben.
Einfach fuer jede Zutat in jedem Rezept eine Wennabfrage starten, anschließend die Wennabfragen auswerten und bei erfüllter Bedingung hochzaehlen.
In der Ausgabe wird dann die Liste ueber irgendeine der tausend Verweismoeglichkeiten erstellt.

Wenn schon dreckig, dann richtig ...

hf
 
@Scientist

habe zwar Post #4 nicht verstanden, jedoch dank etwas Input von anderer Seite es mehr oder weniger so umgesetzt wie du es beschrieben hast.

Vom Prinzip her habe ich meine Tabelle so gelassen wie sie ist und erst einmal eine Spalte am Anfang eingefügt. Diese greift via verschachtelter "wenn" Funktion auf einen "sverweis" zu. Des weiteren habe ich in einem seperaten Blatt eine Datenbank angelegt.

Die "sverweis" Funktion greift auf meine Datenbank zurück und überprüft ob ich für Rezept XY die Zutaten habe oder nicht.
Die "wenn" Funktion greift dann auf die Ergebnise des "sverweis" zu und sagt mir dann ob ich diese Zubereiten kann oder nicht indem sie mir ein "ja" oder "nein" ausgibt.

Für alle die gefallen an Cocktails (Mocktails) mixen haben und ein Liebhaber von Monin ist, stelle ich gern meine Arbeit zur verfügung.

Zu groß.PNG


Sind zwar nur 14 MB, aber gut dann wer bock hat hier der Link:
https://www.file-upload.net/download-13602135/Alkoholfrei.xlsx.html
 
Zuletzt bearbeitet:
Eine interessante Liste und Idee. Ich habe mal ein wenig VBA dazu gepackt damit man das Ganze über ein Userform steuern kann. Auf meinem Rechner läufts eigentlich ganz o.k., kann aber bestimmt noch optimiert werden was die Datenverarbeitungsschritte angeht.

Einfach bei Makros das Alkoholfrei_Start ausführen.

Bei Fragen einfach melden 😊

https://we.tl/t-Dsohtrdz1N

781663


Wer dem Download nicht traut (kann ich keinem verübeln 😊) kann hier trotzdem nachlesen.

Module1***
Code:
Option Explicit

Public colZutaten As Collection
Public colRezepte As Collection

Public Sub Alkoholfrei_Start()

Set colZutaten = New Collection
Set colRezepte = New Collection

Dim z As Zutat
Dim r As Rezept

Dim s As Shape
Dim i As Integer
Dim c As Integer
Dim ir As Integer

With Sheet1

    For i = 2 To .Cells(.Rows.Count, 3).End(xlUp).Row
       
        Set r = New Rezept
       
        r.lngRow = i
        r.strName = .Cells(i, 3).Value
        r.strZubereitung = .Cells(i, 16).Value
       
        For c = 0 To 5
            If Not (.Cells(i, 5 + c * 2).Value = "" Or .Cells(i, 5 + c * 2).Value = "nicht benötigt") Then
                Set z = New Zutat
                z.strName = .Cells(i, 5 + c * 2).Value
               
                For ir = 2 To Sheet2.Cells(.Rows.Count, 1).End(xlUp).Row
               
                    If StrComp(Sheet2.Cells(ir, 1).Value, z.strName, vbTextCompare) = 0 Then
                   
                        Select Case Sheet2.Cells(ir, 2).Value
                            Case "Ja": z.bStock = True
                            Case Else: z.bStock = False
                        End Select
                   
                    End If
               
                Next ir
               
                On Error Resume Next
                colZutaten.Add z, z.strName
                On Error GoTo 0
               
                r.AddZutat c, z
               
                Set z = Nothing
            End If
        Next c
       
        If Not r.strName = "" Then colRezepte.Add r, r.strName
       
        Set r = Nothing
       
    Next i
       
End With

With UserForm1

    For Each z In colZutaten

        .ListBox1.AddItem z.strName
        If z.bStock Then .ListBox1.Selected(.ListBox1.ListCount - 1) = True

    Next z

    .Show
    .UpdateList

End With

End Sub

UserForm1

Code:
Option Explicit

Private Sub ListBox1_Change()

If Not Me.ActiveControl Is Nothing Then UpdateList

End Sub

Public Sub UpdateList()

Dim li As Integer
Dim r As Rezept
Dim i As Integer

With Me.ListBox1
   
    For Each r In Module1.colRezepte
   
        For i = 0 To 5
                   
            If Not r.GetZutat(i) Is Nothing Then
       
                For li = 0 To .ListCount - 1
                   
                    If StrComp(r.GetZutat(i).strName, .List(li), vbTextCompare) = 0 Then
                   
                        If .Selected(li) Then
                       
                            r.GetZutat(i).bStock = True
                               
                            Select Case i
                                Case 0: r.bZ1 = True
                                Case 1: r.bZ2 = True
                                Case 2: r.bZ3 = True
                                Case 3: r.bZ4 = True
                                Case 4: r.bZ5 = True
                                Case 5: r.bZ6 = True
                            End Select
                               
                        Else
                       
                            r.GetZutat(i).bStock = False
                       
                            Select Case i
                                Case 0: r.bZ1 = False
                                Case 1: r.bZ2 = False
                                Case 2: r.bZ3 = False
                                Case 3: r.bZ4 = False
                                Case 4: r.bZ5 = False
                                Case 5: r.bZ6 = False
                            End Select
                       
                        End If
                   
                    Exit For
                   
                    End If
                   
                Next li
               
            End If
                   
        Next i
               
        r.bPosible = r.bZ1 And r.bZ2 And r.bZ3 And r.bZ4 And r.bZ5 And r.bZ6
           
    Next r
   
End With

Application.ScreenUpdating = False

For Each r In colRezepte
   
    Sheet1.Rows(r.lngRow).Hidden = Not r.bPosible

Next r

Application.ScreenUpdating = True

End Sub

Private Sub UserForm_Terminate()
Sheet1.Rows.Hidden = False
Set colZutaten = Nothing
Set colRezepte = Nothing
End Sub

Klasse Rezept

Code:
Option Explicit

Public lngRow  As Long
Public strName As String
Public sPic    As Shape

Private zZutat(5) As Zutat

Public bZ1 As Boolean
Public bZ2 As Boolean
Public bZ3 As Boolean
Public bZ4 As Boolean
Public bZ5 As Boolean
Public bZ6 As Boolean

Public strZubereitung As String

Public bPosible As Boolean

Private Sub Class_Initialize()

bZ1 = True
bZ2 = True
bZ3 = True
bZ4 = True
bZ5 = True
bZ6 = True

End Sub

Public Sub AddZutat(ByVal i As Integer, ByRef z As Zutat)
   
    If Not z.strName = vbNullString Then
        Set zZutat(i) = z
        Select Case i
            Case 0: bZ1 = False
            Case 1: bZ2 = False
            Case 2: bZ3 = False
            Case 3: bZ4 = False
            Case 4: bZ5 = False
            Case 5: bZ6 = False
        End Select
    End If

End Sub

Public Function GetZutat(ByVal i As Integer) As Zutat

    Set GetZutat = zZutat(i)

End Function

Private Sub Class_Terminate()
End Sub

Klasse Zutat

Code:
Option Explicit

Public strName As String
Public bStock  As Boolean
 
  • Gefällt mir
Reaktionen: Luna&Erick
Naja, man kann alle möglichen Sachen damit machen, kommt halt drauf an wieviel Zeit man investieren will :-)

Momentan wird die Zutatenliste über die Rezepte erstellt, was ein wenig umständlich, da der Bestand am Ende eh gelesen werden muss (ist durchs rumprobieren so entstanden). Mann könnte also erst die Bestandliste laden und wenn du die vorher sortierts....viola :-)

Vielleicht baue ich es später nochmal um.
 
Zurück
Oben