Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1336to1340
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
Filtern von Listboxeinträgen
14.11.2013 10:48:48
Listboxeinträgen
Hallo Experten, Hallo Tino,
Tino hat mir meinen Code zum einlesen von Daten in eine Listbox geholfen. Ich hatte vorher das Problem, dass er mir die Datensätze in der 3-Spaltigen Listbox nicht nebeneinander sondern untereinander eingelesen hat. Mit Tinos Code und sammeln der Daten in einem Array funktioniert das auch, Danke nochmals an Tino.
Nun ist mir aber folgender Fehler aufgefallen. Er sucht mir aus meiner Tabelle Datensätze heraus und füllt die Listbox. So bald mindestens zwei Datensätze gefunden und in die Listbox übertragen werden, werden diese auch nebeneinander angezeigt. Findet er allerdings nur einen Datensatz dann werden die Daten nicht nebeneinander sondern untereinander angezeigt.
So sollte es aussehen:
Name Vorname Geburtsdatum (geht auch so bei mindestens zwei gefundenen Sätzen)
So sieht es aus bei einem Datensatz:
Name
Vorname
Geburtsdatum
Hier der Code von Tino:
Private Sub UserForm_Activate()
'Daten aus Tabelle in Listbox einlesen
Dim I As Long, n&
Dim Dic As Object, ArValues()
Application.ScreenUpdating = False
'Listbox leer machen
Personalien.Clear
'Dictionary initialisieren
Set Dic = CreateObject("Scripting.Dictionary")
With Worksheets("Jahrestabelle")
.Activate '? wird hier nicht benötigt
I = .Range("D1000").End(xlUp).Row
If I > 4 Then
'Array groß genug Dimensionieren
ReDim Preserve ArValues(1 To 3, 1 To I - 4)
For I = 5 To I
If .Cells(I, 17).Value = "M" Then
If Not Dic.Exists(.Cells(I, 4).Value) Then
If Trim(CStr(.Cells(I, 4).Value))  "" Then
Dic(.Cells(I, 4).Value) = 0
n = n + 1 'Hilfszähler um Array zu füllen
ArValues(1, n) = .Cells(I, 4).Value
ArValues(2, n) = .Cells(I, 5).Value
ArValues(3, n) = .Cells(I, 6).Value
End If
End If
End If
Next I
'nicht benötigte Spalten entfernen
ReDim Preserve ArValues(1 To 3, 1 To n)
'Array drehen und in Listbox schreiben
Personalien.List = Application.Transpose(ArValues)
End If
End With
Application.ScreenUpdating = False
End Sub

Kann mir jemand helfen.
Gruß Werner

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Filtern von Listboxeinträgen
14.11.2013 12:41:08
Listboxeinträgen
Hallo,
das liegt am Transpose.
Ich drehe Arrays lieber per Schleife. Ist mehr Code aber auch nicht langsamer.
Private Sub UserForm_Activate()
'Daten aus Tabelle in Listbox einlesen
Dim i As Long, n As Long
Dim Dic As Object, ArValues(), arrList()
Application.ScreenUpdating = False
'Listbox leer machen
Personalien.Clear
'Dictionary initialisieren
Set Dic = CreateObject("Scripting.Dictionary")
With Worksheets("Jahrestabelle")
.Activate '? wird hier nicht benötigt
i = .Range("D1000").End(xlUp).Row
If i > 4 Then
'Array groß genug Dimensionieren
ReDim Preserve ArValues(1 To 3, 1 To i - 4)
For i = 5 To i
If .Cells(i, 17).Value = "M" Then
If Not Dic.Exists(.Cells(i, 4).Value) Then
If Trim(CStr(.Cells(i, 4).Value))  "" Then
Dic(.Cells(i, 4).Value) = 0
n = n + 1 'Hilfszähler um Array zu füllen
ArValues(1, n) = .Cells(i, 4).Value
ArValues(2, n) = .Cells(i, 5).Value
ArValues(3, n) = .Cells(i, 6).Value
End If
End If
End If
Next i
'nicht benötigte Spalten entfernen
ReDim Preserve ArValues(1 To 3, 1 To n)
ReDim arrList(1 To n, 1 To 3)
'Array drehen und in Listbox schreiben
For n = 1 To 3
For i = 1 To n
arrList(i, n) = ArValues(n, i)
Next
Next
Personalien.List = arrList
End If
End With
Application.ScreenUpdating = False
End Sub

Gruß
Rudi

Anzeige
AW: Filtern von Listboxeinträgen
14.11.2013 13:15:25
Listboxeinträgen
Hallo Rudi,
Danke für die Meldung aber da kriege ich bei der Zeile
arrList(i, n) = ArValues(n, i)
den Laufzeitfehler 9, Indes ist außerhalb des gültigen Bereichs.
Gruß Werner

AW: Filtern von Listboxeinträgen
14.11.2013 13:42:51
Listboxeinträgen
Hallo Werner,
ich habe Rudis Tipp auch gerade getestet. Ursache des Fehlers ist diese Zeile:
For n = 1 To 3
Hier muß statt n eine neue Speichervariable definiert werden.
Dim r&
For r = 1 To 3
Die 2. Forschleife ist korekt: For i = 1 To n
Denn n ist ja die Anzahl der gefundenen Datensätze. Rudi hat aber n als Laufvariable in der 1. Forschleife benutzt und da ist der gemerkte Wert von n verlustig gegangen.
Gruß von Luschi
aus klein-Paris

Anzeige
AW: Filtern von Listboxeinträgen
14.11.2013 14:35:52
Listboxeinträgen
Hallo Luschi,
danke für die Antwort aber ich komme so leider nicht weiter. Ich habe deinen Vorschlag eingesetzt, kriege aber weiterhin den gleichen Laufzeitfehler. Könntest du mir mal den kompletten Code mit deinen Änderungen rein stellen.
Danke werner

AW: Filtern von Listboxeinträgen
14.11.2013 15:01:22
Listboxeinträgen
Hallo Werner,
ich habe noch mal Deine Tabelle nachgebaut und die beiden von Rudi eingebauten For-Schleifen _ sehen jetzt so aus:

'nicht benötigte Spalten entfernen
ReDim Preserve ArValues(1 To 3, 1 To n)
ReDim arrList(1 To n, 1 To 3)
'Array drehen und in Listbox schreiben
For r = 1 To 3
For i = 1 To n
arrList(i, r) = ArValues(r, i)
Next
Next
Me.ListBox1.List = arrList
Im Definitionskopf steht dieses:
Dim i As Long, n As Long, r As Long
Gruß von Luschi
aus klein-Paris

Anzeige
AW: Filtern von Listboxeinträgen
15.11.2013 08:50:14
Listboxeinträgen
Hallo Luschi,
danke noch mal. Funktioniert wunderbar. Habe nur noch ein On error resume next einbauen müssen, da er mir in einen Fehler gelaufen ist, wenn keine Daten vorhanden waren.
Gruß Werner

ohne On Error, ..
15.11.2013 11:30:24
Rudi
Hallo,
... und Redim Preserve:
Private Sub UserForm_Activate()
'Daten aus Tabelle in Listbox einlesen
Dim i As Long, n As Long
Dim Dic As Object, ArrValues, arrList()
Application.ScreenUpdating = False
'Listbox leer machen
Personalien.Clear
'Dictionary initialisieren
Set Dic = CreateObject("Scripting.Dictionary")
With Worksheets("Jahrestabelle")
i = .Range("D1000").End(xlUp).Row
If i > 4 Then
For i = 5 To i
If .Cells(i, 17).Value = "M" Then
Dic(.Cells(i, 4).Value) = _
Array(.Cells(i, 4).Value, .Cells(i, 5).Value, .Cells(i, 6).Value)
End If
Next i
End If
End With
If Dic.Count Then
ArrValues = Dic.items
ReDim arrList(1 To Dic.Count, 1 To 3)
For i = 1 To Dic.Count
For n = 1 To 3
arrList(i, n) = ArrValues(i - 1)(n - 1)
Next
Next
Personalien.List = arrList
End If
Application.ScreenUpdating = False
End Sub

Gruß
Rudi

Anzeige
AW: ohne On Error, ..
18.11.2013 15:03:21
Werner
Hallo Rudi,
bin leider erst jetzt dazu gekommen deinen Code zu testen. Läuft wunderbar. Ohne on error natürlich eleganter als mit. Danke für die Hilfe.
Werner

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige