Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1696to1700
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
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?

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

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige