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
> 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.
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�
> vielen Dank f锟絩 die Antwort. Allerdings habe ich es noch nicht ganz
> verstanden. Jedes mal wenn man die Listbox verschiebt bekommt man einen
> anderen Wert. Sowohl f锟絩 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锟絥gten 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锟絩en.
Was ich noch nicht ganz verstanden habe ist
Breite = Split(Replace(.ColumnWidths, "Pt", "", Compare:= _
> vbTextCompare), ";")
Was macht dieser Teil und wozu wird es ben锟絫igt?
Spalte = LBound(Breite) To UBound(Breite)
Vielen Dank schon mal im Voraus.
Gruss
> Breite = Split(Replace(.ColumnWidths, "Pt", "", Compare:= _
> > 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.
> 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.