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

Forumthread: ListBox-Eintrag Anzeige in TextBoxen

ListBox-Eintrag Anzeige in TextBoxen
27.06.2019 08:29:17
Matthias
Guten Morgen,
ich habe folgendes Problem und würde mich über einen Lösungsvorschlag sehr freuen.
In einer UserForm-ListBox werden 4 Spalten aus einem Tabellenblatt wiedergegeben (Kreis/Bundesland/Leistungserbringer/Anbieter). Wenn ich auf eine Zeile in der ListBox klicke wird der Inhalt wiederum verteilt auf einige TextBoxen und ComboBoxen dargestellt. Das funktioniert auch, nur mit einem kleinen Haken. Sobald der gleiche Text in Spalte 1 mehrmals vorkommt (mehrere gleiche Kreise mit verschiedenen Leistungserbringern) wird immer nur der erste Eintrag in die Boxen übernommen. Das gleiche Problem hatte ich schon mal als ich noch die Bundesländer in Spalte 1 hatte, wo es ja dann viele gleiche Zeilen gibt mit unterschiedlichen Kreisen.
Hier der Code dazu:

Private Sub ListBox1_Click() ' Ereignisroutine ListBox
Dim lZeile As Long
'Löschen der Inhalte
TextBoxLeistungserbringer = ""
TextBoxDatumEinfuehrung = ""
TextBoxDatumNutzung = ""
TextBoxDatumStand = ""
TextBoxKommentarfeld = ""
ComboBoxAnbieter = ""
ComboBoxProdukt = ""
If ListBox1.ListIndex >= 0 Then 'Nur wenn ein Eintrag selektiert/markiert ist
lZeile = 2 'Start in Zeile 2, Zeile 1 sind Überschriftrn
Do While Tabelle1.Cells(lZeile, 1).Value  "" 'Schleife solange etwas in der ersten Spalte  _
in Tabelle 1 drin steht
'Text finden und übertragen
If ListBox1.Text = Tabelle1.Cells(lZeile, 1).Value Then
'TextBoxen füllen
TextBoxKreis = Tabelle1.Cells(lZeile, 1).Value
TextBoxBundesland = Tabelle1.Cells(lZeile, 2).Value
TextBoxLeistungserbringer = Tabelle1.Cells(lZeile, 3).Value
ComboBoxAnbieter = Tabelle1.Cells(lZeile, 4).Value
ComboBoxProdukt = Tabelle1.Cells(lZeile, 5).Value
TextBoxXX = Tabelle1.Cells(lZeile, 6).Value
TextBoxDatumEinfuehrung = Tabelle1.Cells(lZeile, 7).Value
TextBoxDatumNutzung = Tabelle1.Cells(lZeile, 8).Value
TextBoxDatumStand = Tabelle1.Cells(lZeile, 9).Value
TextBoxKommentarfeld = Tabelle1.Cells(lZeile, 10).Value
Exit Do 'Vorzeitiges Ende, da der Datensatz schon gefunden ist
End If
lZeile = lZeile + 1 'Nächste Zeile bearbeiten
Loop
End If
End Sub

Ich denke, dass das Problem an der Stelle "Text finden und übertragen" liegt, der erste übereinstimmende Text und die Spalten daneben werden übernommen auch wenn dahinter erst der eigentlich ausgewählte Kreis kommt. Wie kann ich die Boxen in Abhängigkeit von zwei Spalten anstelle nur der ersten Spalte füllen? Könnte ich die Spalten auch frei definieren, z.B. dritte und vierte?
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ListBox-Eintrag Anzeige in TextBoxen
27.06.2019 08:53:35
Werner
Hallo Matthias,
wie füllst du denn deine Listbox?
Am besten mal deine Mappe hochladen.
Gruß Werner
AW: ListBox-Eintrag Anzeige in TextBoxen
27.06.2019 09:15:10
Matthias
Hallo Werner,
die Mappe enthält ziemlich viel Zeug, dass ich nicht veröffentlichen kann, daher hier nur mal der Code zum Füllen der Liste:
Private Sub Wettbewerb() 'gefilterte Daten in Listbox anzeigen
Dim lLetzte As Long
Dim lZeile As Long
Dim lLibox As Long
ListBox1.Clear
With Worksheets("Tabelle1")
lLetzte = .Cells(Rows.Count, 1).End(xlUp).Row
For lZeile = 2 To lLetzte
If .Cells(lZeile, 1) = "" Then Exit For
If .Rows(lZeile).Hidden = False Then
ListBox1.AddItem
ListBox1.List(lLibox, 0) = .Cells(lZeile, 1).Value
ListBox1.List(lLibox, 1) = .Cells(lZeile, 2).Value
ListBox1.List(lLibox, 2) = .Cells(lZeile, 3).Value
ListBox1.List(lLibox, 3) = .Cells(lZeile, 4).Value 'Anzeige der ersten 4  _
Spalten
lLibox = lLibox + 1
End If
Next
End With
End Sub

Anzeige
AW: ListBox-Eintrag Anzeige in TextBoxen
27.06.2019 09:49:08
Werner
Hallo Matthias,
erweitere deine Listbox um eine Spalte auf insgesamt 5 Spalten. Die Spaltenbreite der 5. Spalte setzt du in den Eigenschaften der Listbox auf eine Breite von 0, dann wird dir die Spalte nicht angezeigt.
In diese "ausgeblendete" Spalte liest du dann beim Befüllen der Listbox einfach die Zeilennummer der Tabelle mit ein, aus der du den Datensatz in die Listbox holst.
Dim lLetzte As Long, lZeile As Long, lLibox As Long
ListBox1.Clear
With Worksheets("Tabelle1")
lLetzte = .Cells(Rows.Count, 1).End(xlUp).Row
For lZeile = 2 To lLetzte
If .Cells(lZeile, 1) = "" Then Exit For
If .Rows(lZeile).Hidden = False Then
ListBox1.AddItem
ListBox1.List(lLibox, 0) = .Cells(lZeile, 1).Value
ListBox1.List(lLibox, 1) = .Cells(lZeile, 2).Value
ListBox1.List(lLibox, 2) = .Cells(lZeile, 3).Value
ListBox1.List(lLibox, 3) = .Cells(lZeile, 4).Value
'hier Zeilennummer des Datensatzes in Spalte 5 der Listbox
ListBox1.List(lLibox, 4) = lZeile
lLibox = lLibox + 1
End If
Next
End With
Beim Übertragen der Daten aus der Listbox in die Textboxen kannst du dann einfach auf diese Zeilennummer in der Spalte 5 der Listbox zugreifen.
Private Sub ListBox1_Click()
With Worksheets("Tabelle1")
Me.TextBox1 = .Cells(Me.ListBox1.List(Me.ListBox1.ListIndex, 4), 1)
Me.TextBox2 = .Cells(Me.ListBox1.List(Me.ListBox1.ListIndex, 4), 2)
Me.TextBox3 = .Cells(Me.ListBox1.List(Me.ListBox1.ListIndex, 4), 3)
Me.TextBox4 = .Cells(Me.ListBox1.List(Me.ListBox1.ListIndex, 4), 4)
End With
End Sub
Gruß Werner
Anzeige
AW: ListBox-Eintrag Anzeige in TextBoxen
27.06.2019 12:47:46
Matthias
Hi Werner.
Ich habe deine Codes übernommen, jedoch habe ich keine unsichtbare Spalte in der ListBox hinzugefügt und mit Spalte 5 auch nichts weiter gemacht (bleibt eine ganz normale Datenspalte), es geht anscheinend trotzdem. Ich konnte jetzt sogar meine favorisierte Reihenfolge der Spalten realisieren. Ich weiß nicht genau warum, aber es funktioniert jetzt. Also vielen Dank schon mal.
Für alle die es ähnlich bauen wollen hier noch die Essentials:
Autofilter des Tabellenblattes:
Private Sub Auswahl_BL() ' Autofilter nach Bundesland
Dim sngIndex As Single
Dim ialngCount As Long
Dim astrFilterArray() As String
For sngIndex = 1 To 16
If Wettbewerbstafel("CheckBox" & CStr(sngIndex)).Value = True Then
ReDim Preserve astrFilterArray(ialngCount)
astrFilterArray(ialngCount) = Choose(sngIndex, "Baden-Württemberg", "Bayern", " _
Berlin", "Brandenburg", "Bremen", "Hamburg", _
"Hessen", "Mecklenburg-Vorpommern", "Niedersachsen", "Nordrhein-Westfalen", " _
Rheinland-Pfalz", "Saarland", "Sachsen", "Sachsen-Anhalt", "Schleswig-Holstein", "Thüringen")
ialngCount = ialngCount + 1
End If
Next
With Sheets("Tabelle1").Range("A:J")
If ialngCount > 0 Then
Call .AutoFilter(Field:=1, Criteria1:=astrFilterArray, Operator:=xlFilterValues)
Else
Call .AutoFilter(Field:=1)
End If
End With
End Sub
Auswahl über CheckBoxen:
Private Sub CheckBox1_Click() 'Bundeslandauswahl
Call Auswahl_BL
Call Wettbewerb
End Sub
ListBox füllen über:
Private Sub Wettbewerb() 'gefilterte Daten in Listbox anzeigen
Dim lLetzte As Long
Dim lZeile As Long
Dim lLibox As Long
ListBox1.Clear
With Worksheets("Tabelle1")
lLetzte = .Cells(Rows.Count, 1).End(xlUp).Row
For lZeile = 2 To lLetzte
If .Cells(lZeile, 1) = "" Then Exit For
If .Rows(lZeile).Hidden = False Then
ListBox1.AddItem
ListBox1.List(lLibox, 0) = .Cells(lZeile, 1).Value
ListBox1.List(lLibox, 1) = .Cells(lZeile, 2).Value
ListBox1.List(lLibox, 2) = .Cells(lZeile, 3).Value
ListBox1.List(lLibox, 3) = .Cells(lZeile, 4).Value
'hier Zeilennummer des Datensatzes in Spalte 5 der Listbox
ListBox1.List(lLibox, 4) = lZeile
lLibox = lLibox + 1
End If
Next
End With
End Sub
Und:
Private Sub ListBox1_Click() ' Ereignisroutine ListBox
With Worksheets("Tabelle1")
Me.TextBoxBundesland = .Cells(Me.ListBox1.List(Me.ListBox1.ListIndex, 4), 1)
Me.TextBoxKreis = .Cells(Me.ListBox1.List(Me.ListBox1.ListIndex, 4), 2)
Me.TextBoxLeistungserbringer = .Cells(Me.ListBox1.List(Me.ListBox1.ListIndex, 4), 3)
Me.ComboBoxAnbieter = .Cells(Me.ListBox1.List(Me.ListBox1.ListIndex, 4), 4)
Me.ComboBoxProdukt = .Cells(Me.ListBox1.List(Me.ListBox1.ListIndex, 4), 5)
Me.TextBoxXXX = .Cells(Me.ListBox1.List(Me.ListBox1.ListIndex, 4), 6)
Me.TextBoxDatumEinfuehrung = .Cells(Me.ListBox1.List(Me.ListBox1.ListIndex, 4), 7)
Me.TextBoxDatumNutzung = .Cells(Me.ListBox1.List(Me.ListBox1.ListIndex, 4), 8)
Me.TextBoxDatumStand = .Cells(Me.ListBox1.List(Me.ListBox1.ListIndex, 4), 9)
Me.TextBoxKommentarfeld = .Cells(Me.ListBox1.List(Me.ListBox1.ListIndex, 4), 10)
End With
End Sub

Anzeige
AW: ListBox-Eintrag Anzeige in TextBoxen
27.06.2019 13:16:19
Matthias
Oha.
Leider demontiert mir die obige Lösung andere Funktionen. Nämlich Neuer Eintrag, Speichern, Löschen. Das hängt wohl mit den ID Zellen zusammen. Die Fehler sind folgende:
Neuer Eintrag:
Laufzeitfehler 13 hier:
Private Sub ListBox1_Click() ' Ereignisroutine ListBox
With Worksheets("Tabelle1")
Me.TextBoxBundesland = .Cells(Me.ListBox1.List(Me.ListBox1.ListIndex, 4), 1)
(...)
End Sub

Speichern:
fügt neue Zeile hinzu mit geänderten Daten
Löschen:
Löscht nur obersten Eintrag der Liste, auch wenn andere Zeile ausgewählt ist
Hier der Code, der vorher funktioniert hat:
Private Sub CommandButton1_Click() 'Neuer Eintrag Schaltfläche
Dim lZeile As Long
'neuer Eintrag und Markierung
lZeile = 2 'Start in Zeile 2
Do While Tabelle1.Cells(lZeile, 1).Value  "" 'Schleife solange etwas in der ersten Spalte  _
in Tabelle 1 drin steht
lZeile = lZeile + 1 'Nächste Zeile bearbeiten
Loop
'Nach Durchlauf dieser Schleife steht lZeile in der ersten leeren Zeile von Tabelle1
'Neuen Eintrag in die Tabelle1 schreiben, Spalte ID muss gefüllt sein, damit
'die Routinen die Zeile wiederfinden!
Tabelle1.Cells(lZeile, 1) = CStr("Neues Bundesland")
ListBox1.AddItem CStr("Neues Bundesland") 'Neuen Eintrag in die UserForm eintragen
'Den neuen Eintrag markieren mit Hilfe des ListIndexes
ListBox1.ListIndex = ListBox1.ListCount - 1
'Durch das Click Ereignis der ListBox werden die Daten automatisch geladen
End Sub

Private Sub CommandButton2_Click() 'Löschen Schaltfläche
Dim lZeile As Long
'Wenn kein Datensatz in der ListBox markiert wurde, wird die Routine beendet
If ListBox1.ListIndex = -1 Then Exit Sub
'Zum Löschen benötigen wir die Zeilennummer des ausgewählten Datensatzes
lZeile = 2 'Start in Zeile 2, Zeile 1 sind ja die Überschriftrn
'Schleife solange etwas in der ersten Spalte in Tabelle 1 drin steht
Do While Tabelle1.Cells(lZeile, 1).Value  ""
'Datensatz ID Spalte mit selektiertem Eintrag der ListBox vergleichen
If ListBox1.Text = Tabelle1.Cells(lZeile, 1).Value Then
'Eintrag gefunden, die ganze Zeile wird nun gelöscht
Tabelle1.Rows(CStr(lZeile & ":" & lZeile)).Delete
'Die ListBox muss nun neu geladen werden!
Call Wettbewerb
If ListBox1.ListCount > 0 Then ListBox1.ListIndex = 0
Exit Do 'Vorzeitiges Ende, da der Datensatz schon gefunden ist
End If
lZeile = lZeile + 1 'Nächste Zeile bearbeiten
Loop
End Sub

Private Sub CommandButton3_Click() 'Speichern Schaltfläche Ereignisroutine
Dim lZeile As Long
'Wenn kein Datensatz in der ListBox markiert wurde, wird die Routine beendet
If ListBox1.ListIndex = -1 Then Exit Sub
'Wir müssen prüfen, ob die ID Spalte auch gefüllt ist!!
If Trim(CStr(TextBoxBundesland.Text)) = "" Then
'Meldung ausgeben
MsgBox "Sie müssen mindestens einen Namen eingeben!", vbCritical + vbOKOnly, "FEHLER!"
'Abbrechen des Speicherroutine
Exit Sub
End If
'Zum Speichern Zeilennummer des ausgewählten Datensatzes
lZeile = 2 'Start in Zeile 2
'Schleife solange etwas in der ersten Spalte in Tabelle 1 drin steht
Do While Tabelle1.Cells(lZeile, 1).Value  ""
'Datensatz ID Spalte mit selektiertem Eintrag der ListBox vergleichen
If ListBox1.Text = Tabelle1.Cells(lZeile, 1).Value Then
'Eintrag gefunden, TextBoxen in die Zellen schreiben
Tabelle1.Cells(lZeile, 2).Value = TextBoxKreis.Text
Tabelle1.Cells(lZeile, 1).Value = TextBoxBundesland.Text
Tabelle1.Cells(lZeile, 3).Value = TextBoxLeistungserbringer.Text
Tabelle1.Cells(lZeile, 4).Value = ComboBoxAnbieter.Text
Tabelle1.Cells(lZeile, 5).Value = ComboBoxProdukt.Text
Tabelle1.Cells(lZeile, 6).Value = TextBoxXXX.Text
Tabelle1.Cells(lZeile, 7).Value = TextBoxDatumEinfuehrung.Text
Tabelle1.Cells(lZeile, 8).Value = TextBoxDatumNutzung.Text
Tabelle1.Cells(lZeile, 9).Value = TextBoxDatumStand.Text
Tabelle1.Cells(lZeile, 10).Value = TextBoxKommentarfeld.Text
Call Sortieren 'Sortieren des Tabellenblattes
Call Wettbewerb 'Aktualisieren der ListBox
Exit Do 'Vorzeitiges Ende, da der Datensatz schon gefunden ist
End If
lZeile = lZeile + 1 'Nächste Zeile bearbeiten
Loop
'leeren der Maske nachdem gespeichert wurde
TextBoxBundesland = ""
TextBoxKreis = ""
TextBoxLeistungserbringer = ""
ComboBoxAnbieter = ""
ComboBoxProdukt = ""
TextBoxXXX = ""
TextBoxDatumEinfuehrung = ""
TextBoxDatumNutzung = ""
TextBoxDatumStand = ""
TextBoxKommentarfeld = ""
End Sub

Anzeige
AW: ListBox-Eintrag Anzeige in TextBoxen
27.06.2019 15:35:10
Matthias
Moin!
Kann grad nicht nachvollziehen, was du da für Daten hast. Normalerweise ist der LZF 13 ein Zeichen für eine Typenunverträglichkeit.Prüfe mal ob in der Spalte 5 (in der list mit 4 dargestellt, da 0 basierend) deiner LIstbox wiklich Zahlen stehen. Ansonsten nimmst du da ggf. einen Buchstaben und mit dem kann cells nichts anfangen. Falls da wirklich Zahlen sind, teste mal den listindex. Nicht das der sich zwischendurch (warum auch immer) auf -1 verändert hat. Einfach eine MsgBox davor packen. Sollte auch das hinhauen, probiere mal, die Zahl aus der der Listbox.list umzuwandeln. Entweder mit clng() oder mit val(). Ich würde im Code eh den LIstindex eine Variablen zuweisen und den dann im Code für die Zeile nutzen. Wenn du mal was am INdex ändern musst, brauchst du dann nur die Zuweisung zur Variablen ändern und ncht 10 Zeilen.
VG
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

ListBox-Einträge in TextBoxen anzeigen


Schritt-für-Schritt-Anleitung

  1. ListBox füllen: Verwende den folgenden Code, um deine ListBox mit Daten aus einem Tabellenblatt zu füllen. Achte darauf, dass du die richtige Anzahl an Spalten angibst.

    Private Sub Wettbewerb() 'gefilterte Daten in Listbox anzeigen
    Dim lLetzte As Long
    Dim lZeile As Long
    Dim lLibox As Long
    ListBox1.Clear
    With Worksheets("Tabelle1")
       lLetzte = .Cells(Rows.Count, 1).End(xlUp).Row
       For lZeile = 2 To lLetzte
           If .Cells(lZeile, 1) = "" Then Exit For
           If .Rows(lZeile).Hidden = False Then
               ListBox1.AddItem
               ListBox1.List(lLibox, 0) = .Cells(lZeile, 1).Value
               ListBox1.List(lLibox, 1) = .Cells(lZeile, 2).Value
               ListBox1.List(lLibox, 2) = .Cells(lZeile, 3).Value
               ListBox1.List(lLibox, 3) = .Cells(lZeile, 4).Value
               lLibox = lLibox + 1
           End If
       Next
    End With
  2. Datenübertragung: Um die Daten aus der ListBox in TextBoxen anzuzeigen, verwende den folgenden Code. Achte darauf, dass du die richtige Zeilennummer verwendest:

    Private Sub ListBox1_Click()
    With Worksheets("Tabelle1")
       Me.TextBoxBundesland = .Cells(Me.ListBox1.List(Me.ListBox1.ListIndex, 4), 1)
       Me.TextBoxKreis = .Cells(Me.ListBox1.List(Me.ListBox1.ListIndex, 4), 2)
       Me.TextBoxLeistungserbringer = .Cells(Me.ListBox1.List(Me.ListBox1.ListIndex, 4), 3)
       Me.ComboBoxAnbieter = .Cells(Me.ListBox1.List(Me.ListBox1.ListIndex, 4), 4)
       Me.ComboBoxProdukt = .Cells(Me.ListBox1.List(Me.ListBox1.ListIndex, 4), 5)
    End With
    End Sub

Häufige Fehler und Lösungen

  • Problem mit doppelten Einträgen: Wenn die ListBox nur den ersten Eintrag einer wiederholten Spalte anzeigt, stelle sicher, dass du alle relevanten Spalten zur Identifikation der Zeile verwendest. Du kannst zusätzlich eine unsichtbare Spalte hinzufügen, um die Zeilennummer zu speichern.

  • Laufzeitfehler 13: Dieser Fehler tritt häufig auf, wenn es eine Typenunverträglichkeit gibt. Überprüfe, ob die Werte in der ListBox korrekt sind (vor allem in der versteckten Spalte). Konvertiere die ListBox-Werte gegebenenfalls mit CLng() oder Val().


Alternative Methoden

Eine andere Möglichkeit, die Daten zu verwalten, ist die Verwendung von Dictionary-Objekten, um die Daten dynamischer zu speichern und abzurufen. Dies kann besonders nützlich sein, wenn du komplexere Abfragen durchführen möchtest oder die Datenstruktur häufig änderst.


Praktische Beispiele

  • Auswahl über CheckBoxen: Filtere deine Tabelle basierend auf Benutzerselektionen. Hier ein Beispielcode für einen Autofilter:

    Private Sub Auswahl_BL() ' Autofilter nach Bundesland
    Dim sngIndex As Single
    Dim ialngCount As Long
    Dim astrFilterArray() As String
    For sngIndex = 1 To 16
       If Wettbewerbstafel("CheckBox" & CStr(sngIndex)).Value = True Then
           ReDim Preserve astrFilterArray(ialngCount)
           astrFilterArray(ialngCount) = Choose(sngIndex, "Baden-Württemberg", "Bayern", ...)
           ialngCount = ialngCount + 1
       End If
    Next
    With Sheets("Tabelle1").Range("A:J")
       If ialngCount > 0 Then
           Call .AutoFilter(Field:=1, Criteria1:=astrFilterArray, Operator:=xlFilterValues)
       Else
           Call .AutoFilter(Field:=1)
       End If
    End With
    End Sub

Tipps für Profis

  • Versteckte Spalte: Füge eine fünfte Spalte in deiner ListBox hinzu, die die Zeilennummer speichert, um die Übersichtlichkeit zu erhöhen und den Zugriff auf die Daten zu erleichtern.

  • Optimierung der Code-Struktur: Verwende Variablen für den ListIndex, um die Lesbarkeit und Wartbarkeit deines Codes zu verbessern. Auf diese Weise kannst du Änderungen an einer Stelle vornehmen, ohne den gesamten Code durchgehen zu müssen.


FAQ: Häufige Fragen

1. Wie kann ich die Spaltenreihenfolge in der ListBox ändern?
Du kannst die Reihenfolge der Spalten, die in der ListBox angezeigt werden, leicht anpassen, indem du die Indizes im Code änderst.

2. Was tun, wenn die ListBox nicht aktualisiert wird?
Überprüfe, ob der Code zum Befüllen der ListBox nach jeder Änderung der Daten aufgerufen wird. Es ist wichtig, die ListBox nach dem Hinzufügen, Löschen oder Bearbeiten von Einträgen erneut zu laden.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige