PDA

Vollständige Version anzeigen : Listeneinträge nach Suche einschränken und dann auch wieder freigeben


drzwockel
22.07.2014, 07:03
Hallo Excel-Gemeinde,

ich habe ein Projekt, in dem ich diverse Userforms mit Auswahllisten zur Verfügung stelle, die ihre Daten aus einer Datenbank enthalten.

Bisher wurden diese Daten über die Datenbank in die Exceltabelle geladen und dort auf in ein Tabellenblatt abgelegt. Diese Daten werden beim Schließen der Datei wieder gelöscht, so dass sie nur temporär enthalten sind.

Anschließend wird die Liste aus dem Tabellenblatt mit Inhalt geladen. Dies funktioniert einwandfrei.

Auf dem Userform befindet sich ein Textfeld, in dem man Text oder Zahlen eingeben kann. Bei jeder Eingabe verringert sich automatisch der Inhalt der Listenauswahl. Nimmt man eine Eingabe zurück, vervollständigt sich wieder. Eine super Sache, die hier im Forum erarbeitet wurde (zeigt mal wieder, wie gut dieses Forum ist :mrcool: ).

Jetzt zu meinem Problem. Ich möchte diese temporäre Ablage der Daten für die Liste nicht mehr in das Tabellenblatt schreiben, sondern direkt in die Liste bringen. Auch dies funktioniert einwandfrei und stellt keine Probleme dar.

Das Problem besteht bei der beschriebenen Möglichkeit der Suche. Sobald ich einen Buchstaben oder eine Zahl in das Textfeld eingebe, verringert sich der Listeninhalt bis auf einen Eintrag. Nehme ich den Eintrag wieder raus, ändert sich nichts mehr.

Meine große Frage nun, WARUM?

Anbei mal der Code ...

Private Sub UserForm_Initialize()
Me.Caption = "XXX"

Dim strDB As String
Dim objcon As ADODB.Connection
Dim rst As ADODB.Recordset
Dim arrArray As Variant

strDB = Environ("XXX") & "\XXX\XXXX.XXXX"
Set objcon = New ADODB.Connection
Set rst = New ADODB.Recordset

objcon.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strDB
rst.Open "SELECT FELD1, FELD2, FELD3, FELD4, FELD5 FROM XXX_XXXXXXXX", objcon, adOpenStatic

Me.XXX_Liste.MultiSelect = fmMultiSelectSingle
arrArray = rst.GetRows
ListBoxListe = arrArray
With Me.XXX_Liste
.Column = ListBoxListe
.ColumnCount = 4
End With

Me. .XXX _Liste.MultiSelect = fmMultiSelectSingle
Set dic = CreateObject("Scripting.Dictionary")

End sub



Und hier der Code, der die Selektion der Liste durchführt, bzw. wieder vervollständigt:


Private Sub TextBox1_Change()
Dim ftemp(0 To 0, 0 To 4) As Variant
Dim fDummy As Variant
Dim blnHit As Boolean
Dim I As Variant
Dim j As Long
If Me.TextBox1 = vbNullString Then
Me.XXX_Liste.BackColor = &HC0FFFF
Me.XXX_Liste.List = ListBoxListe
Else
dic.RemoveAll
With Me.XXX_Liste
For I = LBound(ListBoxListe, 1) To UBound(ListBoxListe, 1)
fDummy = Split(Me.TextBox1, " ")
For j = LBound(fDummy) To UBound(fDummy)
If InStr(1, ListBoxListe(I, 1) & "###" & ListBoxListe(I, 2) & "###" & ListBoxListe(I, 3) & "###" & ListBoxListe(I, 4) & "###" & ListBoxListe(I, 5), fDummy(j), vbTextCompare) Then
blnHit = True
Else
blnHit = False
Exit For
End If
Next
If blnHit Then
dic(ListBoxListe(I, 1) & "###" & ListBoxListe(I, 2) & "###" & ListBoxListe(I, 3) & "###" & ListBoxListe(I, 4) & "###" & ListBoxListe(I, 5)) = Array(ListBoxListe(I, 1), ListBoxListe(I, 2), ListBoxListe(I, 3), ListBoxListe(I, 4), ListBoxListe(I, 5))
End If
blnHit = False
Next I
Select Case dic.count
Case Is > 1
.List = WorksheetFunction.Transpose(WorksheetFunction.Transpose(dic.Items))
.Listindex = -1
Me.XXX_Liste.BackColor = &HC0FFC0
Case 1
fDummy = dic.Items
ftemp(0, 0) = fDummy(0)(0): ftemp(0, 1) = fDummy(0)(1): ftemp(0, 2) = fDummy(0)(2): ftemp(0, 3) = fDummy(0)(3): ftemp(0, 4) = fDummy(0)(4)
.List = ftemp
.Selected(0) = True
Case Else
.Clear
End Select
End With
End If
Me.txt_XXX.Caption = "Anzahl der gefundenen Key-Nr.: " & Me.XXX_Liste.ListCount
End Sub



