ListBox.List
#1
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


Angehängte Dateien
.xlsm   ListBox.xlsm (Größe: 16,94 KB / Downloads: 11)
Antworten Top
#2
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
Antworten Top
#3
Danke

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

mfg
Antworten Top
#4
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
Antworten Top
#5
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


Angehängte Dateien
.xlsm   ListBox.xlsm (Größe: 23,61 KB / Downloads: 4)
Antworten Top
#6
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
Antworten Top
#7
Hallo Kuwer,

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

mfg
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste