PDA

Vollständige Version anzeigen : ListBox über ComboBox füllen


olerostock
21.07.2014, 17:31
Hallo an alle!

Ich habe da ein Problem mit dem auslesen der Daten aus einer Tabelle über eine Combobox.
Das Programm zeigt mir keinen Fehler an. Aber die ComboBox bleibt leer.
Ich lade die datei mal hoch. Es betrifft die UserForm "Bearbeitung".

Danke schon mal für Eure Hilfe

Gruß Olerostock

Hajo_Zi
21.07.2014, 17:41
es würde schon helfen, wenn Du die Aktion mit dem richtigen Namen aufrufst.
Private Sub Bearbeitung_Initialize()
wird nicht ausgeführt, es sollte schon
Private Sub UserForm_Initialize()
Die weiteren Fehler habe ich mir nicht angesehen, da bist Fachmann genug.
<img src="http://Hajo-Excel.de/images/grusz1.gif" align="middle" height="40" alt="Grußformel"><a href="http://Hajo-Excel.de/index.htm"><img border="0" src="http://Hajo-Excel.de/images/logo_hajo3.gif" align="middle" height="40" alt="Homepage"></a>

xlph
21.07.2014, 17:51
Hallo olerostock,

1. Fehler
Falsch >> Private Sub Bearbeitung_Initialize()

Richtig >> Private Sub UserForm_Initialize()

Ereignis-Prozedur-Namen dürfen nicht verändert werden.
Auf diesen Namen bezieht sich die aufrufende 'innere Prozedur'.
Der Ereignis-Prozedur-Name wird vom System nicht gefunden
und somit beim Laden der Userform auch nicht durchlaufen.

2. Fehler
Falsch >> Set wksData = Worksheets("Tabelle7")

Richtig >> Set wksData = Tabelle7 ' Blatt-Codename
oder >> Set wksData = Worksheets("Daten") ' Blattname

Beverly
21.07.2014, 17:58
Hi,

schreibe den Code des CommandButton im Tabellenblatt wie folgt:

Dim oDic As Object
Dim lngZeile As Long, meAr As Variant
Set oDic = CreateObject("Scripting.Dictionary")
With Tabelle7
meAr = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
End With

For lngZeile = 1 To UBound(meAr)
oDic(meAr(lngZeile, 1)) = 0
Next

Bearbeitung.ComboBox1.List = oDic.keys
With Bearbeitung.ListBox1
.ColumnCount = 4
.ColumnWidths = "20Pt;60Pt;80Pt;10Pt"
.Clear
End With
Set oDic = Nothing


Lösche außerdem die Definition der Variablen wksData und ersetze an allen Stellen im Code wksData durch Tabelle7.

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

olerostock
21.07.2014, 17:58
Hallo Hajo,

Ich habe die Benennung "Private Sub Bearbeitung_Initialize()" in UserForm gemacht. Jetzt bekomme ich aber Laufzeitfehler 9 (Index liegt außerhalb des gültigen Bereichs). Ich bekomme aber nirgendwo im Programmcode den Fehler angezeigt. Wenn ich zuück gehe aufdie Benennung "Private Sub Bearbeitung_Initialize()", dann bekomme ich keinen Fehler angezeigt.
Woran kann das liegen? Ich habe von VBA nicht viel Ahnung. Den Code habe ich aus einer anderen Datei übernommen und ein bischen angepasst. jedenfalls so, wie ich es bis zu diesem zeitpunkt verstanden habe.

Gruß Olerostock

xlph
21.07.2014, 18:06
Beide Fehler sind oben gelöst :rolleyes:

olerostock
21.07.2014, 18:08
Hallo xlph,

ich habe "Set wksData = Tabelle7" genommen und jetzt füllt er die Daten in die ComboBox. Dafür zeigt er mir den Fehler, dass der Index außerhalb des Bereiches ist. Vorletzte Zeile in diesem Codeausschnitt.

Private Sub ComboBox1_Change()
Dim I As Long
Dim j As Integer
Dim lngAnz As Long, arrData()

Me.ListBox2 = Me.ComboBox1

'ListBox und TextBoxen zurücksetzen
Me.ListBox1.Clear
For I = 1 To 4
Me.Controls("Textbox" & I).Value = ""
Next
lngZeileDS = 0

With wksData
'Anzahl der Zeilen in denen die Postleitzahl vorkommt
lngAnz = Application.WorksheetFunction.CountIf(.Range(.Cells(2, 1), _
.Cells(.Rows.Count, 1).End(xlUp)), Me.ListBox2)
ReDim arrData(1 To lngAnz, 1 To 4)
lngAnz = 0
Woran kann das liegen. Was habe ich da falsch gemacht.

Danke schon mal.

xlph
21.07.2014, 18:20
Hallo,

dann so:

Private Sub ComboBox1_Change()
Dim I As Long
Dim j As Integer
Dim lngAnz As Long, arrData()

Me.ListBox2.Clear
Me.ListBox2.AddItem Me.ComboBox1.Value

'ListBox und TextBoxen zurücksetzen
Me.ListBox1.Clear
For I = 1 To 4
Me.Controls("Textbox" & I).Value = ""
Next
lngZeileDS = 0

With wksData
'Anzahl der Zeilen in denen die Postleitzahl vorkommt
lngAnz = Application.WorksheetFunction.CountIf(.Range(.Cells(2, 1), _
.Cells(.Rows.Count, 1).End(xlUp)), Me.ListBox2.List(0, 0))
ReDim arrData(1 To lngAnz, 1 To 4)
lngAnz = 0

'Daten aus Spalte 2 bis 36 in Datenarray einlesen, in Spalte 1 des Arrays die Zeilennummer
For I = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
If CStr(wksData.Cells(I, 1)) = Me.ComboBox1.Value Then
lngAnz = lngAnz + 1
arrData(lngAnz, 1) = I 'Nummer der Zeile mit dem Datensatz
For j = 2 To 4
arrData(lngAnz, j) = wksData.Cells(I, j).Value
Next
End If
Next

End With

Me.ListBox1.List = arrData


' If lngAnz = 1 Then
' 'Sonderfall, da hier die Listzuordnung nicht sauber funktioniert
' Me.ListBox1.AddItem arrData(1, 1)
' For j = 2 To 4
' Me.ListBox1(0, j - 1) = arrData(1, j)
' Next
' Else
' Me.ListBox1 = arrData
' End If

End Sub

olerostock
21.07.2014, 18:44
Hallo xlph,

Danke! Jetzt bringt er die daten in die ListBox 1. Warum nimmt er aber die Hausnummer aus Spalte A in die erste Spalte der ListBox1?
Ich habe die Übergabe der Daten aus der Tabelle mit einem Click auf die ListBox versucht zu lösen. Macht er auch. Nur das die Daten bis in die Textbox 30 geladen werden. Der letzte Wert soll aber in TextBox 31 gehen.

Hier der dazugehörige Code.;
Private Sub ListBox1_Click()
Dim I As Integer
'Zeilennummer des gewählten Datensatzes aus 1. Spalte der Listbox auslesen
With Me.ListBox1
lngZeileDS = Val(.List(.ListIndex, 0))
End With
'Daten aus Spalten 1 bis 31 aus Datentabelle in die Textboxen einlesen
For I = 2 To 31
Me.Controls("TextBox" & I) = wksData.Cells(lngZeileDS, I + 1)
Next
End Sub

olerostock
21.07.2014, 18:56
Hallo xlph,

jetzt habe ich erst mal begriffen, dass er ja die Zeilennummer in denen die Werte stehen mit in die ListBox nimmt. Dass sollte er garnicht. Da hatte ich das verkehrt gemacht. Was muss ich am Code ändern, damit er dass nicht mehr macht? Will da jetzt nicht viel kaputt machen. Und wenn ListBox1_Click(), dann sollen die daten aus den Spalten A bis Aj (1-31) in die TextBoxen 1 bis 31geladen werden.

Es wäre nett, wenn Du mir dabei behilflich bist oder ein anderer.

Ganz großen Dank für die Hilfe bis jetzt. Ich weiß Sie wirklich zu schätzen.

Gruß Olerostock

xlph
21.07.2014, 19:15
Hallo,

Ändere rot-markierten Wert.

Private Sub Userform_Initialize()
Dim oDic As Object
Dim lngZeile As Long, meAr As Variant

Set wksData = Tabelle7

Set oDic = CreateObject("Scripting.Dictionary")
With wksData
meAr = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
End With

For lngZeile = 1 To UBound(meAr)
oDic(meAr(lngZeile, 1)) = 0
Next

ComboBox1.List = oDic.keys
With ListBox1
.ColumnCount = 4
.ColumnWidths = "0Pt;60Pt;80Pt;10Pt"
.Clear
End With

Set oDic = Nothing

End Sub

Hier werden die Spalten in der angewählten Zeile durchlaufen.
Leider stimmt die Reihenfolge der SpaltenÜberschriften mit der Reihenfolge
der TextBox-Bezeichnungen nicht überein. Benenne deine TextBoxen
aufsteigend analog zu den SpaltenÜberschriften.

Private Sub ListBox1_Click()
Dim I As Integer
'Zeilennummer des gewählten Datensatzes aus 1. Spalte der Listbox auslesen
With Me.ListBox1
lngZeileDS = Val(.List(.ListIndex, 0))
End With
'Daten aus Spalten 1 bis 31 aus Datentabelle in die Textboxen einlesen
For I = 2 To 31
Me.Controls("TextBox" & I) = wksData.Cells(lngZeileDS, I + 1)
Next
End Sub

olerostock
21.07.2014, 19:36
Hallo xlph,

das mit den Daten in der ListBox 1 funktioniert. Doch die Click-Funktion für ListBox1 funktioniert gar nicht. Da kann ich klicken,so viel wie ich will. Das mit der Beschriftung der TextBoxen verstehe ich nicht ganz. Ich hatte die TextBoxen durchgehen nummeriert, damit die Nummern auch zu den Spalten Passen. Also Spalte A = TextBox 1, Spalte B = TextBox 2 usw. Mir wurde mal gesagt, dass dieses besser ist.

Ich habe die datei mit dem jetzigen Stand noch mal hoch geladen. Vieleicht findest Du den fehler bei ListBox1_Click().

Danke und gruß
Olerostok

olerostock
21.07.2014, 20:02
So sieht jetzt mein Code aus:

Option Explicit
Dim wksData As Worksheet
Dim lngZeileDS As Long
Private Sub UserForm_Initialize()
Dim oDic As Object
Dim lngZeile As Long, meAr As Variant

Set wksData = Tabelle7 'Daten

Set oDic = CreateObject("Scripting.Dictionary")
With wksData
meAr = .Range("A2", .Cells(.Rows.Count, 1).End(xlUp))
End With

For lngZeile = 1 To UBound(meAr)
oDic(meAr(lngZeile, 1)) = 0
Next

ComboBox1.List = oDic.keys
With ListBox1
.ColumnCount = 4
.ColumnWidths = "60Pt;150Pt;200Pt;10Pt"
.Clear
End With

Set oDic = Nothing

End Sub

Bis hierhin alles Okay. Was muss ich im folgenden Code ändern, damit mir nicht die Zeilennummer angezeigt wird, sonder der Erste Wert aus der Tabelle:

Private Sub ComboBox1_Change()
Dim I As Long
Dim j As Integer
Dim lngAnz As Long, arrData()

Me.ListBox2.Clear
Me.ListBox2.AddItem Me.ComboBox1.Value

'ListBox und TextBoxen zurücksetzen
Me.ListBox1.Clear
For I = 1 To 5
Me.Controls("Textbox" & I).Value = ""
Next
lngZeileDS = 0

With wksData
'Anzahl der Zeilen in denen die Postleitzahl vorkommt
lngAnz = Application.WorksheetFunction.CountIf(.Range(.Cells(2, 1), _
.Cells(.Rows.Count, 1).End(xlUp)), Me.ListBox2.List(0, 0))
ReDim arrData(1 To lngAnz, 1 To 5)
lngAnz = 0

'Daten aus Spalte 1 bis 31 in Datenarray einlesen, in Spalte 1 des Arrays die Zeilennummer
For I = 1 To .Cells(.Rows.Count, 1).End(xlUp).Row
If CStr(wksData.Cells(I, 1)) = Me.ComboBox1.Value Then
lngAnz = lngAnz + 1
arrData(lngAnz, 1) = I 'Nummer der Zeile mit dem Datensatz
For j = 2 To 5
arrData(lngAnz, j) = wksData.Cells(I, j).Value
Next
End If
Next

End With

Me.ListBox1.List = arrData

End Sub

olerostock
22.07.2014, 08:23
Problem gelöst.

Ich habe jetzt einfach in der Tabelle "Daten" eine neue Spalte hinter "A" eingefügt und dort die PLZ von Spalte "A" rein kopiert.
Das ist zwar nicht das optimale, klappt aber mit der Übergabe.

Gruß Olerostock