Vielen Dank schon mal für Eure Mithilfe.

xlph
22.07.2014, 07:41
Hallo drzwockel,

das müsste laufen, habe es getestet.

drzwockel
22.07.2014, 08:07
Hallo xlph,

vielen Dank für Deine Mühen.

Leider funktioniert es bei mir nicht. In der reinen Datenbankversion reduziert er nicht nach Texteingaben (z.Bsp. Ar alle Worte in denen kein AR ist werden entfernt). Bei der Verringerung der Texteingabe (z.Bsp. das r wird wieder entfernt, dann sollten alle Wörte mit a wieder gelistet werden). Dies ist nicht der Fall.

Was hast Du anders gemacht?

Mc Santa
22.07.2014, 08:22
Hallo,

kannst du eine Datei bereitstellen, in der man den Fehler und die funktionierende Variante sehen und nachstellen kann? Vielleicht findet man dann den Fehler, ich tue mich bei Codelesen ohne Ausprobieren immer etwas schwer.

Viele Grüße

drzwockel
22.07.2014, 08:59
Hallo,

kannst du eine Datei bereitstellen, in der man den Fehler und die funktionierende Variante sehen und nachstellen kann? Vielleicht findet man dann den Fehler, ich tue mich bei Codelesen ohne Ausprobieren immer etwas schwer.

Viele Grüße

Hallo Mc Santa,

ich habe mal eine Datei extrahiert, in der sich die Userform befindet (Teile des Codes wurden entfernt, wenn sie für diese Funktion nicht relevant waren).

Die Datenbank enthält 5 Spalten, die in der Liste angezeigt werden sollen. Wenn "gesucht" wird, reduziert sich zwar der Datenbestand, die Inhalte bleiben in der Zeile aber (5) gleich. Bei der Reduzierung der Buchstaben in der Textzeile wird der Datenbestand wieder erhöht. Die Inhalte (5) in der Zeile bleiben. So ist der derzeitige IST Stand und so sollte es dann auch mit der Datenbankversion funktionieren.

Vielen Dank und ich hoffe, dass Du damit jetzt etwas anfangen kannst.

drzwockel
22.07.2014, 14:52
Hallo,

hat keine mehr eine Idee?

EarlFred
22.07.2014, 15:12
Hallo Name?,

wie lautet denn nun eigentlich Deine Frage?
Funktioniert der Code (welcher denn eigentlich?) nun oder nicht? Funktioniert er in einer anderen Variante / Mappe nicht oder doch? Ich blick nicht durch, was jetzt Dein Problem ist.

Der zuvorderst gepostete Code verrichtet brav seinen Dienst (so wie ich es verstehe), wenn man als Array hilfsweise einen Blattbereich einlesen lässt. Das dürfte aber Rille sein, ob das Array nun aus einem Recordset hergeleitet wird (denn spätestens aber der Zeile arrArray = rst.GetRows ist das RS belanglos) oder einem Blattbereich.

Grüße
EarlFred

drzwockel
23.07.2014, 06:38
Hallo EarlFred,

vielen Dank für Deine Bemühungen. Ich hoffe, dass meine nachfolgende Beschreibung etwas Licht ins Dunkel bringt ...

Der Code funktioniert in seiner derzeitigen Version einwandfrei über die "Blattlösung", wie Du sie bezeichnet hast. Diese Version arbeitet schon längere Zeit.

Jetzt wollte ich diese "Blattlösung" aus der Datei heraus haben und durch eine reine Datenbanklösung ersetzen. Soll heißen, dass die Liste sich direkt aus dem RecordSet der Datenbank füllt und nicht mehr aus dem RecordSet des Blattes.

Die Füllung über das RecordSet der DB funktioniert auch super.

Leider funktioniert dann die "Suchfunktion" nicht, d.h., die buchstabenmäßige Verringerung des Zeileninhalte führt zum einem Ergebnis mit einer Zeile, deren Inhalt aber nichts mit dem Buchstaben so richtig zu tun hat. Auch, wenn dann das Textfeld wieder geleert wird, wird das Gesamtergebnis, wie beim Start, nicht mehr anzeigt.


Die Bilder musste ich leider etwas Verfremden, da es um Echtdaten handelt.

BILD1: Die Liste ist komplett gefüllt

BILD2: In das Textfeld wurde ein A eingegeben (Reduzierung auf einen Eintrag ???)

BILD3: Das Textfeld ist wieder geleert (insgesamt 5 Zeilen kryptischer Buschtaben und Zahlen und Zeichen erscheint).



Was ist falsche an meinem Gedanken???

Vielen Dank für Eure Hilfe.

Gruß vom Doc

EarlFred
23.07.2014, 07:25
Hallo Doc,

die PDF ist toll. Mir tun die Augen immer noch weh. Was soll man darauf sehen? Oder ist das ein Augenkrebs-Virus?

GetRows liefert ein um 90° gedrehtes Array zurück - im Unterschied zum Tabellenabklatsch. Um das zu "korrigieren", trägst das Array nicht bei .List, sondern bei .Column in die Listbox ein. Der weitere Code geht aber weiter von einem 90° gedrehten Array aus. Daher passt hinterher nichts mehr zusammen.

Dreh das Ding von Anfang an ins Lot, dann wird alles gut:
arrArray = rst.GetRows
ListBoxListe = Application.Transpose(arrArray)
With Me.XXX_Liste
.List = ListBoxListe
.ColumnCount = 4
End With


Nimm das Lokalfenster / Direktfenster und den Einzelschrittmodus zur Hilfe, um solchen Dingen auf die Spur zu kommen.

Grüße
EarlFred

drzwockel
23.07.2014, 07:38
Hallo EarlFred,

Sorry, dass sich Dir immer noch die Augen drehen ... aber ich habe keine anderen Datenbankzugriff verwenden könne, so dass dort Echtdaten zu sehen sind ... die musste ich auf die Schnelle mal verfremden ...

So, vielen Dank für Deinen Tipp. Ich habe gerade in der Liste "List" gegen "Column" getauscht und



ListBoxListe = Application.Transpose(arrAttay)


eingetragen. Jetzt bekomme ich an dieser Stelle des Code (Einzelschritt) einen Laufzeitfehler "13".


Was mache ich jetzt falsche?

EarlFred
23.07.2014, 07:40
Hallo Doc,
Nimm das Lokalfenster / Direktfenster und den Einzelschrittmodus zur Hilfe, um solchen Dingen auf die Spur zu kommen.
Tipps befolgen; berichten. Danke.
Dazu: Zeile angeben, Code posten.
Also wie üblich in solchen Fällen - und nicht dumpf "ich krieg einen Fehler" feststellen - das bringt nichts und das erwarte ich von einem alten Hasen wie Dir einfach qualifizierter!

Ich vermute, es gibt nur einen oder keinen Datensatz.

arrAttay dürfte im Code zudem unbekannt sein. Option Explicit ist gesetzt?

Grüße
EarlFred

drzwockel
23.07.2014, 08:11
Hallo EarlFred,

Option Explicit steht oben im Modulkopf.

Das arrArray ist als Variant deklariert und sollte auch bekannt sein (lief ja bisher auch immer).

Anbei habe ich Dir das Lokalfenster als Bild beigefügt.

Der Code sieht in diesem Bereich jetzt so aus:


objcon.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strDB
rst.Open "SELECT FELD1, FELD2, FELD3, FELD4, FELD5 FROM XXXX", objcon, adOpenStatic

Me.PKS_Liste.MultiSelect = fmMultiSelectSingle
arrArray = rst.GetRows

ListBoxListe = Application.Transpose(arrArray)
With Me.PKS_Liste
.Column = ListBoxListe
.ColumnCount = 4
End With


An der roten Stelle taucht die Fehlermeldung auf (das Lokalfenster wurde eine Zeile drüber aufgenommen).


Gruß vom Doc

EarlFred
23.07.2014, 08:24
Hallo Doc,

und was steht im Array? NULL-Werte (nicht 0, sondern wirklich NULL!)?
Entweder bei der Abfrage bereits unterdrücken oder aber eine eigene Transponierung schreiben:
Option Explicit

Sub test()
Dim ListBoxListe As Variant
Dim arrArray(0 To 4, 0 To 1853) As Variant 'kommt aus der Abfrage

Dim i As Long, j As Long

arrArray(0, 0) = Null 'Testdaten


ReDim ListBoxListe(LBound(arrArray, 2) To UBound(arrArray, 2), LBound(arrArray, 1) To UBound(arrArray, 1))

For i = LBound(arrArray, 1) To UBound(arrArray, 1)
For j = LBound(arrArray, 2) To UBound(arrArray, 2)
ListBoxListe(j, i) = IIf(IsNull(arrArray(i, j)), Empty, arrArray(i, j))
Next j
Next i

End Sub

[Nachtrag]
Die Verwendung von Arrays mit unterschiedlicher Basis (einmal beginnen diese bei 0, einmal bei 1), was beim Transponieren mit Transpose nicht ins Gewicht fiel, da hier eine Änderung des Basis stattfindet, rächt sich nun hier:
If InStr(1, ListBoxListe(i, 1) & "###" & ListBoxListe(i, 2) & "###" & ListBoxListe(i, 3) & "###" & ListBoxListe(i, 4) & "###" & ListBoxListe(i, 5), fDummy(j), vbTextCompare) Then
Also: Entweder die selbstgeschriebene Transponierung modifizieren oder aber anstelle der fest vorgegebenen Spaltenindizes variable nehmen.
Ersteres so:
ReDim ListBoxListe(1 To UBound(arrArray, 2) + 1, 1 To UBound(arrArray, 1) + 1)

For i = LBound(arrArray, 1) To UBound(arrArray, 1)
For j = LBound(arrArray, 2) To UBound(arrArray, 2)
ListBoxListe(j + 1, i + 1) = IIf(IsNull(arrArray(i, j)), Empty, arrArray(i, j))
Next j
Next i

Grüße
EarlFred

drzwockel
23.07.2014, 08:38
Hallo Doc,

und was steht im Array? NULL-Werte (nicht 0, sondern wirklich NULL!)?
Entweder bei der Abfrage bereits unterdrücken oder aber eine eigene Transponierung schreiben:
Option Explicit

Sub test()
Dim ListBoxListe As Variant
Dim arrArray(0 To 4, 0 To 1853) As Variant 'kommt aus der Abfrage

Dim i As Long, j As Long

arrArray(0, 0) = Null 'Testdaten


ReDim ListBoxListe(LBound(arrArray, 2) To UBound(arrArray, 2), LBound(arrArray, 1) To UBound(arrArray, 1))

For i = LBound(arrArray, 1) To UBound(arrArray, 1)
For j = LBound(arrArray, 2) To UBound(arrArray, 2)
ListBoxListe(j, i) = IIf(IsNull(arrArray(i, j)), Empty, arrArray(i, j))
Next j
Next i



End Sub

Grüße
EarlFred


Hallo EarlFred,

ich hoffe, dass ich Deine Geduld nicht zu sehr belaste ...

Nach dem Einbau Deines Codes erhalte ich in der Liste das Ergebnis, wie es auf BILD3 zu sehen ist (s. Thread mit den Bildern). Es sind wahllose Einträge in 5 Zeilen zu sehen.

Ich habe langsam das Gefühl, dass ich den Überblick verliere ... etwas, was vorher (Blattversion) funktionierte, verselbständigt sich jetzt plötzlich ...

Das Array enthält keine NULL Werte. Es werden auch keine NULL-Werte dazu kommen können, da es sich hier um eine definierte Parameterliste handelt (manuell erstellt).


Gruß vom Doc

EarlFred
23.07.2014, 08:47
wie es auf BILD3 zu sehen ist (s. Thread mit den Bildern).
??? Das Sauerkrautbild? Darauf erkenne ich rein garnichts. Schonmal selbst aufgemacht, Deine pdf?

Ich stochere im Nebel! Etwas, was mit Musterdaten vermutlich binnen weniger Minuten erledigt ist, krampft sich hier über Stunden dahin. Das hat weniger mit mangelnder Geduld als mit mangelnder Zeit zu tun.
Eine Musterdatenbank habe ich mir, weil Du keine bereitstellst, selbst zusammengezimmert (Zeit!). Ob das dann aber alles mit Deinem Umfeld übereinstimmt, weiß ich nicht. Du trägst auch wirklich kaum zur Aufklärung bei. Bei allen Fragen muss man nachhaken (Zeit!)

Tut mir leid, ich muss Dich Deinem Schicksal überlassen. Mir fehlt die Zeit, hier zigfach nachzubohren.

Grüße
EarlFred

drzwockel
23.07.2014, 08:53
Hallo EarlFred,

besser kann ich es Dir nicht beschreiben. Insbesondere da es in der Blattversion funktioniert, ist mir überhaupt nicht klar, in welche Richtung ich denken soll.

Ein Musterdatenbank kann ich nicht erstellen, da die Daten in einer zentralen Datenbank sitzen ...

Ich habe jetzt einen wichtigen Termin, werde mich aber nach meiner Rückkehr noch einmal melden (wenn ich darf) ... werde dann mal schauen, ob ich es noch "besser" darstellen kann.


Trotzdem bis hier hin vielen Dank.



Gruß vom Doc

drzwockel
23.07.2014, 11:05
Hallo EarlFred,

ich habe hier mal die Ursprungsversion, in der die Liste von dem Tabellenblatt gefüllt wird:


...
Me.XXX_Liste.MultiSelect = fmMultiSelectSingle
ListBoxListe = Intersect(Worksheets("XXX_Tabelle").UsedRange, Worksheets("XXX_Tabelle").Columns("A:E")).Value
With Me.XXX_Liste
.List = ListBoxListe
.ColumnCount = 4
End With
Set dic = CreateObject("Scripting.Dictionary")
Sheets("Datenblatt").Activate
Me.TextBox1.Value = ""
Me.txt_AnzahlDelikte.Caption = "Anzahl der gefundenen Key-Nr.: " & Me.XXX_Liste.ListCount
Me.XXX_Liste.BackColor = &HC0FFFF
...


Diese Version funktioniert fehlerfrei, wenn in das Textfeld ein Buchstabe, eine Zahl oder ein Zeichen eingeben werden. Die Liste wird inhaltlich verringert.

Im Tabellenblatt stehen die Daten genauso, wie sie in der Datenbank stehen.

Das Problem mit der Datenbank (als Beispiel) ist, dass es sich um eine zentrale Oracle Datenbank handelt, an die ich "so" ran komme. Abfragen ja, Kopien oder ähnliche nein.

Ich weiß im Moment aber auch nicht mehr, wie ich das Problem besser schildern kann.

Das mit dem Array drehen ist nicht erforderlich, da die Felder so in das Array laufen (0 = Feld 1, 1 = Feld 2, 2 = Feld 3 ...).

Ich habe mir den Inhalt im Lokalfenster angesehen. Dort war alles stimmig.
Wenn dieses Array der Liste zugeordnet wird, dann stimmt auch alles ... der Fehler tritt auf, nachdem zum ersten mal die folgende Routine aufgerufen wird.



Private Sub TextBox1_Change()
Dim ftemp(0 To 0, 0 To 4) As Variant
Dim fDummy As Variant
Dim blnHit As Boolean
Dim I As Variant
Dim j As Long
If Me.TextBox1 = vbNullString Then
Me.XXX_Liste.BackColor = &HC0FFFF
Me.XXX_Liste.List = ListBoxListe
Else
dic.RemoveAll
With Me.XXX_Liste
For I = LBound(ListBoxListe, 1) To UBound(ListBoxListe, 1)
fDummy = Split(Me.TextBox1, " ")
For j = LBound(fDummy) To UBound(fDummy)
If InStr(1, ListBoxListe(I, 1) & "###" & ListBoxListe(I, 2) & "###" & ListBoxListe(I, 3) & "###" & ListBoxListe(I, 4) & "###" & ListBoxListe(I, 5), fDummy(j), vbTextCompare) Then
blnHit = True
Else
blnHit = False
Exit For
End If
Next
If blnHit Then
dic(ListBoxListe(I, 1) & "###" & ListBoxListe(I, 2) & "###" & ListBoxListe(I, 3) & "###" & ListBoxListe(I, 4) & "###" & ListBoxListe(I, 5)) = Array(ListBoxListe(I, 1), ListBoxListe(I, 2), ListBoxListe(I, 3), ListBoxListe(I, 4), ListBoxListe(I, 5))
End If
blnHit = False
Next I
Select Case dic.count
Case Is > 1
.List = WorksheetFunction.Transpose(WorksheetFunction.Transpose(dic.Items))
.Listindex = -1
Me.PKS_Liste.BackColor = &HC0FFC0
Case 1
fDummy = dic.Items
ftemp(0, 0) = fDummy(0)(0): ftemp(0, 1) = fDummy(0)(1): ftemp(0, 2) = fDummy(0)(2): ftemp(0, 3) = fDummy(0)(3): ftemp(0, 4) = fDummy(0)(4)
.List = ftemp
.Selected(0) = True
Case Else
.Clear
End Select
End With
End If
Me.txt_AnzahlDelikte.Caption = "Anzahl der gefundenen Key-Nr.: " & Me.XXX_Liste.ListCount
End Sub



Wenn es sich tatsächlich nicht machen lässt, denn werde ich wohl mit meiner Blattlösung weiterleben (müssen).

Vielen Dank für Deine bisher geleistete Unterstützung.


Gruß vom Doc

EarlFred
23.07.2014, 12:21
Hallo Doc,


Das mit dem Array drehen ist nicht erforderlich, da die Felder so in das Array laufen (0 = Feld 1, 1 = Feld 2, 2 = Feld 3 ...).
bitte mal in Deinen Beitrag #12 schauen, dort den Screenshot vom Direktfenster:
arrArray ist dimensioniert: (0 to 4, 0 to 1853).
D. h. 1. Dimension = "Spalte" bzw. "Feld", 2. Dimension = "Zeile" bzw. "Datensatz".

Liest Du aus dem Tabellenblatt ein, hat das Datenfeld die Dimension (bei gleichem Datenbestand): (1 to 1854, 1 to 5)

Beide Arrays unterscheiden sich also in 2 wesentlichen Punkten:
1) Zeilen / Spalten sind gegeneinander "um 90° gedreht"
2) das eine ist 1-basiert, das andere 0-basiert.

Dass beide Varianten so mit Deinem Code harmonieren sollen, kann also nicht sein. Siehe hierzu auch meinen Nachtrag im Post #13. Da steht auch ein simpler Vorschlag zur Behebung drin.

der Fehler tritt auf, nachdem zum ersten mal die folgende Routine aufgerufen wird.
Dieser Satz bezieht sich offenbar auf die darunter stehende Routine, so dass ich keinen Bezug mehr zur Fehlermeldung aus Post #12 herstellen kann. Daher frage ich mich, welcher Fehler denn hier gemeint sein soll? (Zeile, Nummer, Beschreibung - wie vor!)

Was also nun richtig ist, weiß ich nicht. Deine Angaben sind widersprüchlich und unpräzise.
Auf dieser Basis ist das Nebelstocherei - und damit endgültig nicht mehr mein Thema.

Grüße
EarlFred

drzwockel
23.07.2014, 12:32
Hallo EarlFred,

diese Variante nutzen wir hier schon seit über 1 Jahr und sie funktioniert prima, obwohl die Dimensionierung bis 1854 nicht drin ist.

Wie gesagt, die Tabellenblattvariante (DB einlesen und dann in Tabellenblatt schreiben --> dann Liste aus Tabellenblatt füllen) funktioniert.

Das mit den 90° Drehen im Array ist scheinbar zu hoch für mich und da streikt mein Gehirn.

OK, dann kann ich mich trotzdem nur noch bei Dir für Deine Unterstützung bedanken ...


Gruß vom Doc

EarlFred
23.07.2014, 12:40
Doc, nochmal:

wenn Du aus dem Tabellenblatt einliest, hat das Array 2 Dimensionen, jeweils beginnend beim Zähler 1:
(1 To "Anzahl Zeilen", 1 To "Anzahl Spalten")
Für genau diesen Aufbau der Datenfelder ist Dein Code geschrieben worden, daher funktioniert er dafür auch.

Liest Du mit GetRows aus dem Recordset ein, stehen in der 1. Dimension NICHT die ZEILEN (oder Datensätze), sondern die FELDER; die ZEILEN stehen in der 2. Dimension des Datenfeldes! Die Dimensionen sind also vertauscht! Zudem ist das Datenfeld Nullbasiert:
(0 To "Anzahl Spalten" - 1, 0 To "Anzahl Zeilen" - 1)

Deswegen hast Du (oder wer auch immer) auch diese Änderung am Code vorgenommen:
Me.XXX_Liste.MultiSelect = fmMultiSelectSingle
ListBoxListe = Intersect(Worksheets("XXX_Tabelle").UsedRange, Worksheets("XXX_Tabelle").Columns("A:E")).Value
With Me.XXX_Liste
''''''''GELÖSCHT .List = ListBoxListe
.COLUMN = ListBoxListe
.ColumnCount = 4

Durch die Zuweisung an die COLUMN-Eigenschaft wird das Datenfeld "gedreht" eingelesen. Die LIST-Eigenschaft enthält also das vermeintlich "richtig gedrehte" Datenfeld. Es sieht erstmal alles "gewohnt" aus.

Deine andere Prozedur greift aber weiterhin auf "alte" Weise auf das NICHT GEDREHTE Datenfeld zurück. DAS MUSS SCHIEF GEHEN, alleine wegen der a) falschen "Spalten-/Zeilenbezüge" und der b) UNVERÄNDERTEN ZUWEISUNG NUN AN DIE LIST-Eigenschaft.

Ergebnis: SALAT

Grüße
EarlFred

drzwockel
23.07.2014, 12:56
Hallo EarlFred,

vielen Dank für die nähere Erläuterung des Problems/der Abläufe.

Jetzt habe ich zumindestens verstanden, warum es nach alter Art funktioniert hat.

Ich frage mich nur gerade, wo ich im zweiten Modul ansetzen muss, damit das "gedrehte" auch korrekt verstanden wird?


Gruß vom Doc

EarlFred
23.07.2014, 13:00
Das ist jetzt nicht Dein Ernst, hoffe ich.

Die Antworten stehen schon alle da. Musst sie halt lesen und umsetzen.

Schluss jetzt!

Grüße & Ende
EarlFred

drzwockel
23.07.2014, 13:24
Hallo EarlFred,

das mit dem Lesen ist nicht das Problem, eher das mit dem Umsetzen.

Mittlerweile weiß ich schon gar nicht mehr, was wo hin gehört.

Fakt ist, dass ich verstanden habe, dass das erste Array, dass aus rst.GetRows kommt, gedreht werden muss und dann nicht .list, sondern .column zugewiesen werden muss (als ListBoxListe).

Aber dann hänge ich in einer Art Parallelwelt fest ... ich wußte das Arrays nicht mein Ding sind ... aber so :entsetzt:

Also, es liegt jetzt mehr am Verstehen der Sache ...



Gruß vom Doc

EarlFred
23.07.2014, 13:34
Hallo Doc,

...und dann nicht .list, sondern .column zugewiesen werden muss
nein, genau das eben nicht.

OK, ich fasse nochmal zusammen:


Der einfachste Weg:
Dein Code setzt ein Array voraus, wie es automatisch entsteht, wenn Du einen Blattbereich einliest. Diese Form gilt es nun auch für das andere Array aus dem Recordset zu erreichen, damit es "kompatibel" zum restlichen Code ist.

1. Hürde
Das Array, das aus GetRows entsteht, muss einfach transponiert werden, damit es wieder in das Schema passt: Dann sind "Zeile und Spalten" wieder so, wie sie es sind, wenn Du das Array aus dem Blatt befüllst.

Soweit klar?

2. Hürde
GetRows liefert ein 0-basiertes Datenfeld. Dein restlicher Code setzt aber ein 1-basiertes Datenfeld voraus. Also muss der Datenfeldzähler angepasst werden.
(Exkurs: Durch Application.Transpose überspringst Du beide Hürden mit einmal: Das Datenfeld wird gedreht und es entsteht ein 1-basiertes. Das funktioniert aber offenbar bei Deinen Daten nicht - warum blieb letztlich offen, meine Vermutung hast Du verneint.).
Um nun beide Hürden OHNE Fehlermeldung zu umgehen, schlug ich im Beitrag #13 im Nachtrag vor: Transponiere mit eigener Routine.

'Anschluss an alten Code
arrArray = rst.GetRows

'Neuer Teil
ReDim ListBoxListe(1 To UBound(arrArray, 2) + 1, 1 To UBound(arrArray, 1) + 1)

For i = LBound(arrArray, 1) To UBound(arrArray, 1)
For j = LBound(arrArray, 2) To UBound(arrArray, 2)
ListBoxListe(j + 1, i + 1) = IIf(IsNull(arrArray(i, j)), Empty, arrArray(i, j))
Next j
Next i

'Anschluss an alten Code
With Me.XXX_Liste
.List = ListBoxListe
.ColumnCount = 4
End With


ListBoxListe ist doch das Array, das Du vor allem auch in der 2. Prozedur verwendest. Es muss also in der gleichen Form vorliegen wie zuvor das aus dem Blatt eingelesene Array. Damit MUSS es auch wieder der List-Eigenschaft zugewiesen werden.

Grüße
EarlFred

drzwockel
23.07.2014, 14:17
Hallo EarlFred,

Du bist mein persönlicher HELD !!!!

Wie Du es jetzt erklärt hast, habe auch ich es verstanden und den Code entsprechend Deiner Vorgaben angepasst ... und siehe da: Es läuft !!!!


Da kann ich nur 1.000 x Danke für Deine Hilfsbereitschaft sagen und vorallem für Deine Geduld. Ist hier nicht immer selbstverständlich!


Gruß vom Doc