Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA: Wenn Listbox leer, mal Listindex = 0 mal = -1

VBA: Wenn Listbox leer, mal Listindex = 0 mal = -1
07.09.2018 08:11:13
Jessi

Hallo zusammen,
ich habe ein Problem mit meiner Listbox. Ich habe eine Excel-Datei ("Ziel.xlsm") mit der eine andere Excel-Datei ausgewertet wird. Meine Datei ("Ziel.xlsm") mit Makro bleibt immer die gleiche. Jedoch kann die Datei, auf die sie sich bezieht variieren. Es funktioniert soweit alles, wie geplant. Die andere Datei heißt immer "Basis.xlsx" und ist vom Aufbau immer gleich. Lediglich die Daten sind unterschiedlich (Also die Zahlenwerte, da sie zu unterschiedlichen Projekten gehören).
Das Problem ist, wenn kein Eintrag aus der Listbox 1 ausgewählt wurde, dann ist beim Öffnen der 1. Datei "Basis" der Listindex = -1, wenn kein Eintrag ausgewählt wurde.
Daraufhin erscheint eine Msgbox.
Wenn ich nun aber die "Basis"-Datei eines anderen Projektes öffne, ist hier standardmäßig der Listindex = 0, wenn kein Eintrag ausgewählt wurde.
Momentan passe ich jedes mal den Code an. Ich setzte also meine If-Bedingungen jedes mal neu (entweder If Listbox1.Listindex = 0 oder eben = -1).
Ich kann leider nicht mit Kann ich den Listindex irgendwie festsetzen (evtl. bevor sie überhaupt gefüllt wird?), sodass eine universale Lösung erschafft wird? Jedes mal den Code individualisieren ist nicht gerade die beste Lösung.
Ich hoffe, jemand versteht, was ich meine und kann mir helfen.
Viele Grüße
Jessi
PS: Ich arbeite mit Excel 2016, gibt's leider im Eingabeformular noch nicht zur Auswahl.
(Falls jemand den Code braucht:)
Public Sub UserForm_Initialize()  Liste gefüllt, Basis Tabelle muss vorhanden und geöffnet sein
With Workbooks("Basis.xlsx").Worksheets("Tabelle1")
For I = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
Listbox1.AddItem .Cells(I, 4)
Next
End With
End Sub
Public Sub Button_OK_Click()
If Listbox1.ListIndex = -1 Then 'Or Listbox1.ListIndex = 0 Then
MsgBox "Bitte einen Eintrag auswählen."
Exit Sub
Else
With Workbooks("Ziel.xlsm").Worksheets("Kosten")
LZZiel = .Cells(Rows.Count, 3).End(xlUp).Row
Windows("Ziel.xlsm").Activate
For J = 0 To UserForm1.Listbox1.ListCount - 1
If UserForm1.Listbox1.Selected(J) Then                                         _
_

Ab hier wird bei der zweiten "Basis"-Datei nichts mehr erkannt. Erst wenn man
If Listbox1.Listindex = 0 then
Else ...
setzt läuft der Code. Wenn man mit dem Cursor über die letzte (fette) Zeile fährt, erscheint "Eigenschaft Selected konnte nicht abgerufen werden"
Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA: Wenn Listbox leer, mal Listindex = 0 mal = -1
07.09.2018 09:20:30
daniel
Hi
in einer Multiselect-Listbox funktioniert das mit dem Listindex nicht, der ist nur in einer SingelSelect-Listbox sinnvoll anwendbar.
wenn du wissen willst, ob überhaupt was ausgewählt wurde, nimm eine Schleife:
for i = 0 to listbox1.ListCount - 1
if Listbox1.Selected(i) then Exit for
Next
if i = Listbox1.ListCount Then
Msgbox "Bitte wählen Sie einen Eintrag aus"
Exit Sub
End if
die Prüfung geht hier so, dass die Schleife nur dann vollständig durchlaufen wird, wenn kein Eintrag ausgewählt wurde, ansonsten wird vorzeitig abgebrochen.
Eine vollständig durchlaufenen Schleife erkennt man daran, dass der Schleifenzähler größer ist als der Schleifenendwert. (bzw kleiner bei negativem Step)
Gruß Daniel
Anzeige
AW: VBA: Wenn Listbox leer, mal Listindex = 0 mal = -1
07.09.2018 09:56:21
Jessi
Danke für die schnelle Antwort. Hätte vielleicht noch erwähnen können, dass es eine Multiselect Listbox ist...
Auf jeden Fall funktioniert es super! Vielen lieben Dank !
Gruß Jessi
;
Anzeige
Anzeige

Infobox / Tutorial

Umgang mit Listboxen in Excel VBA: Listindex-Probleme lösen


Schritt-für-Schritt-Anleitung

  1. UserForm initialisieren: Stelle sicher, dass Deine UserForm korrekt initialisiert wird, indem Du den folgenden Code in das UserForm_Initialize-Ereignis einfügst:

    Public Sub UserForm_Initialize()
       With Workbooks("Basis.xlsx").Worksheets("Tabelle1")
           For I = 2 To .Cells(Rows.Count, 1).End(xlUp).Row
               Listbox1.AddItem .Cells(I, 4)
           Next
       End With
    End Sub
  2. Überprüfung des Listindex: Nutze die folgende Schleife, um zu überprüfen, ob in der Listbox etwas ausgewählt wurde. Dies funktioniert besonders gut für eine Multiselect-Listbox:

    Public Sub Button_OK_Click()
       Dim i As Integer
       For i = 0 To Listbox1.ListCount - 1
           If Listbox1.Selected(i) Then Exit For
       Next
       If i = Listbox1.ListCount Then
           MsgBox "Bitte wählen Sie einen Eintrag aus."
           Exit Sub
       End If
    
       ' Dein weiterer Code hier
    End Sub

Häufige Fehler und Lösungen

  • Fehler: Listindex = -1 oder 0: Wenn beim Öffnen der Datei der Listindex entweder -1 oder 0 ist, bedeutet dies, dass kein Eintrag ausgewählt wurde. Verwende die oben genannte Schleife zur Überprüfung, um diese Problematik zu umgehen.

  • Fehler: Selected-Eigenschaft nicht abrufbar: Dieser Fehler tritt auf, wenn Du versuchst, auf die Selected-Eigenschaft einer Multiselect-Listbox zuzugreifen, ohne sicherzustellen, dass der Index gültig ist. Die Schleife, die wir implementiert haben, hilft, dies zu vermeiden.


Alternative Methoden

Eine alternative Methode zur Handhabung des Listindex ist die Verwendung von ListCount. Du kannst prüfen, ob ListCount größer als 0 ist, bevor Du auf den Listindex zugreifst. Zum Beispiel:

If Listbox1.ListCount > 0 Then
    ' Hier kannst Du auf den Listindex zugreifen
Else
    MsgBox "Die Listbox ist leer."
End If

Praktische Beispiele

Hier ist ein einfaches Beispiel, wie Du eine Listbox füllen und die Auswahl überprüfen kannst:

Private Sub UserForm_Initialize()
    ' Listbox mit Daten füllen
    Listbox1.AddItem "Eintrag 1"
    Listbox1.AddItem "Eintrag 2"
    Listbox1.AddItem "Eintrag 3"
End Sub

Private Sub Button_OK_Click()
    Dim i As Integer
    For i = 0 To Listbox1.ListCount - 1
        If Listbox1.Selected(i) Then
            MsgBox "Du hast " & Listbox1.List(i) & " ausgewählt!"
            Exit Sub
        End If
    Next
    MsgBox "Bitte wähle einen Eintrag aus."
End Sub

Tipps für Profis

  • Verwende optionale Parameter: Wenn Du mit Listindex arbeitest, kannst Du optionale Parameter einbauen, um die Funktionalität zu erweitern, wie z.B. die Möglichkeit, eine Standardauswahl zu treffen.

  • Debugging: Nutze die Debugging-Tools in Excel VBA, um herauszufinden, warum der Listindex nicht wie erwartet funktioniert. Setze Haltepunkte und überprüfe die Werte während der Ausführung.


FAQ: Häufige Fragen

1. Warum ist mein Listindex manchmal -1?
Der Listindex ist -1, wenn kein Element in der Listbox ausgewählt wurde. Dies kann passieren, wenn die Listbox leer ist oder wenn der Benutzer keine Auswahl trifft.

2. Wie kann ich sicherstellen, dass ein Eintrag in einer Multiselect-Listbox ausgewählt ist?
Verwende eine Schleife, um alle Einträge zu überprüfen. Wenn kein Eintrag ausgewählt ist, kannst Du eine entsprechende Nachricht anzeigen.

3. Funktionieren diese Methoden in älteren Excel-Versionen?
Ja, die beschriebenen Methoden funktionieren in Excel VBA ab Version 2010 und höher, einschließlich Excel 2016.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige