Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Problem: Eintrag in einer Listbox anwählen

Problem: Eintrag in einer Listbox anwählen
KLE
Hi,
...ich habe eine Listbox in einer Userform, diese enthält ca. 8.000 Artikel. Der User kann dann per Doppelklick auf einen Eintrag - diesen Datensatz in eine Auswahlbox (Listbox2) übernehmen, zur weiteren Verwendung.
Dabei wird er zeitgleich in der ersten Listbox (Artikelliste) per removeitem entfernt und steht dem User nicht mehr zur Verfügung.
Alles klappt super - aber:
Nach dem Doppelklick und dem "verschwinden" aus der Liste1, wird diese wieder mit Datensatz 1 beginnend angezeigt. Was lästig ist, wenn man schon weiter unten in der Liste war-denn nun muss man wieder erst scrollen um weiter in der Liste zu machen.
Ich dachte, wenn ich mir die aktuelle Position des ausgewählten Datensatzes in eine Variable merke und am Ende der Prozedur diese mit -1 (den Datensatz davor) wieder an die Listbox übergebe...sollte es funktionieren. Aber leider stimmt es nicht, es wird immer ein Artikel markiert, der um einige Zeilen davor liegt...

Mein Code:

Dim Klickzeile as long
Klickzeile = objLBBMKontakte.ListIndex ' Merken der Position (Zeile in der Box)
' Dann der Code der übergabe an die Listbox 2
' entfernen aus Listbox 1
' Listbox1 erneut anzeigen
' Dann Position wieder aufnehmen...
objLBBMKontakte.ListIndex = Klickzeile - 1
Warum, worin liegt mein Denkfehler ?
Gruß und Danke
Kay
Anzeige

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Problem: Eintrag in einer Listbox anwählen
11.09.2011 10:52:18
Peter
Hallo Kay,
wo hast Du die Variable Klickzeile definiert?
Du solltest sie in einem allgemeinen Modul als Public Klickzeile As Long definieren, dann sollte es eigentlich funktionieren.
Gruß Peter
AW: Das Problem muss woanders liegen
12.09.2011 15:22:58
KLE
Hi,
Hatte die Klickzeile as long im Bereich Option Explicit...der Userform. Aber das kann nicht das Problem sein. Habe den Weg probiert und mit F8 (EInzelschritt) alles mal nachvollzogen...Klickzeile wird korrekt übergeben.
Aber dann habe ich mit debug.print "Schritt 1"...usw. mir "Merker" gesetzt und habe so feststellen müssen, dass das Listbox_Click() Ereignis 2x durchlaufen wird. Beim ersten Mal = Alles OK, doch beim 2'ten Lauf, wird plötzlich ein neuer Listbox.listindex genutzt von Excel - KEINE Ahnung wo es herkommt, denn es variiert immer - bisher aber immer niedriger wie Klickzeile...und es scheint so, dass es nur auftritt, wenn Werte tiefer dem ungescrollten Listenbereich ausgewählt werden ?
Komisch nur, dass wenn ich mit F8 dem Doppelklick folge...läuft es nur einmal die Click-Prozedur durch. Lasse ich es Excel Selbst tun, wird es wieder 2x durchlaufen....und dabei wie gesagt - keine Ahnung warum.
Leider kann ich den Code, bzw. die Datei nicht hochladen (FIrmeninterne Daten und mehr wie 10.000Zeilen Code!)
Vielleicht kann mir jemand aber erklären, warum ich mit F8 nur einmal die Click-Prozedur durchlaufe und ohne EIngriff - 2x?!?
Gruß und Danke
Kay
Anzeige
Userform, Listbox Klick- und Doppelklick-Ereignis
13.09.2011 12:04:32
fcs
Hallo Kay,
es ist problematisch das Klick- und das DoubleKlick-Ereignis bei einer Listbox auszuwerten.
Es laufen bei einem DoubleKlick verschiedene Sachen ab.
A) Ein bereits selektierter Eintrag wird doppelt geklickt
1. Doubleklick-Ereignis
B) Ein noch nicht selektierter Eintrag wird doppelt geklickt.
1. Klick-Ereignis
2. Doubleklick-Ereignis
Außer beim Mausklick auf einen Listeneintrag wird das Klickereignis wird auch ausglöst:
- wenn der Listindex per Makro gesetzt wird,
- wenn per RemoveItem ein Eintrag gelöscht wird,
- wenn mit den Positioniertasten PfeilUp, PfeilDown, BildUp, BildDown, Pos1 oder Ende ein Eintrag gewählt wird.
Je nachdem was in den Klick- und Doubleklick-Ereignis-Prozeduren an Anweisungen steht, kann es dann zu unerwünschten Ergebnissen kommen. Die Klick-Ereignis-Prozedur sollte also keine Anweisungen enthalten, die den ListIndex verändern.
Damit die Klick-Ereignisprozedur nicht unerwünscht in die DoubleKlick-Prozedur eingreift muss über eine Varianble, der Ablauf entsprechend gesteuert werden. Events Ein-/Ausschalten nützt im Userform nichts.

'Auf Userform-Modulebene Variable deklarieren
Private boolDoubleClick  as Boolean
Private Sub ListBox1_Click()
If boolDoubleClick = True Then Exit Sub
'iCount = iCount + 1                                                          'TestZeile
'Debug.Print iCount & " | SingleClick " & Now & " | " & Me.ListBox1.ListIndex 'TestZeile
End Sub
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
boolDoubleClick = True
' iCount = iCount + 1                                                          'TestZeile
'Debug.Print iCount & " | DoubleClick " & Now & " | " & Me.ListBox1.ListIndex 'TestZeile
Dim Spalte As Long
ZeileIndex = Me.ListBox1.ListIndex  'gewählten Eintrag Merken
With ListBox2
.AddItem Me.ListBox1.List(ZeileIndex, 0)
For Spalte = 1 To .ColumnCount - 1
.List(.ListCount - 1, Spalte) = Me.ListBox1.List(ZeileIndex, Spalte)
Next
End With
With Me.ListBox1
'Letzte Auswahl in Textbox schreiben
'Me.TextBox2 = .List(ZeileIndex, 0)                            'TestZeile
'gewählten Eintrag in Liste löschen
.RemoveItem ZeileIndex
End With
boolDoubleClick = False
End Sub
Dann ist es auch nicht erforderlich, dass nach dem löschen eines Eintrags der ListIndex erneut gesetzt wird.
Im Debug-Modus (Haltepunkte + mit F8 weiter ausführen) hängt das Ergebnis dann auch davon ab wie selektiert wird. Dann wird ggf. das Double-Klick-Ereignis zunächst garnicht erst ausgeführt, da schon nach dem 1. Klick das VBA-Fenster im Debug-Modus ausgeführt wird. Der 2. Klick endset dann meist im irgendwo im VBA-.Fenster. Das Double-Klick-Ereignis wird im Debug-Modus nur ausgeführt, wenn ein bereist per Einzel-Klick oder anders gewählter Eintrag doppelt geklickt wird.
Gruß
Franz
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

Listbox in Userform: Einträge effizient verwalten


Schritt-für-Schritt-Anleitung

Um ein Problem mit der Listbox in einer Userform zu lösen, kannst du folgende Schritte befolgen:

  1. Definiere eine Public-Variable: Stelle sicher, dass die Variable Klickzeile als Public in einem allgemeinen Modul definiert ist:

    Public Klickzeile As Long
  2. Merken der aktuellen Position: Setze die Klickzeile beim Doppelklick auf einen Eintrag:

    Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
       Klickzeile = Me.ListBox1.ListIndex
       ' Führe die Übertragung an ListBox2 durch
    End Sub
  3. Eintrag in ListBox2 hinzufügen: Übertrage den Eintrag von ListBox1 zu ListBox2:

    With ListBox2
       .AddItem Me.ListBox1.List(Klickzeile, 0)
    End With
  4. Eintrag aus ListBox1 entfernen: Entferne den Eintrag aus der ersten Listbox:

    Me.ListBox1.RemoveItem Klickzeile
  5. ListBox1 erneut anzeigen: Setze den ListIndex zurück, um die vorherige Position zu behalten:

    Me.ListBox1.ListIndex = Klickzeile - 1

Häufige Fehler und Lösungen

Ein häufiger Fehler tritt auf, wenn das Klick- und Doppelklick-Ereignis nicht korrekt behandelt wird.

  • Problem: Das ListBox_Click-Ereignis wird mehrmals ausgelöst.

    • Lösung: Verwende eine Steuerungsvariable (boolDoubleClick), um zu verhindern, dass der Klick-Handler während eines Doppelklicks ausgeführt wird:
      
      Private boolDoubleClick As Boolean

    Private Sub ListBox1_Click() If boolDoubleClick Then Exit Sub End Sub

    Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) boolDoubleClick = True ' Doppelklick-Logik hier End Sub


Alternative Methoden

Eine alternative Methode zur Verwaltung von Listbox-Ereignissen ist die Verwendung von Application.EnableEvents. Dies kann helfen, unerwünschte Trigger von Ereignissen zu vermeiden. Du kannst das Ereignis vorübergehend deaktivieren:

Application.EnableEvents = False
' Führe deine Logik durch
Application.EnableEvents = True

Praktische Beispiele

Hier ist ein einfaches Beispiel, das die obigen Konzepte zusammenführt:

Private boolDoubleClick As Boolean

Private Sub ListBox1_Click()
    If boolDoubleClick Then Exit Sub
End Sub

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    boolDoubleClick = True
    Klickzeile = Me.ListBox1.ListIndex
    ListBox2.AddItem Me.ListBox1.List(Klickzeile, 0)
    Me.ListBox1.RemoveItem Klickzeile
    Me.ListBox1.ListIndex = Klickzeile - 1
    boolDoubleClick = False
End Sub

Dieses Beispiel zeigt, wie du eine Listbox effizient verwalten kannst und dabei unerwünschte Doppelklick-Ereignisse vermeidest.


Tipps für Profis

  • Debugging: Nutze Debug.Print, um den aktuellen Status und den ListIndex zu überwachen. So kannst du Probleme schnell identifizieren.
  • Ereignisprozeduren: Halte die Logik in den Klick- und Doppelklick-Prozeduren minimal, um unerwartete Fehler zu vermeiden.
  • Benutzerfreundlichkeit: Füge eine Scrollbar hinzu, um den Benutzern das Navigieren durch große Listen zu erleichtern.

FAQ: Häufige Fragen

1. Warum wird das Klick-Ereignis mehrmals ausgelöst?
Das Klick-Ereignis wird auch durch andere Aktionen wie das Setzen des ListIndex oder durch das Entfernen von Einträgen ausgelöst. Verwende eine Steuerungsvariable, um dies zu verhindern.

2. Wie kann ich die Userform schneller machen?
Reduziere die Komplexität der Ereignisprozeduren und stelle sicher, dass nur notwendige Aktionen in den Klick- und Doppelklick-Ereignissen ausgeführt werden.

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