Seltsames Verhalten einer Listbox

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

Betrifft: Seltsames Verhalten einer Listbox
von: Hendrik
Geschrieben am: 01.09.2015 15:12:44

Hallo zusammen, ich habe irgendwie ein seltsames Verhalten meiner Listbox auf einem UserForm. Mittels Schaltfläche schreibe ich in diese Werte hinein oder nehme sie wieder heraus.
Wenn ich danach eine Zeile selektiere und diese Testroutine laufen lasse

    Dim i As Integer
    
    Debug.Print "-------"
    Debug.Print "Anzahl: " & lstJoin2.ListCount
    If lstJoin2.ListCount > 0 Then
        For i = 0 To lstJoin2.ListCount - 1
            Debug.Print i & ": " & lstJoin2.List(i, 0) & " - " & lstJoin2.List(i, 1) & " - " &  _
lstJoin2.List(i, 2) & " - " & lstJoin2.List(i, 3) & " - " & lstJoin2.List(i, 4) & " - " & lstJoin2.List(i, 5) & " - " & lstJoin2.List(i, 6) & " - " & lstJoin2.List(i, 7) & " - " & lstJoin2.List(i, 8) & " - " & lstJoin2.List(i, 9) & " - "
        Next i
        Debug.Print "Auswahl: " & lstJoin2.ListIndex & " - "; lstJoin2.List(lstJoin2.ListIndex,  _
1)
        Debug.Print "-------"
    End If
,dann wird mir zwar als lstJoin2.ListIndex die richtige Zeile ausgegeben, der Wert dazu, den ich mir durch
lstJoin2.List(lstJoin2.ListIndex, 1)
ausgeben lasse ist jedoch immer der gleiche, nämlich der erste. Wie kommt das? Was läuft hier falsch?
Für Tipps bin ich sehr dankbar! Grüße
Hendrik

Bild

Betrifft: AW: Seltsames Verhalten einer Listbox
von: Gerd L
Geschrieben am: 01.09.2015 15:38:21
Hallo Hendrik,
vermutlich das Befüllen. Lade doch bitte eine Beispieldatei mit deinem Code hoch, damit nicht nur
vermutet werden kann.
Gruß Gerd

Bild

Betrifft: AW: Seltsames Verhalten einer Listbox
von: Hendrik
Geschrieben am: 02.09.2015 10:34:09
Hallo Gerd,
ja, das habe ich mir schon gedacht. :o)
Allerdings ist das ein riesen Ding, was ich nicht verschicken möchte. Ich versuche dennoch mal die wesentlichen Teile anzuhängen.
Zur Auswahl von verschiedenen Einträgen, kann der Anwender Einträge von der einen Listbox in die andere "schubsen". Dafür hat er die vier Schaltflächen
<
>
<<
>>
zur Verfügung, kann also alle Einträge oder einzelne bewegen.
Füge ich alle hinzu (>>), wird dieser Code ausgeführt:

Private Sub cmdJoinHinzuAlle_Click()
    Dim i As Integer
    
    For i = 0 To lstJoin1.ListCount - 1
        lstJoin2.AddItem lstJoin1.List(i, 0)
        lstJoin2.List(lstJoin2.ListCount - 1, 1) = lstJoin1.List(i, 1)
        lstJoin2.List(lstJoin2.ListCount - 1, 2) = lstJoin1.List(i, 2)
        lstJoin2.List(lstJoin2.ListCount - 1, 3) = lstJoin1.List(i, 3)
        lstJoin2.List(lstJoin2.ListCount - 1, 4) = lstJoin1.List(i, 4)
        lstJoin2.List(lstJoin2.ListCount - 1, 5) = lstJoin1.List(i, 5)
        lstJoin2.List(lstJoin2.ListCount - 1, 6) = lstJoin1.List(i, 6)
        lstJoin2.List(lstJoin2.ListCount - 1, 7) = ""
        lstJoin2.List(lstJoin2.ListCount - 1, 8) = ""
        lstJoin2.List(lstJoin2.ListCount - 1, 9) = ""
    Next i
    
    lstJoin1.Clear
    
    cmdJoinEntfernen.Enabled = True
    cmdJoinEntfernenAlle.Enabled = True
    cmdJoinAliasFeld.Enabled = True
    cmdJoinAliasTabelle.Enabled = True
    
    Call sortiereBox(lstJoin2, 10, 1, 1, 1)
    lstJoin2.ListIndex = 0
    
    cmdJoinHinzu.Enabled = False
    cmdJoinHinzuAlle.Enabled = False
    
    lblJoin1.Caption = lstJoin1.ListCount
    lblJoin2.Caption = lstJoin2.ListCount
    Call sqlGenerieren
End Sub
Entferne ich alle (<<), passiert dieses hier:
Private Sub cmdJoinEntfernenAlle_Click()
    Dim i As Integer
    
    For i = 0 To lstJoin2.ListCount - 1
        lstJoin1.AddItem lstJoin2.List(i, 0)
        lstJoin1.List(lstJoin1.ListCount - 1, 1) = lstJoin2.List(lstJoin2.ListIndex, 1)
        lstJoin1.List(lstJoin1.ListCount - 1, 2) = lstJoin2.List(lstJoin2.ListIndex, 2)
        lstJoin1.List(lstJoin1.ListCount - 1, 3) = lstJoin2.List(lstJoin2.ListIndex, 3)
        lstJoin1.List(lstJoin1.ListCount - 1, 4) = lstJoin2.List(lstJoin2.ListIndex, 4)
        lstJoin1.List(lstJoin1.ListCount - 1, 5) = lstJoin2.List(lstJoin2.ListIndex, 5)
        lstJoin1.List(lstJoin1.ListCount - 1, 6) = lstJoin2.List(lstJoin2.ListIndex, 6)
        lstJoin1.List(lstJoin1.ListCount - 1, 7) = ""
        lstJoin1.List(lstJoin1.ListCount - 1, 8) = ""
        lstJoin1.List(lstJoin1.ListCount - 1, 9) = ""
        
        'Alias wieder freigeben:
        If lstJoin2.List(lstJoin2.ListIndex, 7) <> "" Then aliasFreigeben (lstJoin2.List( _
lstJoin2.ListIndex, 7))
        If lstJoin2.List(lstJoin2.ListIndex, 8) <> "" Then aliasFreigeben (lstJoin2.List( _
lstJoin2.ListIndex, 8))
    Next i
    lstJoin2.Clear
    
    cmdJoinEntfernen.Enabled = False
    cmdJoinEntfernenAlle.Enabled = False
    cmdJoinAliasFeld.Enabled = False
    cmdJoinAliasTabelle.Enabled = False
    
    Call sortiereBox(lstJoin1, 10, 1, 1, 1)
    lstJoin1.ListIndex = 0
    
    cmdJoinHinzu.Enabled = True
    cmdJoinHinzuAlle.Enabled = True
    
    lblJoin1.Caption = lstJoin1.ListCount
    lblJoin2.Caption = lstJoin2.ListCount
    Call sqlGenerieren
End Sub
Wenn ich nun wieder einen einzelnen Eintrag (>) übertrage
Private Sub cmdJoinHinzu_Click()
    Dim strJoin As String
    Dim i As Integer
    
    If lstJoin1.ListCount > 0 Then
        If lstJoin1.ListIndex >= 0 Then
            'Zeile in die rechte Box übertragen:
            lstJoin2.AddItem lstJoin1.List(lstJoin1.ListIndex, 0)
            lstJoin2.List(lstJoin2.ListCount - 1, 1) = lstJoin1.List(lstJoin1.ListIndex, 1)
            lstJoin2.List(lstJoin2.ListCount - 1, 2) = lstJoin1.List(lstJoin1.ListIndex, 2)
            lstJoin2.List(lstJoin2.ListCount - 1, 3) = lstJoin1.List(lstJoin1.ListIndex, 3)
            lstJoin2.List(lstJoin2.ListCount - 1, 4) = lstJoin1.List(lstJoin1.ListIndex, 4)
            lstJoin2.List(lstJoin2.ListCount - 1, 5) = lstJoin1.List(lstJoin1.ListIndex, 5)
            lstJoin2.List(lstJoin2.ListCount - 1, 6) = lstJoin1.List(lstJoin1.ListIndex, 6)
            lstJoin2.List(lstJoin2.ListCount - 1, 7) = ""
            lstJoin2.List(lstJoin2.ListCount - 1, 8) = ""
            lstJoin2.List(lstJoin2.ListCount - 1, 9) = ""
            
            strJoin = lstJoin1.List(lstJoin1.ListIndex, 0)
            
            'Zeile in der linken Box entfernen:
            lstJoin1.RemoveItem (lstJoin1.ListIndex)
            
            Call sortiereBox(lstJoin2, 10, 1, 1, 1)
            
            For i = 0 To lstJoin2.ListCount - 1
                If lstJoin2.List(i, 0) = strJoin Then Exit For
            Next i
            lstJoin2.ListIndex = i
            
            cmdJoinEntfernen.Enabled = True
            cmdJoinEntfernenAlle.Enabled = True
            cmdJoinAliasFeld.Enabled = True
            cmdJoinAliasTabelle.Enabled = True
            
            If lstJoin1.ListCount > 0 Then
                cmdJoinHinzu.Enabled = True
                cmdJoinHinzuAlle.Enabled = True
            Else
                cmdJoinHinzu.Enabled = False
                cmdJoinHinzuAlle.Enabled = False
            End If
        End If
        
        lblJoin1.Caption = lstJoin1.ListCount
        lblJoin2.Caption = lstJoin2.ListCount
        Call sqlGenerieren
    End If
End Sub
Bekomme ich mit der Testroutine
lstJoin2.List(lstJoin2.ListIndex, 1)

einen Wert ausgespuckt, den es in lstJoin2 gar nicht mehr gibt!

Bild

Betrifft: AW: Seltsames Verhalten einer Listbox
von: Hendrik
Geschrieben am: 03.09.2015 13:57:52
Okay, ich habe es selber gefunden.
Beim Entfernen der Einträge aus der rechten Box muss es nicht

For i = 0 To lstJoin2.ListCount - 1
        lstJoin1.AddItem lstJoin2.List(i, 0)
        lstJoin1.List(lstJoin1.ListCount - 1, 1) = lstJoin2.List(lstJoin2.ListIndex, 1)
        lstJoin1.List(lstJoin1.ListCount - 1, 2) = lstJoin2.List(lstJoin2.ListIndex, 2)
        lstJoin1.List(lstJoin1.ListCount - 1, 3) = lstJoin2.List(lstJoin2.ListIndex, 3)

sondern
For i = 0 To lstJoin2.ListCount - 1
        lstJoin1.AddItem lstJoin2.List(i, 0)
        lstJoin1.List(lstJoin1.ListCount - 1, 1) = lstJoin2.List(i, 1)
        lstJoin1.List(lstJoin1.ListCount - 1, 2) = lstJoin2.List(i, 2)
        lstJoin1.List(lstJoin1.ListCount - 1, 3) = lstJoin2.List(i, 3)

heißen.

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Seltsames Verhalten einer Listbox"