AW: Lebenserleichternde Datei, im Bezug auf die Essensauswahl
26.09.2025 00:54:01
Yal
Hallo Martin,
Excel stellt viele Möglichkeiten zur Verfügung. Dabei ist immer ein paar Tipps zu beachten:
wenn es schön aussieht, macht es oft komplizierter zu verarbeiten.
In deinem Fall, folgende Korrekturen:
im Blatt "Liste" (die eigentlich "Speisen" heissen könnte, da in "Auswahl" auch eine "Liste" steht, oder?),
- die leere Spalte G löschen,
- die Fenster-Fixierung aufheben und alle Zeilen einblenden
- die erste Zeile (Überschrift-Zeile) markieren, ausschneiden und direkt über die Speiseliste (also in Zeile 8) einfügen
- ein Überschrift in Zelle A8 ("Nr") eingeben.
- die Zeile mit Nummer aber ohne Inhalt löschen (wird sonst stören)
- auf diese Zelle bleiben und Menü "Start", "Als Tabelle formatieren". Der Berreich A8:K48 wird automaisch erkannt.
- Du hast jetzt eine Tabelle und wenn Du "drauf" bist (wenn deine aktive Zelle eine Zelle dieser Tabelle ist) erscheint die Kontextmenü "Tabellenentwurf". Hier sineht man auch die Unterschied zwischen ein "Blatt" und eine "Tabelle".
- Darin die Tabellenname "Tabelle1" in "tblSpeisen" ändern (ist aber nicht gross relevant, ausser für diese Beschreibung)
- in L8 den Überschrift "Zufall" eintragen. Es fügt sich eine neue Spalte in der Tabelle, weil eben eine Tabelle
- in L9 die Formel =ZUFALLSZAHL() eintragen. Diese Formel füllt sich in die ganze Spalte, weil Tabelle.
- im Blatt "Auswahl" den Bereich B11:C16 markieren und die Zellenverbindung löschen (wenn Du irgendwas haben möchte, was nicht "einfach" funktioniert, verbinde Zellen!)
- Überschrift "Gericht" von B11 nach C11 versetzen
- Zellen A11:C16 leeren. Der übrige Anzeigebereich ist dann C12:G16
in VBA-Editor wechseln,
Modul2 entfernen
in Modul1 folgende Code einfügen:
Sub Zufall_sortieren()
'
' Zufall_sortieren Makro
'
Application.Calculate
With ActiveWorkbook.Worksheets("Liste").ListObjects("tblSpeisen").Sort
.SortFields.Clear
.SortFields.Add2 Key:=Range("tblSpeisen[[#All],[Zufall]]"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
Sub Gericht_auflisten()
Dim LC As ListColumn
Dim LR As ListRow
Dim i
Dim Auswahl
'Zielbereich leeren
Worksheets("Auswahl").Range("C12:G16").ClearContents
'Zufall generieren
Zufall_sortieren
'Auswahl lesen
Auswahl = Worksheets("Auswahl").Range("B9:F9").Value
With Range("tblSpeisen").ListObject
'Filter auf Speisen zurücksetzen
For Each LC In .ListColumns
.Range.AutoFilter Field:=LC.Index 'Filter resetten
Next
'Auswahl als Filter einsetzen
For i = 1 To UBound(Auswahl, 2)
If Auswahl(1, i) > "" Then .Range.AutoFilter Field:=i + 1, Criteria1:=Auswahl(1, i)
Next
'Lesen und übertragen
i = 1
For Each LR In .ListRows
If Not LR.Range.EntireRow.Hidden Then
LR.Range.Range("G1:K1").Copy Worksheets("Auswahl").Cells(11 + i, 3) 'G1:k1 ist eine relative Adressierung. "1" entspricht die ListRow
i = i + 1
If i > 5 Then Exit For
End If
Next
End With
End Sub
VBA-Editor schliessen.
Im Blatt "Auswahl" die Schaltfläche "Filter" rechtsklicken, "Makro zuweisen" und Makro "Gericht_auflisten" zuweisen.
Datei speichern.
Fertig.
Das Gesamt sieht dann so aus: https://www.herber.de/bbs/user/179064.xlsm
Es kommt in der aktuelle Stand öfter vor, dass keine Speise die Filterung entspricht. Dann hat man eine leere Auswahlliste.
VG
Yal