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
Inhaltsverzeichnis

Mehrspaltige Listbox mit Bedingungen

Mehrspaltige Listbox mit Bedingungen
09.11.2013 10:03:11
Werner
Hallo Experten, brauch Euch
Szenario:
Sheet1-------------------------------------------Sheet2
D5:D1000----E5:E1000----F5:F1000--------D5:D100-----E5:E100-----F5:F100
Muster--------Hans---------01.01.1960------Muster-------Hans---------01.01.1960
Maier----------Albert--------10.10.1950
Muster--------Hans---------01.01.1960
Muster--------Hans---------01.01.1960
Maier----------Albert--------10.10.1950
Maier----------Albert--------10.10.1950
Habe zwei Tabellenblätter, wie oben dargestellt. Jetzt soll aus den Daten Sheet1 eine dreispaltige Listbox (Userform) befüllt werden. Das normale Befüllen kriege ich auch hin aber.... Es sollen nur Daten angezeigt werden die im Sheet1 in allen drei Zellbereichen übereinstimmen und mindestens 3x vorhanden sind. Es soll aber nur ein Eintrag in der Listbox angezeigt werden. Zusätzlich müsste noch geprüft werden, ob der Datensatz in Sheet2 bereits vorhanden ist, dann soll er nämlich nicht in die Listbox übernommen werden.
Im obigen Beispiel sollte also Maier Albert 10.10.1950 als Eintrag in der Listbox stehen, da 3x in Sheet 1 vorhanden und nicht in Sheet2 vorhanden.
Ich steh da leider wie der Ochse vor dem Berg
Gruß Werner

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Mehrspaltige Listbox mit Bedingungen
09.11.2013 12:40:51
Christian
Hallo Werner,
ein Vorschlag:
  • lese die Inhalte jeder Zeile aus Tabelle1 (zusammengesetzter String aus Spalte A bis C mit entsprechendem Delimiter) als Key in ein Dictionary-1 und erhöhe den Item dabei jeweils um 1.

  • lese die Inhalte jeder Zeile aus Tabelle2 (zusammengesetzter String aus Spalte A bis C mit gleichem Delimiter) als Key in ein weiteres Dictionary-2. Item ist egal, zB. 0.

  • Durchlaufe alle Keys von Dictionary-1. Wenn der Item kleiner 3 ist und der Key in Dictionary-2 nicht enthalten ist, dann schreibe die entsprechenden Werte des Keys in ein Array.

  • Dieses Array übergibst du am Ende an die ListBox.

  • Gruß
    Christian

    Anzeige
    AW: Mehrspaltige Listbox mit Bedingungen
    09.11.2013 16:51:40
    Werner
    Hallo Christian,
    danke für deine Antwort. Meine Makro Kenntnisse beschränken sich im Grossen und Ganzen auf den Rekorder und das Stöbern in diversen Foren. Von daher ?

    AW: Mehrspaltige Listbox mit Bedingungen
    10.11.2013 14:20:49
    Christian
    hallo Werner,
    ein Dictionary ist ... eine Sammlung von "Name-Werte-Paaren" (Name=Key, Wert=Item). Bsp. hier:
    Key = "Muster|Hans|01.01.1960"
    Item = Anzahl
    Vorteile zum klassischen Array ist u.a., dass du auf die "Name-Werte-Paare" direkt zugreifen kannst, ohne das Array jedesmal neu durchsuchen zu müssen um zu prüfen, ob der Eintrag schon existiert, etc...
    Um die Daten aus Tabelle1 zu lesen könntest du zB folgenden Code einsetzen:
        Set objDic1 = CreateObject("Scripting.Dictionary")
    With ThisWorkbook.Sheets("Tabelle1")
    For i = 1 To .Cells(.Rows.Count, 4).End(xlUp).Row
    strKey = .Cells(i, 4) & "|" & .Cells(i, 5) & "|" & .Cells(i, 6)
    objDic1(strKey) = objDic1(strKey) + 1
    Next
    End With
    

    Im nächsten Schritt durchläufst du analog zu oben die Einträge in Tabelle2 und schreibst diese zB. in objDic2, wobei hier der Wert nicht geändert werden muss, sondern einfach überschrieben werden kann mit:
                objDic2(strKey) = 0
    

    Dann durchläufst du alle Keys in "objDic1" und prüfst, ob deren Wert größer 2 ist und ob dieser Key in "objDic2" nicht existiert.
    Wenn das zutrifft, dann schreibst du die Daten in die ListBox.
        For Each vntKey In objDic1.Keys
    If objDic1(vntKey) > 2 And Not objDic2.Exists(vntKey) Then
    vntLine = Split(vntKey, "|")
    Me.ListBox1.AddItem
    For i = 0 To UBound(vntLine)
    Me.ListBox1.List(k, i) = vntLine(i)
    Next
    k = k + 1
    End If
    Next
    

    Zur Info:
    - Vorherige Fehler wie Spalte A-C statt Spalte E-F und kleiner 2 statt größer 2 hab ich hier korrigiert.
    - Auf den Schritt "schreibe die Daten in ein Array und übergebe dieses Array an die ListBox" habe ich hier verzichtet, auch wenn das sicher performanter wäre.
    - Nutze stets "Option Explicit"
    Gruß
    Christian
    Anzeige

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige