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

Forumthread: VBA ListBox Deselect

VBA ListBox Deselect
08.12.2015 11:09:20
IKE
Meine Listbox ist eine single select box, die beim einfachen Click auf ein Element Code ausführt (eine MessageBox anzeigt). Das ausgewählte Element wird in der ListBox blau hinterlegt und der Code wird ausgeführt. Das Element wird anschließend mit .Selected(.ListIndex) = False de-selektiert. Das funktioniert auch und der .ListIndex wird auf -1 gesetzt, da kein Element ausgewählt wurde.
Durch den .ListIndex-Change wird die Prozedur erneut aufgerufen und sollte ohne irendwelche Aktion zum Ende kommen, da .ListIndex ja -1 ist. Tatsächlich nimmt .ListIndex aber wieder den alten Wert (z.B. 2) an und die alte blaue Markiertung des Elements bleibt erhalten. Die Markierung sollte eigentlich leer sein und .ListIndex -1. Der Code in der Prozedur wird dadurch erneut ausgeführt.
Es scheint ein Fehler zu sein, der nur einmal auftritt, da die Prozedur nicht unendlich oft, sondern nur 2 Mal ausgeführt wird.
Hier ist die (verkürzte) Prozedur:
Private Sub lboStarSigns_Click()
With Me.lboStarSigns
If .ListIndex > -1 Then
'execute this code
... code ...
.Selected(.ListIndex) = False
End If
End With
End Sub
Hat jemand ein Idee, was der Fehler ist?

Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA ListBox Deselect
08.12.2015 11:18:37
Daniel
Hi
wenn du nur mit der Maus arbeitest, könntest du das MouseUp-Event anstelle des Click-Events verwenden.
damit funktioniert es wie gewünscht, weil es etwas später einsetzt als das Click-Event (nach dem Klick) und es führt auch nicht zum Selbstaufruf bei Änderung des Listindexes.
du kannst auch den Listindex direkt auf -1 setzen, um den Eintrag wieder abzuwählen, du musst da nicht über das .Selected gehen:
.ListIndex = -1
Gruß Daniel

Anzeige
AW: VBA ListBox Deselect
08.12.2015 13:25:25
IKE
Hallo Daniel,
danke für Deine Hilfe. Das MouseUp-Event funktioniert. Offenbar ist es wirklich ein Timing Problem. MouseUp ruft die Procedure nicht nochmal auf und erlaubt auch die Deselection der Position in der Listbox mit .ListIndex = -1.
Gruß INGO

AW: VBA ListBox Deselect
08.12.2015 11:27:41
Rudi
Hallo,
du musst feststellen ob der Click durch Code ausgelöst wird.
Schema:
Option Explicit
Dim bolCode As Boolean
Private Sub ListBox1_Click()
If Not bolCode Then
With ListBox1
If .ListIndex > -1 Then
MsgBox .Value
bolCode = True
.ListIndex = -1
End If
End With
Else
bolCode = False
End If
End Sub
Gruß
Rudi

Anzeige
AW: VBA ListBox Deselect
08.12.2015 12:56:55
IKE
Hallo Rudi,
danke für die schnelle Antwort. Offenbar löst der Code den Click aus. Dennoch bleibt in der ListBox das gewählte Element blau markiert und der .ListIndex behält den alten Wert, obwohl .ListIndex = -1 gesetzt wurde. Dies scheint das Problem zu sein. Habe es auch mit der Brachial-Methode .Clear und erneut .AddItem versucht. Das Markierungsproblem bleibt aber dennoch erhalten. Gibt es sowas wie Repaint für ListBoxen?
Der Code lautet jetzt (verkürzt):
Option Explicit
Dim bCode As Boolean
Private Sub lboStarSigns_Click()
If Not bCode Then
With Me.lboStarSigns
If .ListIndex > -1 Then
MsgBox .Value
.ListIndex = -1
bCode = True
End If
End With
Else
bCode = False
End If
End Sub

Private Sub UserForm_Initialize()
bCode = False
End Sub

Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Deselect in VBA ListBox: So geht's


Schritt-für-Schritt-Anleitung

  1. Öffne den VBA-Editor in Excel (ALT + F11).

  2. Füge ein UserForm hinzu, falls du noch keins hast.

  3. Füge eine ListBox hinzu und benenne sie (z.B. lboStarSigns).

  4. Erstelle das Click-Event für die ListBox, um die Auswahl zu steuern. Hier ein Beispiel:

    Private Sub lboStarSigns_Click()
        If Me.lboStarSigns.ListIndex > -1 Then
            MsgBox "Ausgewählt: " & Me.lboStarSigns.Value
            Me.lboStarSigns.ListIndex = -1 ' Deselect
        End If
    End Sub
  5. Nutze das MouseUp-Event anstelle des Click-Events, um Probleme mit der Deselect-Funktion zu vermeiden:

    Private Sub lboStarSigns_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
        If Me.lboStarSigns.ListIndex > -1 Then
            MsgBox "Ausgewählt: " & Me.lboStarSigns.Value
            Me.lboStarSigns.ListIndex = -1 ' Deselect
        End If
    End Sub

Häufige Fehler und Lösungen

  • Problem: Das Element bleibt markiert, obwohl .ListIndex = -1 gesetzt wurde.

    • Lösung: Stelle sicher, dass du das richtige Event verwendest. Das MouseUp-Event könnte hier die Lösung sein, da es nach dem Klick ausgeführt wird und keine Endlosschleife erzeugt.
  • Problem: Der Code wird mehrmals ausgeführt.

    • Lösung: Implementiere eine boolesche Variable, um zu überprüfen, ob der Klick durch den Code ausgelöst wurde.
    Dim bolCode As Boolean
    
    Private Sub lboStarSigns_Click()
        If Not bolCode Then
            bolCode = True
            ' Dein Code hier
            Me.lboStarSigns.ListIndex = -1 ' Deselect
        Else
            bolCode = False
        End If
    End Sub

Alternative Methoden

  • Verwende die Clear-Methode, um die Auswahl in der ListBox zurückzusetzen:

    Me.lboStarSigns.Clear ' Löscht die gesamte Auswahl
  • Erstelle eine Funktion, die alle Elemente in der ListBox deselectiert:

    Sub DeselectAllItems()
        Dim i As Long
        For i = 0 To Me.lboStarSigns.ListCount - 1
            Me.lboStarSigns.Selected(i) = False
        Next i
    End Sub

Praktische Beispiele

  • Deselect einer Auswahl bei einem Button-Klick:

    Private Sub btnDeselect_Click()
        Me.lboStarSigns.ListIndex = -1 ' Deselect
    End Sub
  • Deselect bei Initialisierung des UserForms:

    Private Sub UserForm_Initialize()
        Me.lboStarSigns.ListIndex = -1 ' Setzt die Auswahl zurück
    End Sub

Tipps für Profis

  • Nutze die Eigenschaften Selected und ListIndex, um gezielt Elemente in der ListBox zu steuern.
  • Verwende Repaint in VBA, wenn du visuelle Probleme hast, um sicherzustellen, dass die ListBox korrekt aktualisiert wird.
  • Experimentiere mit den Events der ListBox, um die beste Benutzererfahrung zu erzielen.

FAQ: Häufige Fragen

1. Wie kann ich alle Elemente in der ListBox de-selektieren?
Du kannst eine Schleife verwenden, um alle Elemente mit .Selected(i) = False zu de-selektieren.

2. Warum bleibt die Markierung nach dem Deselect-Befehl bestehen?
Das kann an der Verwendung des falschen Events liegen. Versuche das MouseUp-Event anstelle des Click-Events.

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