Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1936to1940
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

ListBox will nicht auf .ListIndex = -1 zurück

ListBox will nicht auf .ListIndex = -1 zurück
26.07.2023 07:53:46
B. G.
Hallo liebe Forenmitglieder,
ich hoffe, dass ich mir mit meiner ersten Frage hier nicht gleich einen Seitenhieb einfange. Das Thema wurde schon in vielen Foren diskutiert. Bei mir will aber einfach nichts funktionieren. Ich habe bereits mehrere Tage im Netz recherchiert und bin am verzweifeln. Mit VBA habe ich schon viel programmiert, jedoch habe ich bisher wenig Erfahrung mit UserForms.
Ich habe eine UserForm mit einigen ListBoxen erstellt. In einer ListBox1 (MultiSelectSingle) klicke ich auf einen Eintrag, der dann in eine weitere ListBox2 übernommen wird.
Das wird über einen Einfachklick => ListBox1_Click() ausgelöst.
Die ListBox1 wird danach geleert (ListBox1.Clear) und in einer Schleife mit ListBox1.AddItem ... wieder neu befüllt, damit der vorher angeklickte Eintrag aus der ListBox1 verschwindet und der User einen weiteren Eintrag auswählen kann. Läuft alles fast rund. Leider bleibt der ListIndex des vorherigen Eintrags weiterhin markiert, sodass der dann bereits markierte Eintrag nicht mehr angeklickt werden kann.

Ich habe vor und nach der erneuten Befüllung der ListBox1 folgendes probiert:
ListBox1.ListIndex = -1

Keine Änderung, die Stelle bleibt markiert.

For i = 1 To ListBox1.ListCount - 1
ListBox1.Selected(i) = False
Next

Keine Änderung, die Stelle bleibt markiert.

With ListBox1
If .ListIndex => 0 Then
.Selected(.ListIndex) = False
End If

Keine Änderung, die Stelle bleibt markiert. Ich weiß, die letzten Codes werden eigentlich bei MultiSelectMulti-ListBoxen angewendet. Ich wollte einfach nichts unversucht lassen.

Dann habe ich im Netz gefunden, dass vielleicht der Code zu schnell ausgeführt wird und "MouseUp" die Stelle einfach wieder markiert. Also habe ich im Code der UserForm folgendes hinzugefügt:
Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
Dim i as Integer
For i = 0 To ListBox1.ListCount - 1
ListBox1.Selected(i) = False
Next
ListBox1.ListIndex = - 1
End Sub

Einfach um alles auszuprobieren. Keine Wirkung. Das gleiche habe ich auch mit MouseMove probiert, keine Wirkung.
Nächster Versuch:
Private Sub ListBox1_AfterUpdate()
If ListBox1.ListIndex = -1 Then
Exit Sub
End If
ListBox1.ListIndex = -1
End Sub

Keine Wirkung.
Dann habe ich einen Button in die UserForm eingebaut mit folgendem Code:
Private Sub Button1_Click()
ListBox1.ListIndex = -1
End Sub

Keine Wirkung. Die MultiSelectMulti Codes habe ich auch in den Button eingebaut. Nichts.
Das Einzige, was zum Erfolg führte war, als ich in den Code des Buttons noch eine MsgBox eingebaut habe, die mir einfach nur am Anfang des Codes sagt, dass der Code ausgeführt wird. Erst danach wurde dann endlich der ListIndex auf -1 gesetzt, also die Markierung aufgehoben. Ich möchte natürlich nicht immer wieder eine MsgBox wegklicken, um mit der Prozedur fortzufahren.
Ich habe keine Ahnung warum das alles so läuft, wie es läuft. Leider habe ich auch keine Lösung gefunden, wie ich einen bereits markierten Eintrag nochmal ankllicken kann, was auch fein wäre.
Muss ich in den Eigenschaften der ListBox noch irgendwo etwas verstecktes einstellen? Ich habe nichts weiter gefunden.

Hat jemand eine Idee? Ich wäre sehr dankbar für jeden Tipp, den ich noch ausprobieren kann.
Viele Grüße,
Bernd

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ListBox will nicht auf .ListIndex = -1 zurück
31.07.2023 10:19:19
B. G.
Hallo zusammen,
um das Thema final abzuschließen:
Mir war nicht bewusst, dass jedwede Änderung durch VBA-Code in einer List-Box wieder ein click-event in dieser ListBox auslöst. Da ein click-event in einer ListBox mehrere Listboxen verändert hat (z.B. Eintrag löschen in ListBox1, Eintrag hinzufügen in ListBox2 und Eintrag in ListBox3 ändern), wurden dadurch auch die click-events in den jeweils anderen Boxen ausgelöst. In diesen Codes werden die jeweils anderen ListBoxen auch wieder verändert und somit aktiviert. Um dies zu verhindern habe ich eine globale Variable definiert und auf 0 gesetzt. In jedem Code von ListBoxX_Click() (X = 1, 2, 3, ...) wird zunächst geprüft, ob die Variable den Wert 0 enthält. Nur dann wird der weitere Code ausgeführt. Als erstes wird dann die Variable auf 1 gesetzt, sodass die Aktualisierungen in den jeweils anderen ListBoxen den jeweils zugehörigen ListBoxX-Click()-Code nur bis zur Prüfung der Variable auslösen. Da überall der Code nur dann weiter ausgeführt wird, wenn die Variable auf 0 steht, werden somit die ungewollten Click-Events gestoppt.
Am Ende der Codes in der tatsächlich angeklickten ListBox wird die Variable wieder auf 0 gesetzt. Kurz gesagt, es wird erst geprüft, ob der Code durch einen Klick in der ListBox ausgelöst wurde, oder durch VBA-Code.
Nun klappt es auch, dass die Markierungen verschwinden, egal an welcher Stelle im Code die jeweilige ListBox aktualisiert wird (ob ganz am Schluss des Codes, nachdem die anderen verändert wurden, oder vor den Aktualisierungen der anderen ListBoxen.).
Es gibt vielleicht elegantere Lösungen, aber bei mir hat das zumindest Licht ins Dunkel gebracht.

Viele Grüße
Bernd
Anzeige
AW: ListBox will nicht auf .ListIndex = -1 zurück
31.07.2023 10:33:11
Daniel
Eleganter wäre vielleicht, für die Reaktion auf Anwendereingaben die Events MouseUp und ggf KeyUp anstelle von Click zu verwenden.

Gruß Daniel
AW: ListBox will nicht auf .ListIndex = -1 zurück
26.07.2023 11:00:20
uwe.legler@t-online.de
Hallo Bernd,

Ich habe vor und nach der erneuten Befüllung der ListBox1 folgendes probiert:
ListBox1.ListIndex = -1

Wenn das passiert, wird an anderer Stelle wieder indexiert. Das musst du suchen, wo es passiert.
Ich würde zum deselektieren un Listindex auf -1 so vorgehen:


With ListBox1
.ListIndex = -1
For i = 0 To .ListCount - 1
ListBox1.Selected(i) = False
Next i
End With

Repaint geht natürlich auch, wenn Listbox nicht weiter manipuliert ist und bleiben soll (filtern, sortieren..).

Gruß Uwe
Anzeige
AW: ListBox will nicht auf .ListIndex = -1 zurück
26.07.2023 11:12:19
B. G.
Hallo Uwe,
ich habe am Ende der Sub, in der der angeklicke Eintrag in ListBox2 gebracht und die ListBox1 neu aufgebaut wird, Deinen Code übernommen (allerdings ohne ListBox1 vor Selected). Die anderen Versuche von mir sind ebenfalls immer die letzten Befehle gewesen, die in der Sub standen.

With ListBox1
.ListIndex = -1
For i = 0 To .ListCount - 1
.Selected(i) = False
Next i
End With

Danach passiert in der Sub nichts mehr! Allerdings ist der ListIndex trotzdem markiert. Auch wenn ich danach noch ein Me.Repaint einfüge.
Anzeige
AW: ListBox will nicht auf .ListIndex = -1 zurück
26.07.2023 09:26:19
daniel
Hi
probier mal, das Element einfach mit

ListboxX.RemoveItem Indexnummer

zu entfernen.
eigentlich sollte dann auch die Markierung verschwinden.

wenn auch nach ListboxX.ListIndex = -1 die Markierung sichtbar ist, dann schick mal ein Me.Repaint hinterher.

Gruß Daniel
AW: ListBox will nicht auf .ListIndex = -1 zurück
26.07.2023 11:00:41
B. G.
Hallo Daniel,
danke für die Antwort.

With ListBox1
.RemoveItem (.ListIndex)
End With


Ergibt:
Laufzeitfehler '-2147467259 (80004005):
Nicht näher bezeichneter Fehler.

Das soll nach meiner Recherche vorkommen, wenn man z.B. versucht über VBA ein geschütztes Objekt zu verändern. Das trifft hier aber irgendwie nicht zu. Jedenfalls habe ich nichts bewusst geschützt.

ListBox1.ListIndex = -1
Me.Repaint

Hat keinen Effekt. Es bleibt markiert.
Es bleibt misteriös!

Anzeige
AW: ListBox will nicht auf .ListIndex = -1 zurück
26.07.2023 11:12:17
daniel
Ok , Excel hat ein Problem damit, das aktive Element zu löschen.
also musst du so vorgehen:
1. Listindex in eine Variable schreiben ( x = listbox1.Listindex)
2. Listindex auf -1 setzen
3. das in der Variable gesicherte Element löschen: Listbox1.RemoveItem x

dann ist bei mir auch die Markierung weg.

Wenns bei dir so nicht geht, dann lade mal deine Datei hoch.

Gruß Daniel
AW: ListBox will nicht auf .ListIndex = -1 zurück
27.07.2023 09:44:25
B. G.
Juhuu, ein Teilerfolg!
Mit Deinem Vorschlag, statt die ListBox neu zu füllen, einfach das Item löschen, klappt es nun, dass die Markierung verschwindet. Top!
Leider gibt es Situationen, in denen der Eintrag in der ListBox1 geändert wird. Das habe ich bisher so realisiert, dass in der dahinter liegenden Excel-Tabelle in einer Zelle (der Eintrag in der Listbox1 ist aus den Inhalten von 3 Zellen zusammengesetzt) der Wert gelöscht, die ListBox1 geleert und neu eingelesen wird. Dabei bleibt leider immer noch die Markierung bestehen. In der UserForm wird dazu eine SelectBox angewählt und auf den entsprechenden Eintrag in ListBox1 geklickt.
Ich habe gerade versucht den ListBox1-Eintrag direkt zu manipulieren:
With ListBox1
.List(.ListIndex) = Left(.List(.ListIndex), Len(.List(.ListIndex)) - 3)
End With

(die letzten 3 Zeichen müssen vom Eintrag entfernt werden)
Dabei habe ich festgestellt, dass mit jeder Manipulation in der ListBox1 wieder ein Klickevent ausgelöst wird. Kann das sein? Wie gesagt, mit UserFormen habe ich nicht viel Erfahrung. Bei der Reduzierung um jeweils 3 Zeichen durchläuft der Code nämlich plötzlich eine Schleife und reduziert immer wieder den Eintrag um 3 Zeichen. Kann man verhindern, dass eine Änderung in der ListBox wieder ein Klickevent auslöst?
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige