Clever-Excel-Forum

Normale Version: ListBox.List
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

eigentlich sollte es ganz einfach sein:

Eine ListBox (UserForm) wird mit einem Bereich des Sheets gefüllt (ok).

Danach soll der Inhalt der Listbox in ein Array geschrieben werden. der Inhalt der ListBox gelöscht und erneut aus dem Array gefüllt werden:

Aber die ListBox bleibt leer:

Code:
Private Sub UserForm_Initialize()
    Ar = Sheets(1).Range("A1").CurrentRegion
    Me.ListBox1.List = Ar                                           '<--- OK
End Sub

Private Sub ListBox1_Click()
    Ar = Me.ListBox1.List

With Me.ListBox1
    .Clear
    '.AddItem "qwe" 'ok
    .List = Ar
    Debug.Print .ListCount, .List(0, 0), .List(0, 1)    '<--- OK, aber ListBox ist leer
End With
End Sub


Warum dieser Ansatz?

Nach einem Klick in die ListBox funktioniert ein ".Selected(.ListIndex) = false" nicht um die Selektion wieder aufzuheben.

Manchmal sind es die kleinen Dinge, die ziemlich stören können.

Danke.

mfg
Hi

Wenn du den Code z.B. in einen Button legst geht es. Liegt wahrscheinlich daran das das List.Klick erst abgearbeitet sein muss bevor die Liste geändert werden kann.
Code:
Private Sub CommandButton1_Click()
    Ar = Me.ListBox1.List

With Me.ListBox1
    .Clear
    '.AddItem "qwe" 'ok
    .List = Ar
    Debug.Print .ListCount, .List(0, 0), .List(0, 1)
End With
End Sub

Private Sub UserForm_Initialize()
    Ar = Sheets(1).Range("A1").CurrentRegion
    Me.ListBox1.List = Ar
End Sub

Das Klappt auch nur im Button und nicht im List.Klick.
Code:
ListBox1.ListIndex = -1

Gruß Elex
Danke

So geht es, aber es bleibt in einer etwas komplexeren Umgebung ziemlich störend.

mfg
Hallo mfg,

Code:
Private Sub ListBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
  ListBox1.ListIndex = -1
End Sub

Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
  ListBox1.ListIndex = -1
End Sub

Gruß Uwe
Hallo,

das ist keine Frage, sondern nur ein Kommentar der Verwunderung:

Im eigentlichen Problem, soll das angeklickte Item der Listbox an die erste Stelle kopiert und an der ursprüglichen Stelle gelöscht werden. Außerdem soll das Item in eine Textbox kopiert werden:

Code:
Private Sub UserForm_Initialize()
    Dim Ar(5, 1)
    For i = LBound(Ar) To UBound(Ar)
        Ar(i, 0) = CStr(10000 + i)
        Ar(i, 1) = "Text" & i
    Next i
    Me.ListBox1.List = Ar
End Sub

Private Sub ListBox1_Click()
If Me.Tag = " " Then Exit Sub
Me.Tag = " "

    With Me.ListBox1
        Debug.Print "Click: List.Index", .ListIndex
        Me.TextBox1 = .List(.ListIndex, 0) & "  " & .List(.ListIndex, 1)
        .AddItem .List(.ListIndex, 0), 0
        .List(0, 1) = .List(.ListIndex, 1)
       
        .TopIndex = 0
        For i = .ListCount - 1 To 1 Step -1
            If .List(i) = .List(0) Then .RemoveItem i ': Stop
        Next i
        .Selected(.ListIndex) = False
    End With
Me.Tag = ""

End Sub

Das Ergebnis ist ziemlich chaotisch: Es werden 2-3 Items nach oben kopiert. Die Markierung bleibt bestehen. Selbst kleinste Änderungen führen zu deutlich anderen Ergebnissen.

Zumindest für ist das unkontrollierbar.

mfg
Hallo mfg,

ich dachte, Du verstehst meinen (indirekten) Hinweis, Dich vom Click-Ereignis loszusagen. Wink

Code:
Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    Dim i As Long
    With Me.ListBox1
      i = .ListIndex
      If i > -1 Then
        Me.TextBox1 = .List(i, 0) & "  " & .List(i, 1)
        .AddItem .List(i), 0
        .List(0, 1) = .List(i + 1, 1)
        .RemoveItem i + 1
        .ListIndex = -1
        .List = .List
      End If
    End With
End Sub

Gruß Uwe
Hallo Kuwer,

vielen Dank, jetzt läuft es so wie es sollte.

mfg