Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Listbox füllen ohne Leerzellen

Forumthread: Listbox füllen ohne Leerzellen

Listbox füllen ohne Leerzellen
11.04.2016 10:46:44
Robby

Guten Morgen liebe Herber Excel Community,
in meiner Datei geht es um ein kleines Stundenplan Programm. Soweit geht auch alles, im jetzigen Projektstatus, aber ich kann die Listboxen in der UserForm 6 nur mit Leerzeilen aus der Tabelle "K2" befüllen. Ich habe jetzt schon sehr viel im Netz recherchiert, aber habe nichts gefunden. Könnte mir vielleicht einer von euch Profis mir bei der Lösung helfen?
Vielen lieben Dank schon mal im voraus.
https://www.herber.de/bbs/user/104886.xlsm

Anzeige

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Listbox füllen ohne Leerzellen
11.04.2016 12:53:48
Peter Feustel
Hallo Robby,
das sollte doch so funktionieren:
Private Sub UserForm_Initialize()
For i = 1 To Sheets("K2").Cells(1, Cells.Columns.Count).End(xlToLeft).Column
If Sheets("K2").Cells(1, i).Value <> "" Then
ListBox1.AddItem Sheets("K2").Cells(1, i)
ListBox2.AddItem Sheets("K2").Cells(1, i)
ListBox3.AddItem Sheets("K2").Cells(1, i)
ListBox4.AddItem Sheets("K2").Cells(1, i)
ListBox5.AddItem Sheets("K2").Cells(1, i)
End If
Next i
ListBox1.ListIndex = 0
End Sub

Gruß Peter

Anzeige
AW: Listbox füllen ohne Leerzellen
11.04.2016 13:12:57
ChrisL
Hi Robby
Probier mal...
Private Sub ListBox1_Click()
Call LBfuellen(ListBox1, ListBox6)
End Sub

Private Sub ListBox2_Click()
Call LBfuellen(ListBox2, ListBox7)
End Sub

Private Sub ListBox3_Click()
Call LBfuellen(ListBox3, ListBox8)
End Sub

Private Sub ListBox4_Click()
Call LBfuellen(ListBox4, ListBox9)
End Sub

Private Sub ListBox5_Click()
Call LBfuellen(ListBox5, ListBox10)
End Sub

Private Sub LBfuellen(LB1, LB2)
Dim tempSpalte As Integer
Dim iZeile As Long
LB2.Clear
With Sheets("K2")
tempSpalte = Application.Match(LB1.List(LB1.ListIndex), .Rows(1), 0)
For iZeile = 2 To .Cells(.Rows.Count, tempSpalte).End(xlUp).Row
If .Cells(iZeile, tempSpalte) <> "" Then LB2.AddItem .Cells(iZeile, tempSpalte)
Next iZeile
End With
End Sub

Private Sub UserForm_Initialize()
Dim i As Integer
With Sheets("K2")
For i = 1 To .Cells(1, .Cells.Columns.Count).End(xlToLeft).Column
ListBox1.AddItem .Cells(1, i)
ListBox2.AddItem .Cells(1, i)
ListBox3.AddItem .Cells(1, i)
ListBox4.AddItem .Cells(1, i)
ListBox5.AddItem .Cells(1, i)
Next i
ListBox1.ListIndex = 0
Call LBfuellen(ListBox1, ListBox6)
End With
End Sub

Mit solchen Zeilen musst du aufpassen, dass du alles referenzierst:
Sheets("K2").Cells(1, Cells.Columns.Count).End(xlToLeft).Column
Cells.Columns.Count bezieht sich auf das gerade aktive Blatt. Richtig wäre:
Sheets("K2").Cells(1, Sheets("K2").Cells.Columns.Count).End(xlToLeft).Column
cu
Chris

Anzeige
AW: Listbox füllen ohne Leerzellen
11.04.2016 14:16:17
Robby
Vielen lieben Dank. Es hat so wie Du es beschrieben hast, funktioniert ChrisL. DANKE SCHÖN

AW: Listbox füllen ohne Leerzellen
11.04.2016 21:45:53
Robby
Hallo ChrisL,
also wie gesagt dein Vorschlag funktioniert soweit, allerdings habe ich jetzt gesehen das, wenn ich z.B. einen Teilnehmer in der Listbox6 anklicke, dieser nicht ins Tabllenblatt übernommen wird. Kannst du mir da noch einen Tipp geben?
Tabellenblatt "Stundenplan"
Lg Robby

Anzeige
AW: Listbox füllen ohne Leerzellen
11.04.2016 22:12:14
Robby
Und ich nochmal,
gibt es denn in diesem Zuge auch die Möglichkeit einer automatischen Auswahl. Also, das heißt ich wähle in der Listbox1 eine Gruppe aus. Zu jeder Gruppe bzw. Fachbereich wurden Teilnehmer zugeordnet und werden dann in Listbox6 (der darunter) angezeigt. Diese Wiederum sollen dann in die Tabelle "Stundenplan" beim Klick auf den Button "Komplette Auswahl übernehmen" geschrieben werden. Aktuell ist es ja so das ich jeden anklicken muss und dann wird er auch übernommen. Also wenn das wieder funktioniert.
Hat da jemand von euch eine Idee? Ich wäre sehr dankbar dafür.
Lg Robby

Anzeige
AW: Listbox füllen ohne Leerzellen
12.04.2016 08:25:49
ChrisL
Hi Robby
Für deine Anschlussfragen habe ich heute leider keine Zeit. Ich lasse die Frage darum offen.
cu
Chris

AW: Listbox füllen ohne Leerzellen
12.04.2016 12:34:16
ChrisL
Hi Robby
Ich hatte jetzt doch noch kurz Zeit mir die Sache anzuschauen. Hierbei sind einige Unklarheiten aufgetaucht.
Wir haben auf Userform6 insgesamt 5 ListBox (+nochmals 5 für Titel). Im Blatt Stundenplan hast du aber 8 Spalten. Wenn ich nun alles übernehme, dann sind max. 5 Spalten gefüllt. Wofür sind die verbleibenden?
Wenn ich jetzt 5 Spalten übernehme. Anschliessend die Listbox 1-5 ändere und erneut übernehme, sollen dann die bestehenden 5 Spalten überschrieben werden oder sind es dann plötzlich 10 Spalten?
Die Zeiten auf dem Stundenplan können ignoriert werden?
Und dass bei Klick auf ListBox 6-10 nichts passiert ist ja nicht weiter verwunderlich. Es fehlt der Code. Angenommen man macht ein Click-Ereignis für ListBox 6-10, dann braucht es keine "Komplette Auswahl übernehmen" mehr, da ja dann immer sofort aktualisiert wird.
Fazit, das ganze ergibt keinen Sinn oder der Sinn erschliesst sich mir zu mindest nicht.
cu
Chris

Anzeige
AW: Listbox füllen ohne Leerzellen
12.04.2016 15:29:00
Robby
Hi Chris,
und vielen Dank dafür das du nochmal drüber geschaut hast.
Also zum Verständnis meiner Userform6.
Listbox1-5 sollen die Auswahl für die Gruppen sein. Z.B. G 1, G 2, Farbe, usw. Wenn ich dann z.B. in der Listbox1 die Auswahl G 1 mache, sind dieser Auswahl bzw. Gruppe schon Teilnehmer zugeordnet und werden dann in der darunterliegenden Listbox6 angezeigt.
5 UserFormen (also 5 Gruppen) ist in unserem Haus Standard und des auch erstmal so angelegt. Aber es kommt vor das wir aus 5 Gruppen, mal 6 oder gar 7 machen müssen. Dafür werde ich dann weitere Userformen anlegen. Deshalb sind in der Tabelle "Stundenplan" auch 8 Spalten eingerichtet. Befüllt werden aber vorerst die ersten 5.
So zur Übernahme der Daten aus den Listboxen. Listbox1-5 werden oben bei den Farben eingetragen. Die Teilnehmer entsprechend darunter.
Die Zeiten müssen bei uns auf dem Plan stehen, deshalb sollen die Eintragungen auch erst ab Spalte B beginnen. Der Button "Komplett übernehmen" macht deshalb für mich Sinn, da erst der Stundenplan in den UserFormen erstellt werden soll (optisch) zum anschauen und wenn alle Gruppen passen und die Lehrer/ Ausbilder/ Dozenten eintragen mit Fach und Raum, soll alles mit einmal übernommen werden.
Oje ich hoffe das dass jetzt Verständlich ist.
Lg Robby

Anzeige
AW: Listbox füllen ohne Leerzellen
12.04.2016 17:52:24
ChrisL
Hi Robby
Ich versuche es noch einmal.
Mein Verständnis zu Blatt "Stundenplan": Die letzten Spalten können ignoriert werden, ebenso ab Zeile 34. Folglich findet der Übertrag im Bereich B1:F33 statt, Zeile 1 ist dabei der Titel.
Weiter entnehme ich, dass das Userform6 nur der Visualisierung dient. Soweit OK, auch wenn ich persönlich einen Filter auf Blatt Teilnehmer gesetzt hätte. So kannst du Filterkriterien kombinieren. Was ich meine: Wenn du in ListBox1 die Auswahl z.B. Gruppe1 triffst, in ListBox2 z.B. Farbe, dann haben die ListBoxen keinen Zusammenhang. Teilnehmer der Gruppe1 machen nicht zwingend bei der Aktivität Farbe mit.
In den ListBoxen behandelst du Gruppe und Aktivität gleichwertig. Übernehmen wir diese ListBoxen nun in den Stundenplan hast du ein wildes Gemisch aus Gruppen und Aktivitäten (oder nur Gruppen und nur Aktivitäten).
Mag sein, dass dies alles gewollt ist, dann ist auch OK.
Wenn jetzt Userform6 nur zur Visualisierung dient, wozu dann eine Auswahl. Eine Auswahl in ListBox1-5 macht irgendwie Sinn d.h. entscheidet welche Gruppen und/oder Aktivitäten in den Stundenplan übertragen werden sollen. Eine Auswahl bei den Teilnehmern (ListBox6-10) verstehe ich nicht, weil die ja vorbestimmt sind. Was ich mir auch noch vorstellen könnte, die Teilnehmerzahl ist begrenzt und darum triffst du eine Auswahl. In diesem Fall müsste die Auswahl nicht auch gespeichert werden resp. die Teilnehmerliste angepasst?
Und die letzte Frage/Anmerkung. "K2" ist nur ein Hilfsblatt und könnte auch elminiert werden?
cu
Chris

Anzeige
AW: Listbox füllen ohne Leerzellen
12.04.2016 22:18:27
Robby
Hallo Chris,
erstmal bin ich echt begeistert, dass du dich diesem Projekt so widmest. Zum Hintergrund nochmal. Das ist ein Stundenplan für einen Tag. Der wird also für jeden Tag neu erstellt. Mo und Di haben wir allgemeinbildenden Unterricht und Mi bis Fr, Fachunterricht. Einige Teilnehmer sind also zum Beispiel Mo und Di immer in Gruppe 2. Aber Mi sind wiederum diese TN in unterschiedlichen Fachbereichen. Und wiederum Do und Fr woanders. Aus diesem Grund habe ich die Tabelle K2 erstellt und die UserForm2. In dieser werden alle TN einmal angelegt und in die Tabelle geschrieben. Jetzt soll man einen Stundenplan für z.B. Montag erstellen. Also Gruppe 1 - 5. Hier sind jetzt die TN zugeordnet und werden in den Listboxen6-10 angezeigt. Warum? Jetzt wird es tricky. Denn und das muss zwingend im Stundenplan Programm funktionieren. Manche TN sind Krank oder im Praktikum und sollen dann rot markiert werden und deshalb auch die Möglichkeit des einzelnen anklickens. Leider habe ich da noch keine konkrete Lösung wie ich das umsetze, aber wie gesagt ohne diese Option wird man das Excel Programm nicht nutzen. Der Tabellenbereich unterhalb wird auch genutzt. Hier werden die Stunden mit Lehrer, Fach und Raum eingetragen. Das habe ich auch schon soweit. Da ich aber gerade vom Handy schreibe kann ich erst morgen hier die aktuelle Datei zur Verfügung stellen. Aber wenn du einen anderen Ansatz siehst, lass es mich wissen und nun hoffe ich es gut erklärt zu haben. Lg Robby

Anzeige
AW: Listbox füllen ohne Leerzellen
13.04.2016 14:45:20
ChrisL
Hi Robby
Ich muss ja nicht alles verstehen...
Mit nachstehenden Codezeilen verabschiede ich mich dann auch, da ich irgendwann auch meine Brötchen verdienen muss.
Private Sub CommandButton5_Click()
Worksheets("Stundenplan").Range("B1:F33").ClearContents
Call AllesUebernehmen(ListBox1)
Call AllesUebernehmen(ListBox2)
Call AllesUebernehmen(ListBox3)
Call AllesUebernehmen(ListBox4)
Call AllesUebernehmen(ListBox5)
End Sub

Private Sub AllesUebernehmen(LB)
If LB.ListIndex > -1 Then
Dim WS1 As Worksheet, WS2 As Worksheet
Dim iZeile As Long, iCounter As Long
Dim tempSpalte1 As Integer, tempSpalte2 As Integer
Set WS1 = Worksheets("K2")
Set WS2 = Worksheets("Stundenplan")
tempSpalte1 = Application.Match(LB.List(LB.ListIndex), WS1.Rows(1), 0)
tempSpalte2 = WS2.Range("I1").End(xlToLeft).Column + 1
WS2.Cells(1, tempSpalte2) = LB.List(LB.ListIndex)
For iZeile = 2 To WS1.Cells(WS1.Rows.Count, tempSpalte1).End(xlUp).Row
If WS1.Cells(iZeile, tempSpalte1) <> "" Then
iCounter = iCounter + 1
WS2.Cells(iCounter + 1, tempSpalte2) = WS1.Cells(iZeile, tempSpalte1)
End If
Next iZeile
End If
End Sub
Private Sub ListBox6_Change()
Call AuswahlUebernehmen(ListBox1, ListBox6)
End Sub

Private Sub ListBox7_Change()
Call AuswahlUebernehmen(ListBox2, ListBox7)
End Sub

Private Sub ListBox8_Change()
Call AuswahlUebernehmen(ListBox3, ListBox8)
End Sub

Private Sub ListBox9_Change()
Call AuswahlUebernehmen(ListBox4, ListBox9)
End Sub

Private Sub ListBox10_Change()
Call AuswahlUebernehmen(ListBox5, ListBox10)
End Sub

Private Sub AuswahlUebernehmen(LB1, LB2)
Dim tempSpalte As Integer, i As Long
With Worksheets("Stundenplan")
If WorksheetFunction.CountIf(.Rows(1), LB1.List(LB1.ListIndex)) = 0 Then
tempSpalte = .Range("I1").End(xlToLeft).Column + 1
.Cells(1, tempSpalte) = LB1.List(LB1.ListIndex)
Else
tempSpalte = Application.Match(LB1.List(LB1.ListIndex), .Rows(1), 0)
End If
.Range(.Cells(2, tempSpalte), .Cells(33, tempSpalte)).ClearContents
For i = 0 To LB2.ListCount - 1
If LB2.Selected(i) = True Then _
.Cells(33, tempSpalte).End(xlUp).Offset(1, 0) = LB2.List(i)
Next i
End With
End Sub

cu
Chris

Anzeige
AW: Listbox füllen ohne Leerzellen
14.04.2016 21:30:59
Robby
Hallo Chris,
und vielen lieben Dank für deine Mühen. Ich komme erst morgen dazu diesen Code einzufügen und dir zu sagen ob alles klappt.

;
Anzeige

Infobox / Tutorial

Listbox in Excel füllen ohne Leerzellen


Schritt-für-Schritt-Anleitung

Um eine Listbox in einer UserForm in Excel VBA zu füllen und dabei Leerzellen zu ignorieren, kannst du den folgenden Code verwenden. Dieser wird beim Initialisieren der UserForm aufgerufen:

Private Sub UserForm_Initialize()
    Dim i As Integer
    With Sheets("K2")
        For i = 1 To .Cells(1, .Cells.Columns.Count).End(xlToLeft).Column
            If .Cells(1, i).Value <> "" Then
                ListBox1.AddItem .Cells(1, i)
                ListBox2.AddItem .Cells(1, i)
                ListBox3.AddItem .Cells(1, i)
                ListBox4.AddItem .Cells(1, i)
                ListBox5.AddItem .Cells(1, i)
            End If
        Next i
        ListBox1.ListIndex = 0
        Call LBfuellen(ListBox1, ListBox6)
    End With
End Sub

In diesem Code wird überprüft, ob die Zelle in der ersten Zeile nicht leer ist, bevor sie zur Listbox hinzugefügt wird.


Häufige Fehler und Lösungen

  1. Leerzeilen werden trotzdem angezeigt: Stelle sicher, dass die Bedingung If .Cells(1, i).Value <> "" korrekt implementiert ist. Wenn du die Bedingung weglässt, können Leerzeilen in die Listbox aufgenommen werden.

  2. Referenzierung des Blattes: Achte darauf, dass du das Tabellenblatt korrekt referenzierst. Anstelle von Cells.Columns.Count solltest du .Cells.Columns.Count verwenden, um das aktive Blatt zu vermeiden.

  3. Fehlende Elemente in der Listbox: Wenn Elemente in der Listbox nicht angezeigt werden, könnte es sein, dass die Zellen in der Quelltabelle tatsächlich leer sind oder nur unsichtbare Zeichen enthalten.


Alternative Methoden

Eine weitere Methode, um die Listbox zu füllen, ist die Verwendung einer Schleife in Kombination mit einem benutzerdefinierten Sub:

Private Sub ListBox1_Click()
    Call LBfuellen(ListBox1, ListBox6)
End Sub

Private Sub LBfuellen(LB1 As MSForms.ListBox, LB2 As MSForms.ListBox)
    Dim tempSpalte As Integer
    Dim iZeile As Long
    LB2.Clear
    With Sheets("K2")
        tempSpalte = Application.Match(LB1.List(LB1.ListIndex), .Rows(1), 0)
        For iZeile = 2 To .Cells(.Rows.Count, tempSpalte).End(xlUp).Row
            If .Cells(iZeile, tempSpalte) <> "" Then LB2.AddItem .Cells(iZeile, tempSpalte)
        Next iZeile
    End With
End Sub

Hier wird die Funktion LBfuellen aufgerufen, wenn der Benutzer ein Element in der ersten Listbox auswählt. Diese Methode ermöglicht eine dynamische Aktualisierung der zweiten Listbox, basierend auf der Auswahl.


Praktische Beispiele

  1. Füllen mehrerer Listboxen: Du kannst mehrere Listboxen in einer UserForm füllen, indem du die oben genannten Methoden anpasst. Jede Listbox kann auf eine andere Datenquelle in deinem Arbeitsblatt zeigen.

  2. Automatische Auswahl basierend auf einer ersten Listbox: Wenn du eine Auswahl in ListBox1 triffst, kannst du die entsprechenden Teilnehmer in ListBox6 anzeigen lassen, wie im Beispiel beschrieben.


Tipps für Profis

  • Verwende ListView für mehr Flexibilität: Wenn du mehr Kontrolle über das Layout und die Darstellung benötigst, ziehe in Betracht, eine ListView anstelle einer Listbox zu verwenden. Die vba listview füllen Methode bietet zusätzliche Optionen zur Darstellung von Daten.

  • Optimiere die Performance: Wenn du mit großen Datenmengen arbeitest, kann es hilfreich sein, die Berechnungen während des Füllens der Listbox auszuschalten, indem du Application.ScreenUpdating = False und Application.Calculation = xlCalculationManual verwendest.


FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass nur eindeutige Werte in der Listbox angezeigt werden?
Du kannst eine Collection verwenden, um doppelte Einträge zu vermeiden, bevor du sie zur Listbox hinzufügst.

2. Welche Excel-Version benötige ich für diese Methoden?
Die beschriebenen Methoden funktionieren in Excel 2007 und späteren Versionen, die VBA unterstützen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige