Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1520to1524
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
Inhaltsverzeichnis

Listbox abfüllen aus Dictionary Object

Listbox abfüllen aus Dictionary Object
24.10.2016 17:17:28
Marc
Hallo zusammen,
ich versuche aktuell den Code in einem Programm auf Geschwindigkeit zu optimieren und dabei auch einige Altlasten loszuwerden. Bisher habe ich gewisse Auswahlen in Listboxen in einer 2. versteckten Listbox zwischengespeichert. Das ist zwar schon relativ schnell (im Vergleich mit direkt in den Tabellen zu arbeiten), aber wahrscheinlich nicht die eleganteste Lösung.
Ich erhoffe mir vom Dictionary Objekt sowohl mehr Geschwindigkeit (mit grossen Datenmengen) wie auch einen professionelleren Code;-).
Anbei der Testcode, wie ich ihn heute habe:
Sub Listbox_füllen()
Dim L, M As Long
Set MyDic_Stammdaten = CreateObject("Scripting.Dictionary")
Dim Suchkriterium As Variant
Dim Matrix As Variant
'Suchkriterium Test
Suchkriterium = Sheets("Tabelle2").Range("A2:A" & Sheets("Tabelle2").Cells(Rows.Count, 1). _
End(xlUp).Row)
'Suchmatrix definieren
Matrix = Sheets("Tabelle1").Range("A2:J" & Sheets("Tabelle1").Cells(Rows.Count, 1).End(xlUp) _
.Row)
For L = 1 To UBound(Matrix)
For M = 1 To UBound(Suchkriterium)
If Matrix(L, 3) = Suchkriterium(M, 1) Then
MyDic_Stammdaten(Matrix(L, 2)) = Array(Matrix(L, 1), _
Matrix(L, 3), _
Matrix(L, 4), _
Matrix(L, 5), _
Matrix(L, 6), _
Matrix(L, 7), _
Matrix(L, 8), _
Matrix(L, 9), _
Matrix(L, 10))
End If
Next M
Next L
ListBox1.List = MyDic_Stammdaten.keys
End Sub
Das funktioniert auch soweit, nur habe ich noch ein paar Fragen dazu:
  • Wenn ich nur ein Suchkriterium festlege, dann bekomme ich einen Fehler, erst ab 2 läuft es. Weshalb? Und wie kriege ich es hin, dass es auch mit einem Kriterium läuft?

  • Wie kann ich in die Listbox alle Items 1-10 (oder selektiv einzelne daraus) ausgeben (nicht nur den Key (L,2))?

  • Kann ich die Reihenfolge ändern? Bisher hatte ich die Daten gleich so, dass ich die Listbox aus dem Tabellenblatt optimal abfüllen konnte. Deshalb ist der Kundenname in Spalte 1, die eindeutige Kundennummer aber in Spalte 2. Indem ich die Kundennummer als Key definiere, zeigt es mir immer diese Nummer (anstelle des viel aussagekräftigeren Kundennamens) an.

  • Danke im Voraus für Eure Hilfe!
    Lg
    Marc

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

    Betreff
    Datum
    Anwender
    Anzeige
    AW: Listbox abfüllen aus Dictionary Object
    24.10.2016 18:48:20
    Daniel
    Hi
    zu deiner ersten Frage:
    wenn du nur ein Suchkriterium hast, dann entsteht bei:
    Suchkriterium = Sheets("Tabelle2").Range("A2:A" & Sheets("Tabelle2").Cells(Rows.Count, 1).End(xlUp).Row)
    eine einfach Wertvariable und kein Array.
    mit einfachen Wertvariablen muss man aber anders umgehen als mit Arrays.
    du hast zwei Möglichkeiten:
    - entweder abfragen, ob ein oder mehrere Werte vorliegen und unterschiedlich für Array und Einzelwert programmieren
    - sicherstellen, dass immer mindestens zwei Werte vorhanden sind und ein Array entsteht, auch wenn du nur einen Wert eingibst.
    das geht am einfachsten, in dem du die Überschrift aus Zeile 1 mit in die Variable übernimmst und über den Startwert der Schleife ausschließt:
    Suchkriterium = Sheets("Tabelle2").Range("A1:A" & ...)
    ...
    For M = 2 To UBound(Suchkriterium)

    zu deiner zweiten Frage:
    du kannst hinterher dein Dictionary per Schleife in ein echtes 2-D-Array umschaufeln.
    äusserer Schleife über die Dictionary-Keys
    Innere Schleife über die Einzelwerte der Items
    dann weist du dieses 2-D-Array der Listbox zu.
    über die BoundColumn kannst du steueren, aus welcher Spalte das Ergebnis gelesen wird
    über ColumnWidth kannst du steueren, welche Spalten in der Liste angezeigt werden
    in der Schleife könntest du auch nochmal die Reihnfolge der Spalten anpassen, falls das Erforderlich ist.
    Wegen der Performance musst du dir keine Sorten machen, solche Schleifen über VBA-Interne Arrays sind sehr schnell, problematisch sind nur Schleifen über Zellobjekte.
    Gruß Daniel
    Anzeige
    AW: Listbox abfüllen aus Dictionary Object
    24.10.2016 19:28:02
    Marc
    Hallo Daniel,
    Deine Antwort löst nicht nur meine Probleme, sondern ist dazu äusserst gut nachvollziehbar und damit extrem lehrreich! Besten Dank für Deine Hilfe
    Gruss Marc
    AW: Listbox abfüllen aus Dictionary Object
    25.10.2016 09:52:24
    Marc
    Hallo Daniel,
    leider war ich ein wenig vorschnell mit "alles klar":-(
    Die Idee verstehe ich, bei der Umsetzung zur Befüllung des 2D-Arrays scheitere ich aber? Die äussere und innere Schlaufe scheint mir klar:
        For L = 1 To MyDic_Stammdaten.Count
    For M = 1 To 10
    arrAusgabe(L,M) = ...
    Next M
    Next L
    
    Ich glaube auch, dass ich die Keys und Items mit MyDic_Stammdaten.keys/item()(x) ansprechen kann. Aber wie das genau geht, daran scheitere ich aktuell und finde auch nix erhellendes?
    Wie muss ich das Array definieren? Bereits 2D mit dim arrAusgabe(1 to 1, 1 to 10)? Muss ich nachher mit Redim Preserve arbeiten?
    Danke im Voraus für Deine Hilfe
    Gruss Marc
    Anzeige
    AW: Listbox abfüllen aus Dictionary Object
    25.10.2016 11:53:03
    Marc
    Sorry, habe vergessen das Kontrollkästchen "noch nicht beantwortet" zu aktivieren, anbei nochmals meine offene Frage (Antwort auf Eintrag von Daniel):
    Hallo Daniel,
    leider war ich ein wenig vorschnell mit "alles klar":-(
    Die Idee verstehe ich, bei der Umsetzung zur Befüllung des 2D-Arrays scheitere ich aber? Die äussere und innere Schlaufe scheint mir klar:
        For L = 1 To MyDic_Stammdaten.Count
    For M = 1 To 10
    arrAusgabe(L,M) = ...
    Next M
    Next L
    

    Ich glaube auch, dass ich die Keys und Items mit MyDic_Stammdaten.keys/item()(x) ansprechen kann. Aber wie das genau geht, daran scheitere ich aktuell und finde auch nix erhellendes?
    Wie muss ich das Array definieren? Bereits 2D mit dim arrAusgabe(1 to 1, 1 to 10)? Muss ich nachher mit Redim Preserve arbeiten?
    Danke im Voraus für Deine Hilfe
    Gruss Marc
    Anzeige
    AW: Listbox abfüllen aus Dictionary Object
    25.10.2016 12:00:31
    Daniel
    Hi
    Redim Preserve solltest du vermeiden.
    Wenn dir Anzahl der benötgiten Spalten bekannt ist, besser gleich das Listbox-Array auf die benötigte Anzahl dimensionieren. ggf kannst du dir ja schon beim Erstellen des Dictionarys die Spaltenanzahl mittracken.
    falls nicht, kannst du die auch nachträglich in einer einfachen Schleife ermitteln.
    das ganze sieht dann prinzipell so aus (nur Prinzip und nicht getestet, Code also bitte nicht kopieren sonderen verstehen und selber schreiben):
    Dim arr1
    Dim arr2
    Dim arrListbox
    Dim Spalten As Long
    Dim z As Long
    Dim s As Long
    arr1 = myDictionary.Keys
    '--- Anzahl Spalten ermitteln, falls nicht bekannt
    For z1 = 0 To UBound(arr1)
    arr2 = myDictionary(arr1(z))
    If Spalten 
    man könnte hier ggf auch ohne das Zwischenarray arr2 auskommen und die Werte über myDictionary(arr1(z))(s) ansprechen, aber so wird's kürzer und übersichtlicher.
    Gruß Daniel
    Anzeige
    AW: Listbox abfüllen aus Dictionary Object
    25.10.2016 14:11:36
    Marc
    Hallo Daniel,
    funktionierende Lösung kombiniert mit Anstoss zum eigenständigen Denken! ;-)
    Super, bei mir hat sich heute der Nebel im Umgang mit Arrays gerade ein wenig gelichtet, danke vielmals für Deine kompetente Antwort!
    Gruss Marc
    AW: Listbox abfüllen aus Dictionary Object
    25.10.2016 10:33:01
    ChrisL
    Hi Marc
    Ein komplett anderer Ansatz:
    https://www.herber.de/bbs/user/109002.xlsm
    Ich meine dies könnte eine effiziente Methode sein, bin mir aber auch nicht sicher (Expertenmeinung gefragt).
    Voraussetzungen:
    a) Datei muss gespeichert sein
    b) Im VBA-Editor unter Extras, Verweise, muss "Microsoft ActiveX Data Objects x.x Library" aktiv sein.
    Private Sub UserForm_Initialize()
    Dim cn As ADODB.Connection
    Dim ar As Variant
    Set cn = New ADODB.Connection
    With cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Data Source=" & ThisWorkbook.FullName & ";" & _
    "Extended Properties=Excel 8.0;"
    .Open
    End With
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset
    rs.Open "SELECT * FROM [Tabelle1$] INNER JOIN [Tabelle2$] ON [Tabelle1$].[key] = " & _
    "[Tabelle2$].[key]", cn
    ar = rs.GetRows
    ListBox1.List = Application.Transpose(ar)
    rs.Close
    cn.Close
    End Sub
    

    SELECT * FROM... Die Wildcard (*) kannst du bei Bedarf ersetzen und diejenigen Datenfelder angeben, welche du in die Listbox übertragen willst.
    cu
    Chris
    Anzeige
    AW: Listbox abfüllen aus Dictionary Object
    25.10.2016 11:47:20
    Marc
    Hallo Chris,
    sehr interessant, werde ich mir bei Gelegenheit mal vertieft reinziehen. Im Moment ist mir der Bruch aber ein wenig zu gross, möchte zunächst mal mit dem Dictionary Object ein bisschen firmer werden.
    Zudem möchte ich offen betreffend Dateninput sein, der soll auch aus einer möglichen Listbox-Auswahl kommen, und spätestens da wäre ich bei Deiner Lösung heillos überfordert;-)
    Danke Dir trotzdem für Deinen Input, weiss es zu schätzen!
    Gruss
    Marc
    PS: Entweder kopierst Du extrem gut, ober Deine Selbsteinschätzung "VBA bescheiden" ist eine grobe Untertreibung!;-)
    Anzeige

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige