Discussion:
Werte aus Listbox auslesen
(zu alt für eine Antwort)
CK
2009-08-09 18:27:05 UTC
Permalink
Hallo Zusammen,

ich habe eine Listebox mit 5 Zeilen und 7 Spalten. Wenn ich nun auf
einen einen Wert in dieser Matrix klicken, so möchte ich diesen Wert in
meiner Tabelle in Celle A1 kopieren. Es muss also möglich sein, das die
entsprechende Zeile und spalte erkannt wird und dieser Wert übergeben
wird. Vielen Dank

Gruss
Andreas Killer
2009-08-10 10:15:47 UTC
Permalink
Post by CK
ich habe eine Listebox mit 5 Zeilen und 7 Spalten. Wenn ich nun auf
einen einen Wert in dieser Matrix klicken, so möchte ich diesen Wert in
meiner Tabelle in Celle A1 kopieren. Es muss also möglich sein, das die
entsprechende Zeile und spalte erkannt wird und dieser Wert übergeben
wird. Vielen Dank
Nun zum einen kannst Du nicht auf einen einzelnen Wert klicken,
sondern nur auf eine ganze Zeile, die dann anschließend markiert ist.

Zum anderen gibt es bei einer Listbox das Event MouseUp welches u.a.
die Kooridiante X übergeben bekommt die sich auf die Position
innerhalb der Listbox bezieht.

Nun könntest Du mit einer Schleife von X die jeweilige Spaltenbreite
abziehen und wenn X<0 dann hast Du die Spalte auf die geklickt wurde.
Das blöde daran ist das Du die Spaltenbreite(n) nicht einzeln
bekommst, sondern als String mit ; getrennt, siehe .ColumnWidths, d.h.
Du musst diesen schon selber auswerten.

Dann kannst Du das Element direkt mit .List(.ListIndex, Spalte)
ermitteln.

Andreas.
CK
2009-08-13 20:40:46 UTC
Permalink
Post by Andreas Killer
Post by CK
ich habe eine Listebox mit 5 Zeilen und 7 Spalten. Wenn ich nun auf
einen einen Wert in dieser Matrix klicken, so möchte ich diesen Wert in
meiner Tabelle in Celle A1 kopieren. Es muss also möglich sein, das die
entsprechende Zeile und spalte erkannt wird und dieser Wert übergeben
wird. Vielen Dank
Nun zum einen kannst Du nicht auf einen einzelnen Wert klicken,
sondern nur auf eine ganze Zeile, die dann anschließend markiert ist.
Zum anderen gibt es bei einer Listbox das Event MouseUp welches u.a.
die Kooridiante X übergeben bekommt die sich auf die Position
innerhalb der Listbox bezieht.
Nun könntest Du mit einer Schleife von X die jeweilige Spaltenbreite
abziehen und wenn X<0 dann hast Du die Spalte auf die geklickt wurde.
Das blöde daran ist das Du die Spaltenbreite(n) nicht einzeln
bekommst, sondern als String mit ; getrennt, siehe .ColumnWidths, d.h.
Du musst diesen schon selber auswerten.
Dann kannst Du das Element direkt mit .List(.ListIndex, Spalte)
ermitteln.
Andreas.
Hallo Andreas,

vielen Dank für die Antwort. Allerdings habe ich es noch nicht ganz
verstanden. Jedes mal wenn man die Listbox verschiebt bekommt man einen
anderen Wert. Sowohl für X auch Y koordinate.

Trotzdem Danke nochmal

Gruß
Andreas Killer
2009-08-14 12:57:41 UTC
Permalink
Post by CK
vielen Dank für die Antwort. Allerdings habe ich es noch nicht ganz
verstanden. Jedes mal wenn man die Listbox verschiebt bekommt man einen
anderen Wert. Sowohl für X auch Y koordinate.
Bei mir ist der immer gleich, reden wir aneinander vorbei?

Mach Dir mal eine Userform und darauf eine Listbox, sonst nix. Dann
kopierst Du den angehängten Code rein und läßt es mal laufen. Geht's?

Andreas.

Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift _
As Integer, ByVal X As Single, ByVal Y As Single)
Dim Breite, Spalte As Integer
With ListBox1
Breite = Split(Replace(.ColumnWidths, "Pt", "", Compare:= _
vbTextCompare), ";")
For Spalte = LBound(Breite) To UBound(Breite)
X = X - Breite(Spalte)
If X <= 0 Then Exit For
Next
MsgBox ("Item " & .List(.ListIndex, Spalte))
End With
End Sub

Private Sub UserForm_Initialize()
Dim i As Integer, j As Integer
With ListBox1
.ColumnCount = 7
.ColumnWidths = "20;40;30;25;25;35"
.ColumnHeads = True
For j = 0 To 5
.AddItem
For i = 0 To 6
.List(j, i) = i * (j + 1) + (j * 7)
Next
Next
End With
End Sub
CK
2009-08-15 09:25:19 UTC
Permalink
Post by Andreas Killer
Post by CK
vielen Dank für die Antwort. Allerdings habe ich es noch nicht ganz
verstanden. Jedes mal wenn man die Listbox verschiebt bekommt man
einen anderen Wert. Sowohl für X auch Y koordinate.
Bei mir ist der immer gleich, reden wir aneinander vorbei?
Mach Dir mal eine Userform und darauf eine Listbox, sonst nix. Dann
kopierst Du den angehängten Code rein und läßt es mal laufen. Geht's?
Andreas.
Private Sub ListBox1_MouseUp(ByVal Button As Integer, ByVal Shift _
As Integer, ByVal X As Single, ByVal Y As Single)
Dim Breite, Spalte As Integer
With ListBox1
Breite = Split(Replace(.ColumnWidths, "Pt", "", Compare:= _
vbTextCompare), ";")
For Spalte = LBound(Breite) To UBound(Breite)
X = X - Breite(Spalte)
If X <= 0 Then Exit For
Next
MsgBox ("Item " & .List(.ListIndex, Spalte))
End With
End Sub
Private Sub UserForm_Initialize()
Dim i As Integer, j As Integer
With ListBox1
.ColumnCount = 7
.ColumnWidths = "20;40;30;25;25;35"
.ColumnHeads = True
For j = 0 To 5
.AddItem
For i = 0 To 6
.List(j, i) = i * (j + 1) + (j * 7)
Next
Next
End With
End Sub
Hallo Andreas,
das funktioniert ja super. Kannst Du mir bitte nochmal den
ListBox1_MouseUp teil erklären.

Was ich noch nicht ganz verstanden habe ist

Breite = Split(Replace(.ColumnWidths, "Pt", "", Compare:= _
Post by Andreas Killer
vbTextCompare), ";")
Was macht dieser Teil und wozu wird es benötigt?

Spalte = LBound(Breite) To UBound(Breite)

Vielen Dank schon mal im Voraus.

Gruss
Andreas Killer
2009-08-15 16:52:58 UTC
Permalink
Post by Andreas Killer
Breite = Split(Replace(.ColumnWidths, "Pt", "", Compare:= _
Post by Andreas Killer
vbTextCompare), ";")
Was macht dieser Teil und wozu wird es benötigt?
Hast Du schon mal das Überwachungsfenster zum überwachen von
Ausdrücken benutzt?

Also VBA-Editor an, Code rein und dann klickst Du auf obige Zeile und
drückst F9 um einen Haltepunkt zu setzen.
Drück F5 um die Userform zu starten und klick in die Listbox.
Der Code stoppt an der obigen Stelle mit dem Haltepunkt.

Nun klick mal auf Ansicht\Überwachungsfenster

Markiere das Wort Breite (z.B. mittels Doppelklick darauf)
Drück Shift-F9 oder klick Debuggen\Aktuellen Wert anzeigen
Klick hinzufügen.

Im Überwachungsfenster siehst Du nun das Breite den Wert "leer" hat.
Bewege den Mauscursor auf .ColumnWidths und halte still. Nach einem
Moment siehst Du einen Tooltip der Dir den Inhalt anzeigt:
"20 Pt;40 Pt" usw.
(Falls nicht markiere .ColumnWidths und drück Shift-F9, dann abbrechen)

Drück F8 um die Zeile auszuführen und schau in das
Überwachungsfenster, Breite ist nun vom Typ Variant/String(0 to 5).
Klick auf das + links neben Breite und nun kannst Du die einzelnen
Werte sehen.

Kurz gesagt: Die Zeile zerlegt alle Breiten in einzelne Werte und gibt
die so die breite jeder einzelnen Spalte zurück.
Post by Andreas Killer
Spalte = LBound(Breite) To UBound(Breite)
Breite ist ja ein Array und diese können je nach "Option Base" mit 0
oder 1 anfangen, d.h. Breite könnte ein String(0 to 5) oder
String(1 to 6) sein.

Mit LBound kann man die untere Grenze und UBound die obere Grenze des
Array's zuverlässig feststellen. Wenn man's genau weiß kann man auch
for Spalte = 0 To 5 sagen.

Andreas.

Loading...