List_Change-Ereignis abfangen

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
UserForm ListBox TextBox MsgBox
Bild

Betrifft: List_Change-Ereignis abfangen
von: Steffan
Geschrieben am: 23.09.2003 17:34:32

Hallo,

ich habe folgendes Problem, dass ich nicht gelöst kriege:
Ein UF hat u.a. als Inhalt eine Textbox und eine Listbox.
Beim Ändern der Listbox (anderer Eintrag wird ausgewählt) soll überprüft werden, was in der Textbox steht und wenn diese leer ist, soll eine Änderung des Listindex nicht zugelassen werden.
Das Problem ist, dass das beim Zurücksetzen des Listindex wieder ein Listboxereignis auslöst wird usw. usf. Nach drei Durchläufen ist damit Schluß, aber der Listindex wird nicht auf den ursprünglichen Wert zurückgesetzt!
Hat jemand einen Tip, wie ich das Problem lösen kann?

Danke im Vorraus
Steffan.

Mein Testcode:

Dim LI As Integer


Private Sub ListBox1_Change()
If Me.TextBox1.Text = "" Then
    Me.ListBox1.ListIndex = LI
    MsgBox "leer"
Else
    LI = Me.ListBox1.ListIndex
End If
End Sub




Private Sub UserForm_Initialize()
Me.ListBox1.AddItem "eins"
Me.ListBox1.AddItem "zwei"
Me.ListBox1.AddItem "drei"
Me.ListBox1.ListIndex = 0
LI = 0
End Sub

Bild


Betrifft: AW: List_Change-Ereignis abfangen
von: ChrisL
Geschrieben am: 23.09.2003 17:57:18

Hi Steffan

Ist zwar nicht die Antwort auf deine Frage, aber wieso machst du es nicht so...

Option Explicit


Private Sub TextBox1_Change()
If TextBox1 = "" Then
ListBox1.Enabled = False
Else
ListBox1.Enabled = True
End If
End Sub



Private Sub UserForm_Initialize()
Application.EnableEvents = False
Me.ListBox1.AddItem "eins"
Me.ListBox1.AddItem "zwei"
Me.ListBox1.AddItem "drei"
Me.ListBox1.ListIndex = 0
ListBox1.Enabled = False
End Sub



Gruss
Chris


Bild


Betrifft: AW: List_Change-Ereignis abfangen
von: Steffan
Geschrieben am: 23.09.2003 19:00:26

Hallo Chris,

danke für die schnelle Antwort.
Deine Lösung funktioniert zwar für das Beispiel, nur leider ist die Wirklichkeit komplizierter als mein Beispiel. In 'richtigen' UF soll der Klick möglich sein, eine Meldung ausgegeben werden und dann auf den alten Listindex zurückgeschaltet werden, das funktioniert mit Enabled=False nicht (Und der arme User fragt sich dann: Hä, warum kann ich hier nun wieder nicht klicken?)

Steffan.


Bild


Betrifft: AW: List_Change-Ereignis abfangen
von: ChrisL
Geschrieben am: 23.09.2003 21:24:21

Hi Steffan

Da muss ich erstmal passen. Dachte eigentlich an eine Variabel, aber im Moment hab ich grad nicht den Durchblick. Ich schau da morgen gegen Mittag nochmals rein. Wenn jemand in der Zwischenzeit eine Idee hat kann sich gerne melden.

bis dann
Chris


Bild


Betrifft: AW: List_Change-Ereignis abfangen
von: ChrisL
Geschrieben am: 24.09.2003 11:17:22

hi Steffan

Ich gebe auf. Die Unterdrückung des Change Ereignisses könnte man fürs Initilize Ereignis mit einer Variable erreichen. Hingegen den Teil im ListBox_Change Ereignis lässt sich m.E. nicht lösen.

Sorry, aber nach langem Nachdenken glaube ich, dass die Aufgabe tatsächlich 'Mission Impossible' ist.

Gruss
Chris


Bild


Betrifft: Na ja, trotzdem vielen Dank für Deine Mühe! oT
von: Steffan
Geschrieben am: 24.09.2003 14:37:22




Bild


Betrifft: doch noch geschafft
von: Steffan
Geschrieben am: 26.09.2003 19:07:48

Hallo Chris,
(und natürlich die anderen, die es interessiert auch)

falls Du noch mitliest und Dich das Problem interessiert:
Ich habs gelöst!
Ist zwar ziemlich umständlich, denn um den Listindex per Code zu ändern müssen folgende Voraussetzungen erfüllt sein:
- Listbox darf nicht den Fokus haben
- Listbox muß im Multiselect-Modus stehen

Darüberhinaus benötigt man noch zwei Variablen um den rekursiven Aufruf des ListChange-Ereignisses zu kontrollieren (mit nur einer ist es mir nicht gelungen)
(im Beispiel: bChange und bMsg)

Und hier mein Testcode:

Dim iOld As Integer
Dim bChange As Boolean
Dim bMsg As Boolean

Private Sub ListBox1_Change()
If bChange = False Then Exit Sub
If Me.TextBox1.Text = "" Then
    bChange = False
    With Me.ListBox1
        .MultiSelect = fmMultiSelectExtended
        Me.TextBox1.SetFocus
        For i = 1 To .ListCount - 1
            If i = iOld Then .Selected(i) = True Else .Selected(i) = False
        Next
        .ListIndex = iOld
        .MultiSelect = fmMultiSelectSingle
        If Not (bMsg = True) Then
            MsgBox "Auswahl kann nur verändert werden, wenn in der Textbox etwas steht!"
            bMsg = True
        Else
            bMsg = False
        End If
    End With
    bChange = True
    Exit Sub
Else
    iOld = Me.ListBox1.ListIndex
End If
End Sub




Private Sub UserForm_Initialize()
bChange = False
With Me.ListBox1
    For i = 1 To 5
        .AddItem "Eintrag " & i
    Next i
    .ListIndex = 0
    iOld = 0
End With
bChange = True
End Sub



 Bild

Beiträge aus den Excel-Beispielen zum Thema " List_Change-Ereignis abfangen"