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

VBA ComboBox in Excel — Dropdownliste füllen, die Auswahl lesen und die Falle ListIndex = -1

|

VBA ComboBox in Excel — Dropdownliste füllen, die Auswahl lesen und die Falle ListIndex = -1

Kurzfassung — Eine ComboBox ist eine Dropdownliste: einen Eintrag wählen oder (standardmäßig) den eigenen tippen. Füllen Sie sie mit ComboBox1.List = Range("A2:A50").Value. Sie beantwortet zwei Fragen auf einmal — welcher Eintrag über .ListIndex (0-basiert, -1, wenn der Text nicht in der Liste steht) und welcher Text über .Value. Die Falle: .Value <> "" beweist nur, dass das Feld nicht leer ist, nicht, dass der Benutzer einen echten Eintrag gewählt hat. Brauchen Sie eine gültige Listenauswahl, testen Sie .ListIndex >= 0, oder verbieten Sie das Tippen mit .Style = fmStyleDropDownList.

' Eine ComboBox-Auswahl lesen - darauf bestehen, dass sie aus der Liste kommt
Private Sub cmdOK_Click()
    If ComboBox1.ListIndex = -1 Then
        MsgBox "Please choose an item from the list."
        Exit Sub
    End If
    MsgBox "You chose " & ComboBox1.Value       ' eine echte, durch die Liste gedeckte Auswahl
End Sub

Eine ComboBox ist ein Steuerelement auf einem UserForm, und sie folgt derselben Regel wie jedes andere Steuerelement: Sie lesen die Auswahl über eine Eigenschaft, nicht am Feld selbst ab. Der Unterschied zu einer ListBox ist, dass eine ComboBox eine Zeile zeigt und Tippen annehmen kann — und genau dort wohnt der interessante Fehler.

Was Sie lernen

  • Warum eine ComboBox eine ListBox ist, die auf eine Zeile zusammengeklappt wurde, und sich fast genauso liest
  • Das Füllen mit .List = Range.Value in einem Zug oder .AddItem für berechnete Elemente
  • Die zwei Fragen, die sie beantwortet: welche Zeile (.ListIndex) und welcher Text (.Value)
  • Die Eigenschaft .Style — fmStyleDropDownCombo lässt den Benutzer tippen, fmStyleDropDownList nicht
  • Die Falle Nummer eins: .Value <> "" ist keine gültige Auswahl; testen Sie .ListIndex >= 0
  • Wann eine ComboBox das richtige Steuerelement ist und wann eine ListBox besser passt

Das Denkmodell: eine ListBox auf einer Zeile, die Sie auch tippen lässt

Eine ComboBox ist eine ListBox, zu einer einzelnen Zeile mit einem Auswahlpfeil zusammengefaltet. Sie füllen sie genauso, und Sie lesen sie mit denselben zwei Eigenschaften — aber weil sie auch freien Text annehmen kann, beantwortet sie immer zwei Fragen auf einmal:

ComboBox1.ListIndex   ' WELCHE Zeile gewaehlt ist (0-basiert, -1 = Text nicht in der Liste)
ComboBox1.Value       ' WELCHER Text im Feld steht (ein Listeneintrag ODER das Getippte)

Halten Sie diese beiden auseinander, und das Steuerelement ergibt Sinn. .Value ist was das Feld sagt. .ListIndex ist ob das aus der Liste kam. Wählt der Benutzer aus der Dropdownliste, stimmen beide überein. Tippt der Benutzer etwas Neues, hält .Value den getippten Text und .ListIndex ist -1 — das Signal, dass der Text kein Listeneintrag ist.

Eine ComboBox füllen

Das Füllen ist identisch mit einer ListBox. Weisen Sie eine ganze Spalte auf einmal zu, das ist der schnelle Weg:

Private Sub UserForm_Initialize()
    ComboBox1.List = Sheet1.Range("A2:A50").Value   ' ein Zug aus einer Spalte
End Sub

Range.Value ist ein 2-D-Array und .List akzeptiert eines, sodass eine einzige Zeile die Dropdownliste lädt (siehe VBA Range). Verwenden Sie .AddItem nur für Elemente, die einzeln aufgebaut werden:

Dim i As Long
For i = 1 To 12
    ComboBox1.AddItem "Month " & i     ' berechnete Elemente einzeln hinzufuegen
Next i

Rufen Sie ComboBox1.Clear auf, um sie vor dem Neubefüllen zu leeren. Soll das Feld von Anfang an einen Standard zeigen, setzen Sie nach dem Füllen .ListIndex = 0, oder weisen Sie .Value einem bekannten Eintrag zu.

Style: entscheiden, ob der Benutzer tippen darf

Das ist die Eigenschaft, die Leute übersehen. Eine ComboBox hat ein .Style, das ihren ganzen Charakter steuert:

ComboBox1.Style = fmStyleDropDownCombo   ' Standard: aus der Liste waehlen ODER selbst tippen
ComboBox1.Style = fmStyleDropDownList    ' gesperrt: der Benutzer kann NUR einen Listeneintrag waehlen

fmStyleDropDownCombo ist der Standard — der Benutzer kann alles tippen. fmStyleDropDownList macht die ComboBox zu einem strengen Wähler: Tippen springt nur zu passenden Einträgen, und der endgültige Wert ist immer einer der Ihren. Darf Ihr Formular keinen freien Text annehmen, setzen Sie das .Style — versuchen Sie nicht, es nachträglich wegzuvalidieren.

Die Falle Nummer eins: ein nicht leeres Feld ist keine gültige Auswahl

Hier ist der Fehler, der schlechte Daten durchlässt. Mit dem Standard-Style kann der Benutzer einen Wert tippen, der nicht in Ihrer Liste steht. Prüft Ihr Code nur, dass das Feld nicht leer ist, nimmt er den Tippfehler bereitwillig an:

' WRONG - accepts anything the user typed
If ComboBox1.Value <> "" Then ProcessOrder ComboBox1.Value

' RIGHT - insist the choice came from the list
If ComboBox1.ListIndex >= 0 Then
    ProcessOrder ComboBox1.Value
Else
    MsgBox "Please choose an item from the list, not free text."
End If

.Value <> "" beweist nur, dass irgendetwas im Feld steht. .ListIndex >= 0 beweist, dass der Benutzer einen tatsächlichen Listeneintrag gewählt hat — denn .ListIndex ist -1, sobald der Text getippt statt gewählt wurde. Die Regel ist einfach: Wenn eine gültige Listenauswahl zählt, testen Sie .ListIndex, nie .Value <> "". Soll freier Text überhaupt nie möglich sein, liegt die sauberere Lösung weiter oben — setzen Sie .Style = fmStyleDropDownList, und die Falle kann gar nicht erst auftreten. (Es gibt auch eine .MatchRequired-Eigenschaft, die einen getippten Nichttreffer ablehnt, sobald das Feld den Fokus verliert, aber das .Style zu setzen ist das gröbere, sicherere Werkzeug.)

Value gegenüber Text und auf eine Änderung reagieren

Bei einer ComboBox lesen .Value und .Text meist dieselbe Zeichenfolge. Das, was Sie verwenden werden, ist .Value. .Text zählt, wenn es Ihnen darum geht, was während des Tippens angezeigt wird, bevor die Eingabe bestätigt ist. Um in dem Moment zu reagieren, in dem der Benutzer die Auswahl ändert, behandeln Sie das Change-Ereignis:

Private Sub ComboBox1_Change()
    ' feuert bei jedem Tastendruck und jeder Auswahl - halten Sie es leicht
    Label1.Caption = "Current: " & ComboBox1.Value
End Sub

Weil Change bei jedem Tastendruck in einer tippbaren ComboBox feuert, halten Sie diesen Handler günstig — führen Sie nicht bei jedem Zeichen eine Datenbankabfrage aus.

ComboBox oder ListBox? Wählen Sie nach Platz und Anzahl

Eine ComboBox und eine ListBox teilen ihre Füll- und Leseeigenschaften, wählen Sie also danach, wie sich die Auswahl verhalten soll. Verwenden Sie eine ComboBox, wenn die Antwort ein einzelner Wert ist, der Platz knapp ist und eine zusammengeklappte Dropdownliste aufgeräumter wirkt — oder wenn Sie freies Tippen erlauben wollen. Verwenden Sie eine ListBox, wenn die Optionen auf einen Blick sichtbar sein sollen oder der Benutzer mehr als eine wählen darf; die Mehrfachauswahl ist ein Merkmal, das nur die ListBox hat. Eine ComboBox kann nie mehrere Einträge zurückgeben.

Wie ExcelMaster hilft

Der leise Fehler hier ist eine ComboBox, die annimmt, was immer der Benutzer tippt, weil der Code .Value <> "" statt .ListIndex >= 0 geprüft hat — sodass ein falsch geschriebener Produktname direkt in Ihre Daten fließt.

ExcelMaster lässt Sie das Steuerelement in einfachen Worten beschreiben — « eine Dropdownliste mit Produktcodes, aus der der Benutzer wählen muss, kein freier Text » — und es setzt das richtige .Style, füllt die Liste aus Ihren Daten und liest die Auswahl, indem es .ListIndex testet, sodass nur echte Auswahlen durchkommen. Sie behalten die Arbeitsmappe und den Code.

Häufig gestellte Fragen

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

Weisen Sie den Bereich in einer einzigen Anweisung .List zu: ComboBox1.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 aufbauen, und rufen Sie .Clear auf, bevor Sie ein Feld neu befüllen, das bereits Zeilen hat.

Wie hole ich den ausgewählten Wert aus einer VBA-ComboBox?

Lesen Sie .Value für den Text des aktuellen Eintrags und .ListIndex für die 0-basierte Zeile, aus der er stammt. .ListIndex ist -1, wenn der Text getippt statt aus der Liste gewählt wurde, prüfen Sie also .ListIndex >= 0, bevor Sie auf .Value hin handeln, wenn Sie eine echte Listenauswahl verlangen.

Wie hindere ich den Benutzer daran, freien Text in eine ComboBox zu tippen?

Setzen Sie ComboBox1.Style = fmStyleDropDownList. Das sperrt das Steuerelement auf Listeneinträge — Tippen springt nur zu passenden Einträgen, und der endgültige Wert ist immer einer der Ihren. Der Standard, fmStyleDropDownCombo, erlaubt freies Tippen, weshalb die Validierung mit .ListIndex >= 0 zählt, wenn Sie ihn beibehalten.

Was bedeutet ListIndex = -1 bei einer ComboBox?

Es bedeutet, dass der aktuelle Text keiner der Listeneinträge ist — entweder ist das Feld leer, oder der Benutzer hat etwas getippt, das nicht passt. Eine gültige Auswahl aus der Dropdownliste ergibt immer einen .ListIndex von 0 oder größer, sodass .ListIndex = -1 Ihr Signal ist, die Eingabe abzulehnen oder erneut nachzufragen.

Was ist der Unterschied zwischen einer ComboBox und einer ListBox?

Eine ComboBox zeigt eine Zeile mit einer Dropdownliste, gibt einen einzelnen Wert zurück und kann freies Tippen erlauben; eine ListBox zeigt mehrere Zeilen auf einmal und kann Mehrfachauswahl erlauben. Wählen Sie eine ComboBox für eine kompakte Einzelauswahl, eine ListBox, wenn Optionen sichtbar sein müssen oder der Benutzer mehr als eine wählt.

Getestet in

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

Verwandte Anleitungen: VBA ListBox · VBA CheckBox · VBA UserForm · VBA Range · VBA InputBox