🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA ListBox in Excel — füllen, die Auswahl auslesen und die MultiSelect-Falle

|

VBA ListBox in Excel — füllen, die Auswahl auslesen und die MultiSelect-Falle

Kurzfassung — Eine ListBox zeigt eine Liste und merkt sich, was der Benutzer ausgewählt hat. Füllen Sie sie in einem Zug mit ListBox1.List = Range("A2:A50").Value. Lesen Sie eine Einzelauswahl mit .ListIndex (die 0-basierte Zeile, oder -1 für nichts) und .Value (der gewählte Text). Die Falle: In dem Moment, in dem .MultiSelect aktiv ist, wird .Value zu Null und sagt Ihnen nichts mehr — Sie müssen .Selected(i) durchlaufen, um jede Auswahl einzusammeln.

' Einfachauswahl-ListBox: die eine Auswahl lesen
Private Sub cmdOK_Click()
    If ListBox1.ListIndex = -1 Then
        MsgBox "Please pick a name first."
        Exit Sub
    End If
    MsgBox "You picked " & ListBox1.Value      ' .Value = der ausgewaehlte Text
End Sub

Eine ListBox ist ein Steuerelement auf einem UserForm, und das Erste, was Sie sich klarmachen sollten, ist die eine Idee hinter jedem Steuerelement: Ein Steuerelement ist ein lebendiges Objekt, das Sie über seine Eigenschaften auslesen, nicht der Wert selbst. Die Elemente liegen in .List; die Auswahl des Benutzers liegt in einer eigenen Eigenschaft — .ListIndex oder .Selected — nie im Feld als Ganzem. Fast jede Frage nach dem Muster « meine ListBox liefert nichts » ist ein Lesen der falschen Eigenschaft.

Was Sie lernen

  • Das Denkmodell, das ListBox, ComboBox und CheckBox verbindet
  • Zwei Wege, eine ListBox zu füllen — .List = Range.Value in einem Zug gegenüber .AddItem in einer Schleife
  • Wie Sie eine Einzelauswahl mit .ListIndex und .Value lesen und was -1 bedeutet
  • Die Falle Nummer eins: .Value wird unter MultiSelect zu Null, sodass Sie .Selected(i) durchlaufen müssen
  • Wie Sie eine Liste leeren, mehrere Spalten zeigen und sie mit .RowSource an ein Blatt binden
  • Wann eine ListBox das richtige Steuerelement ist und wann eine ComboBox besser passt

Das Denkmodell: das Feld hält die Liste, eine Eigenschaft hält die Auswahl

Denken Sie an eine ListBox als ein Fenster auf eine Liste von Elementen. Zwei verschiedene Dinge liegen an zwei verschiedenen Orten:

ListBox1.List           ' die ELEMENTE - was im Feld angezeigt wird
ListBox1.ListIndex      ' die AUSWAHL  - welche Zeile markiert ist (0-basiert, -1 = keine)
ListBox1.Value          ' der TEXT der Auswahl - nur bei Einfachauswahl sinnvoll
ListBox1.Selected(i)    ' True/False fuer Zeile i - der einzige verlaessliche Wert bei MultiSelect

Diese Trennung ist das ganze Steuerelement. Wenn Sie .List setzen, laden Sie die Elemente. Klickt der Benutzer auf eine Zeile, ändert VBA nicht .List — es ändert .ListIndex und kippt .Selected. Die Frage « was hat der Benutzer gewählt? » wird also nie durch einen Blick auf die Liste beantwortet; sie wird durch das Lesen der Auswahl-Eigenschaften beantwortet. Machen Sie sich das klar, und der Rest ist Detail.

Eine ListBox füllen: ein Zug schlägt eine Schleife

Sie werden zwei Wege sehen, eine Liste zu füllen. Der, zu dem Sie zuerst greifen sollten, weist eine ganze Spalte auf einmal zu:

Private Sub UserForm_Initialize()
    ' Aus einer Arbeitsblattspalte in einer einzigen Zuweisung fuellen - schnell und einfach
    ListBox1.List = Sheet1.Range("A2:A50").Value
End Sub

.List akzeptiert ein 2-D-Array, und Range.Value ist ein 2-D-Array (siehe VBA Range), sodass eine Zeile fünfzig Zeilen lädt. Verwenden Sie .AddItem nur dann, wenn die Elemente einzeln berechnet werden und Sie kein Array zur Hand haben:

