Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Listbox füllen

Forumthread: Listbox füllen

Listbox füllen
04.10.2022 17:04:20
Thomas
Hallo,
ich möchte eine Listbox mit mehr wie 10 Spalten und ca. 3 Zeilen füllen.
Die 10 Spalten habe ich hinbekommen, aber wie bekomme ich jetzt auch noch Beispielsweise zu den Spalten 3 Zeilen hin?
Hab es so versucht:

Sub MitarbeiterDetails()
Dim lngRow As Long
Dim rngFind As Range
Dim arrMitDetails As Variant
Dim arrMitDetails2 As Variant
Dim arrMitDetails3 As Variant
forMitarbeiter.libMitarbeiterDetails.ColumnCount = 27
forMitarbeiter.libMitarbeiterDetails.ColumnWidths = "1,7cm;1,9cm;1,3cm;1,7cm;1,7cm;1,3cm;1,9cm;1,7cm;1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,5cm"
With tblDaten
For lngRow = 0 To forMitarbeiter.libMitarbeiter.ListCount - 1
If forMitarbeiter.libMitarbeiter.Selected(lngRow) Then
Set rngFind = tblDaten.Range("A:A").Find(What:=forMitarbeiter.libMitarbeiter.List(lngRow), LookIn:=xlValues, LookAt:=xlWhole)
If Not rngFind Is Nothing Then
arrMitDetails = .Range(.Cells(rngFind.Row, 8), .Cells(rngFind.Row, 33))
forMitarbeiter.libMitarbeiterDetails.List = arrMitDetails
arrMitDetails2 = .Range(.Cells(rngFind.Row + 1, 8), .Cells(rngFind.Row + 1, 33))
forMitarbeiter.libMitarbeiterDetails.List = arrMitDetails2
arrMitDetails3 = .Range(.Cells(rngFind.Row + 2, 8), .Cells(rngFind.Row + 2, 33))
forMitarbeiter.libMitarbeiterDetails.List(2) = arrMitDetails3
End If
End If
Next lngRow
End With
End Sub
Wenn ich das hier

arrMitDetails2 = .Range(.Cells(rngFind.Row + 1, 8), .Cells(rngFind.Row + 1, 33))
forMitarbeiter.libMitarbeiterDetails.List = arrMitDetails2
arrMitDetails3 = .Range(.Cells(rngFind.Row + 2, 8), .Cells(rngFind.Row + 2, 33))
forMitarbeiter.libMitarbeiterDetails.List(2) = arrMitDetails3
weg lasse, dann werden mit die Spalten und eine Zeile korrekt gefüllt, aber wie bekomme ich die beiden anderen Zeilen jetzt noch dazu?
Danke
Anzeige

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Listbox füllen
04.10.2022 17:53:25
Nepumuk
Hallo Thomas,
teste mal:

Sub MitarbeiterDetails()
Dim lngRow As Long, ialngIndex As Long
Dim rngFind As Range
Dim arrMitDetails As Variant
Dim arrMitDetails2 As Variant
Dim arrMitDetails3 As Variant
forMitarbeiter.libMitarbeiterDetails.ColumnCount = 27
forMitarbeiter.libMitarbeiterDetails.ColumnWidths = "1,7cm;1,9cm;1,3cm;1,7cm;1,7cm;1,3cm;1,9cm;1,7cm;1,7cm;1,5cm;" & _
"1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,5cm"
With tblDaten
For lngRow = 0 To forMitarbeiter.libMitarbeiter.ListCount - 1
If forMitarbeiter.libMitarbeiter.Selected(lngRow) Then
Set rngFind = .Columns(1).Find(What:=forMitarbeiter.libMitarbeiter.List(lngRow), LookIn:=xlValues, LookAt:=xlWhole)
If Not rngFind Is Nothing Then
arrMitDetails = .Range(.Cells(rngFind.Row, 8), .Cells(rngFind.Row, 33))
arrMitDetails2 = .Range(.Cells(rngFind.Row + 1, 8), .Cells(rngFind.Row + 1, 33))
arrMitDetails3 = .Range(.Cells(rngFind.Row + 2, 8), .Cells(rngFind.Row + 2, 33))
forMitarbeiter.libMitarbeiterDetails.List = arrMitDetails
With forMitarbeiter.libMitarbeiterDetails
.List = arrMitDetails
.AddItem
.AddItem
For ialngIndex = LBound(arrMitDetails2) To UBound(arrMitDetails2)
.List(1, ialngIndex - 1) = arrMitDetails2(1, ialngIndex)
.List(2, ialngIndex - 1) = arrMitDetails3(1, ialngIndex)
Next
End With
End If
End If
Next lngRow
End With
End Sub
Gruß
Nepumuk
Anzeige
AW: Listbox füllen
05.10.2022 09:58:12
Thomas
Hallo Nepumuk,
vielen Dank dafür, funktioniert auch fast, nur leider werden die beiden unteren Zeilen nur in Spalte 1 gefüllt, wenn ich das richtig sehe liegt das hier dran:

 For lngIndex = LBound(arrMitDetails2) To UBound(arrMitDetails2)
, da UBound auch nur = 1 ist, zumindest wird das im Debug angezeigt und daher läuft die Schleife nur einmal und schreibt nur in die erste Spalte in der zweiten und dritten Zeile.
Wenn ich UBound durch 26 ersetze, dann klappt es wie es soll.
Anzeige
AW: Listbox füllen
05.10.2022 10:51:20
Nepumuk
Hallo Thomas,
mein Fehler. Ich habe anfangs noch daran gedacht, aber es beim Schreiben des Codes vergessen.
So ist es richtig:

 For lngIndex = LBound(arrMitDetails2, 2) To UBound(arrMitDetails2, 2)
Gruß
Nepumuk
AW: Listbox füllen
05.10.2022 11:35:19
Thomas
Hallo Nepumuk,
vielen Dank das klappt, kannst du mir vielleicht noch kurz erklären was die Zeile genau macht?
Und jetzt würde ich gerne noch unter der jeweiligen Spalte eine Berechung durchführen lassen, in Form von Zeile 2 Minus Zeile 3, hatte gedacht so ginge es

.List(3, lngIndex - 1) = .List(1, lngIndex - 1) - .List(2, lngIndex - 1)
, aber dann bekomme ich einen Fehler:
"Laufzeitfehler 381, Eigenschaft List konnte nicht gesetzt werden. Index des Eigenschaftenfeldes ungültig"
Danke
Anzeige
AW: Listbox füllen
05.10.2022 11:43:26
Nepumuk
Hallo Thomas,
du musst noch eine Zeile hinzufügen damit du darin schreiben kannst:

Sub MitarbeiterDetails()
Dim lngRow As Long, ialngIndex As Long
Dim rngFind As Range
Dim arrMitDetails As Variant
Dim arrMitDetails2 As Variant
Dim arrMitDetails3 As Variant
forMitarbeiter.libMitarbeiterDetails.ColumnCount = 27
forMitarbeiter.libMitarbeiterDetails.ColumnWidths = "1,7cm;1,9cm;1,3cm;1,7cm;1,7cm;1,3cm;1,9cm;1,7cm;1,7cm;1,5cm;" & _
"1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,7cm;1,5cm;1,5cm"
With tblDaten
For lngRow = 0 To forMitarbeiter.libMitarbeiter.ListCount - 1
If forMitarbeiter.libMitarbeiter.Selected(lngRow) Then
Set rngFind = .Columns(1).Find(What:=forMitarbeiter.libMitarbeiter.List(lngRow), LookIn:=xlValues, LookAt:=xlWhole)
If Not rngFind Is Nothing Then
arrMitDetails = .Range(.Cells(rngFind.Row, 8), .Cells(rngFind.Row, 33))
arrMitDetails2 = .Range(.Cells(rngFind.Row + 1, 8), .Cells(rngFind.Row + 1, 33))
arrMitDetails3 = .Range(.Cells(rngFind.Row + 2, 8), .Cells(rngFind.Row + 2, 33))
forMitarbeiter.libMitarbeiterDetails.List = arrMitDetails
With forMitarbeiter.libMitarbeiterDetails
.List = arrMitDetails
.AddItem
.AddItem
.AddItem
For ialngIndex = LBound(arrMitDetails2, 2) To UBound(arrMitDetails2, 2)
.List(1, ialngIndex - 1) = arrMitDetails2(1, ialngIndex)
.List(2, ialngIndex - 1) = arrMitDetails3(1, ialngIndex)
.List(3, ialngIndex - 1) = CDbl(arrMitDetails2(1, ialngIndex)) - CDbl(arrMitDetails3(1, ialngIndex))
Next
End With
End If
End If
Next lngRow
End With
End Sub
Gruß
Nepumuk
Anzeige
AW: Listbox füllen
05.10.2022 11:51:58
Thomas
Hallo Nepumuk,
danke, das war mir in der Zwischenzeit auch aufgefallen, manchmal sieht man den Wald vor lauter Bäumen nicht.... Aber wie es sich gehört gibts ein weiteres Problem :-(
In meiner Test Tabelle gibt es Zellenohne Wert, das sollte man natürlich grundsätzlich vermeiden und würde ich auch in der richtigen Datei versuchen abzufangen, aber weil ich grade hier darüber stolpere, habe ich versucht das abzufangen, das wenn kein Wert in einer Zelle steht, eine "0" genommen wird zum rechnen, aber leider gibt es auch da einen Fehler.

 If .List(1, lngIndex - 1) = "" Then .List(1, lngIndex - 1).Value = 0
If .List(2, lngIndex - 1) = "" Then .List(2, lngIndex - 1).Value = 0
.List(3, lngIndex - 1) = .List(1, lngIndex - 1) - .List(2, lngIndex - 1)
Wie müsste ich es hier richtig machen um Zellen ohne Werte abzufangen?
Danke
Anzeige
AW: Listbox füllen
05.10.2022 12:02:01
Nepumuk
Hallo Thomas,
dann so:

.List(3, ialngIndex - 1) = IIf(IsEmpty(arrMitDetails2(1, ialngIndex)), 0, arrMitDetails2(1, ialngIndex)) - _
IIf(IsEmpty(arrMitDetails3(1, ialngIndex)), 0, arrMitDetails3(1, ialngIndex))
Gruß
Nepumuk
AW: Listbox füllen
05.10.2022 13:18:29
Thomas
Hallo Nepumuk,
das funktioniert Perfekt, Danke dafür.
Jetzt hab ich nur noch zwei fragen zu der Listbox, also zu diesem konstrukt hier, zum einen finde ich keine Lösung die Zahlen mit Tausender Trennpunkt in die Listbox zu bekommen und zum anderen, gibt es die möglichkeit eine einzelne Zeile in der Listbox einzufärben? In diesem Fall die Zeile .List(3, lngIndex - 1) wo das Ergebnis der Berechnung erscheint.
Danke
Anzeige
AW: Listbox füllen
05.10.2022 14:20:30
Nepumuk
Hallo Thomas,
1.:

    .List(3, ialngIndex - 1) = Format$(IIf(IsEmpty(arrMitDetails2(1, ialngIndex)), 0, arrMitDetails2(1, ialngIndex)) - _
IIf(IsEmpty(arrMitDetails3(1, ialngIndex)), 0, arrMitDetails3(1, ialngIndex)), "#,###.00")
2. Nein, einzelne Zeilen lassen sich nicht einfärben.
Gruß
Nepumuk
Anzeige
AW: Listbox füllen
05.10.2022 14:36:11
Thomas
Hi, hab das Format nochmal so abgeändert "#,#0" und dann bekomme ich es mit Tausenderpunkt ohne Nachkommastellen, sieht zumindest so aus wie ich es gerne hätte, vielen Dank. Was bedeutet das $ hinter Format? Kenne den Format Befehl nur ohne das!?
Danke
AW: Listbox füllen
05.10.2022 17:13:48
Nepumuk
Hallo Thomas,
Format ohne $ gibt einen Variant Untertyp String zurück Format$ gibt einen String zurück. Das ist schneller und benötigt weniger Speicher. Das gilt für fast alle String-Operationen wie UCase$, Left$, Replace$ usw.
Gruß
Nepumuk
Anzeige
AW: Listbox füllen
05.10.2022 20:22:54
Thomas
Hallo Nepumuk, super vielen Dank für die Erklärung, das hab ich noch nirgendwo gelesen.
AW: Listbox füllen
04.10.2022 18:11:42
snb
Eigenschaften einer Control (wie Columncount oder Columnwidts) sollte man im Design Modus einstellen
Dieser Code muss im Makromodule der Userform gespeichert werden.

Sub M_snb()
For j = 0 To libMitarbeiter.ListCount - 1
If libMitarbeiter.Selected(j) Then c00 = c00 & " " & j
Next
st = Split(Trim(c00))
libMitarbeiterDetails.List = Application.Index(tblDaten.Cells(1).CurrentRegion.Value, Application.Transpose(st), [row(1:27)])
End Sub

Anzeige
AW: Listbox füllen
04.10.2022 18:13:07
snb
Codeverbesserung:

Sub M_snb()
For j = 0 To libMitarbeiter.ListCount - 1
If libMitarbeiter.Selected(j) Then c00 = c00 & " " & j +1
Next
st = Split(Trim(c00))
libMitarbeiterDetails.List = Application.Index(tblDaten.Cells(1).CurrentRegion.Value, Application.Transpose(st), [row(1:27)])
End Sub

Anzeige
AW: Listbox füllen
05.10.2022 10:16:20
Thomas
Hi snb,
bin mir nicht sicher ob ich deine Variablen richtig interpretiere und definiere, jedenfalls wenn ich es so mache

 Dim j As Integer
Dim st As Variant
Dim c00 As String
For j = 0 To libMitarbeiter.ListCount - 1
If libMitarbeiter.Selected(j) Then c00 = c00 & " " & j + 1
Next
st = Split(Trim(c00))
libMitarbeiterDetails.List = Application.Index(tblDaten.Cells(1).CurrentRegion.Value, Application.Transpose(st), [row(1:27)])
dann kommt keine Fehlermeldung, aber es passiert auch sonst nichts. Allerdings verstehe ich auch ehrlich gesagt nicht wirklich was in dieser Zeile passiert, kannst du das vielleicht kurz erklären.

  libMitarbeiterDetails.List = Application.Index(tblDaten.Cells(1).CurrentRegion.Value, Application.Transpose(st), [row(1:27)])
Danke
Anzeige
;

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige