Kurzfassung — Eine
ListBoxzeigt eine Liste und merkt sich, was der Benutzer ausgewählt hat. Füllen Sie sie in einem Zug mitListBox1.List = Range("A2:A50").Value. Lesen Sie eine Einzelauswahl mit.ListIndex(die 0-basierte Zeile, oder-1für nichts) und.Value(der gewählte Text). Die Falle: In dem Moment, in dem.MultiSelectaktiv ist, wird.ValuezuNullund 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,ComboBoxundCheckBoxverbindet - Zwei Wege, eine
ListBoxzu füllen —.List = Range.Valuein einem Zug gegenüber.AddItemin einer Schleife - Wie Sie eine Einzelauswahl mit
.ListIndexund.Valuelesen und was-1bedeutet - Die Falle Nummer eins:
.Valuewird unterMultiSelectzuNull, sodass Sie.Selected(i)durchlaufen müssen - Wie Sie eine Liste leeren, mehrere Spalten zeigen und sie mit
.RowSourcean ein Blatt binden - Wann eine
ListBoxdas richtige Steuerelement ist und wann eineComboBoxbesser 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