Dim i As Long
For i = 1 To 5
    ListBox1.AddItem "Quarter " & i    ' Elemente hinzufuegen, die man zur Laufzeit aufbaut
Next i

.AddItem in einer großen Schleife ist der langsame Weg — jeder Aufruf ist eine eigene Runde zum Steuerelement. Sitzen die Daten bereits in einem Bereich oder einem Array, weisen Sie .List einmal zu. Um das Feld vor dem Neubefüllen zu leeren, rufen Sie ListBox1.Clear auf.

Eine Einzelauswahl lesen: ListIndex und Value

Bei einer gewöhnlichen ListBox mit Einfachauswahl beantworten zwei Eigenschaften alles. .ListIndex ist die 0-basierte Zeilennummer der Auswahl — und sie ist -1, wenn nichts ausgewählt ist, was die Prüfung ist, die Sie immer zuerst durchführen sollten. .Value ist der Text der ausgewählten Zeile:

If ListBox1.ListIndex = -1 Then
    MsgBox "Nothing selected."          ' -1 ist das Signal fuer noch keine Auswahl
Else
    MsgBox "Row " & ListBox1.ListIndex & ": " & ListBox1.Value
End If

.ListIndex = -1 zu prüfen, bevor Sie .Value lesen, ist der Unterschied zwischen einem Formular, das den Benutzer führt, und einem, das auf eine leere Auswahl hin handelt. Es ist dieselbe Disziplin wie das Absichern eines Find-Ergebnisses, bevor Sie es verwenden.

Die Falle Nummer eins: MultiSelect macht .Value nutzlos

Hier ist der Fehler, der Leute im Kreis laufen lässt. Eine ListBox hat eine MultiSelect-Eigenschaft. Lassen Sie sie auf ihrem Standard (fmMultiSelectSingle), und .Value funktioniert. Setzen Sie sie auf fmMultiSelectMulti oder fmMultiSelectExtended, sodass der Benutzer mehrere Zeilen ankreuzen kann — und .Value wird zu Null. Es spiegelt die Auswahl überhaupt nicht mehr wider, denn « der Wert » ist bedeutungslos, wenn drei Zeilen gewählt sind.

Unter MultiSelect ist der einzige verlässliche Weg, jede Zeile durchzugehen und .Selected(i) zu testen:

Dim i As Long, chosen As String
For i = 0 To ListBox1.ListCount - 1     ' Zeilen sind 0 .. ListCount - 1
    If ListBox1.Selected(i) Then
        chosen = chosen & ListBox1.List(i) & vbCrLf
    End If
Next i
MsgBox "You chose:" & vbCrLf & chosen

Zwei Details entscheiden über diese Schleife. Sie läuft von 0 bis .ListCount - 1, weil Zeilen 0-basiert sind, genau wie Array-Grenzen — ein Off-by-one hier lässt stillschweigend die letzte Zeile fallen. Und sie liest den Elementtext mit .List(i), nicht mit .Value, denn .Value ist in diesem Modus Null. Wenn Sie ein Formular gebaut, später die Mehrfachauswahl eingeschaltet haben und Ihr Code die Auswahl nicht mehr sah, ist das der Grund.

Mehr als eine Spalte und die Bindung an ein Blatt

Zwei Eigenschaften decken die häufigen Fälle nach dem Muster « ich brauche mehr als eine schlichte Liste » ab. .ColumnCount und .List (ein 2-D-Array) lassen eine ListBox mehrere Spalten zeigen — eine ID und einen Namen nebeneinander — während .BoundColumn entscheidet, welche Spalte .Value zurückgibt. Und .RowSource bindet das Feld direkt an einen Arbeitsblattbereich, sodass es die Zellen ohne jeden Füllcode nachführt:

ListBox1.ColumnCount = 2
ListBox1.RowSource = "Sheet1!A2:B50"    ' zwei Spalten, live an das Blatt gebunden
ListBox1.BoundColumn = 1                ' .Value liefert Spalte 1 (die ID)

.RowSource ist bequem, koppelt das Formular aber an ein bestimmtes Blattlayout; .List aus einem Array zuzuweisen hält das Formular unabhängig davon, wo die Daten liegen. Für ein Eingabeformular, das eine einzelne Arbeitsmappe überdauert, ist die Array-Zuweisung vorzuziehen.

ListBox oder ComboBox? Wählen Sie danach, wie sich die Auswahl anfühlen soll

Eine ListBox und eine ComboBox liest man fast identisch, wählen Sie also nach dem Verhalten, nicht nach der Syntax. Greifen Sie zu einer ListBox, wenn die Optionen auf einen Blick sichtbar sein sollen oder wenn der Benutzer mehr als eine wählen darf — die Mehrfachauswahl ist ein Kunststück, das nur die ListBox beherrscht. Greifen Sie zu einer ComboBox, wenn der Platz knapp ist, die Antwort ein einzelner Wert ist und eine Dropdownliste, die auf eine Zeile zusammenklappt, aufgeräumter wirkt. Ertappen Sie sich beim Wunsch nach einem Kontrollkästchen pro Zeile, wollen Sie in Wahrheit eine ListBox mit Mehrfachauswahl.

Wie ExcelMaster hilft

Die zwei Fehler auf dieser Seite kosten echte Zeit: .Value auf einer ListBox mit Mehrfachauswahl zu lesen (und Null zu bekommen) und auf eine Auswahl hin zu handeln, ohne zuvor .ListIndex = -1 zu prüfen. Beide sind leicht geschrieben und scheitern leise.

ExcelMaster lässt Sie das Formular in einfachen Worten beschreiben — « eine Liste von Kunden, aus der der Benutzer mehrere auswählen kann, um die gewählten dann in ein Blatt zu schreiben » — und es verdrahtet das UserForm, füllt die ListBox aus Ihren Daten und liest die Auswahl auf die richtige Weise (durchläuft .Selected(i), wenn Mehrfachauswahl aktiv ist, und sichert .ListIndex ab, wenn nicht). Sie behalten die Arbeitsmappe und den Code.

Häufig gestellte Fragen

Wie fülle ich eine ListBox in VBA aus einem Bereich?

Weisen Sie den Wert des Bereichs in einer einzigen Anweisung .List zu: ListBox1.List = Sheet1.Range("A2:A50").Value. Weil Range.Value ein 2-D-Array ist und .List eines akzeptiert, lädt das die ganze Spalte auf einmal. Verwenden Sie .AddItem nur für Elemente, die Sie einzeln in einer Schleife aufbauen, und rufen Sie zuerst .Clear auf, wenn Sie ein Feld neu befüllen, das bereits Zeilen hat.

Wie hole ich das ausgewählte Element aus einer VBA-ListBox?

Bei einer ListBox mit Einfachauswahl lesen Sie .Value für den Text oder .ListIndex für die 0-basierte Zeilennummer; .ListIndex ist -1, wenn nichts ausgewählt ist, prüfen Sie das also zuerst. Bei einer ListBox mit Mehrfachauswahl ist .Value Null — durchlaufen Sie For i = 0 To ListBox1.ListCount - 1 und sammeln Sie jede Zeile ein, in der .Selected(i) True ist.

Warum ist .Value meiner ListBox leer oder Null?

Weil MultiSelect eingeschaltet ist. Wenn .MultiSelect fmMultiSelectMulti oder fmMultiSelectExtended ist, ist die Eigenschaft .Value immer Null — sie kann mehrere ausgewählte Zeilen nicht darstellen. Lesen Sie die Auswahl stattdessen, indem Sie .Selected(i) von 0 bis .ListCount - 1 durchlaufen, und lesen Sie jedes Element mit .List(i).

Wie leere ich alle Elemente aus einer ListBox?

Rufen Sie ListBox1.Clear auf. Das entfernt jede Zeile. Ist das Feld mit .RowSource gebunden, setzen Sie zuerst .RowSource = "", denn eine gebundene Liste baut sich aus dem Bereich neu auf. Um nur die aktuelle Auswahl zu löschen, ohne Elemente zu entfernen, setzen Sie .ListIndex = -1 (Einfachauswahl) oder durchlaufen .Selected(i) = False (Mehrfachauswahl).

Was ist der Unterschied zwischen einer ListBox und einer ComboBox?

Eine ListBox zeigt mehrere Zeilen auf einmal und kann Mehrfachauswahl erlauben; eine ComboBox klappt auf eine einzelne Zeile zusammen, zeigt eine Dropdownliste und erlaubt nur eine Auswahl (und optional freies Tippen). Verwenden Sie eine ListBox, wenn die Optionen sichtbar oder mehrfach wählbar sein sollen, eine ComboBox, wenn der Platz knapp ist und eine Antwort genügt.

Getestet in

Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 25.09.2026.

Verwandte Anleitungen: VBA ComboBox · VBA CheckBox · VBA UserForm · VBA Range · VBA For Loop