Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1092to1096
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
Combobox - additem oder so ?
k
Hallo,
habe ein Combobox in einer Userform, die dem User helfen soll "Standard-Einträge" zu verwenden.
Der Bereich der Daten enthält aber ca. 1500 Datensätze mit ca. 800 Einträgen und viele sind doppelt, bzw. enthalten eben keinen Eintrag.
Wie kann ich nun die Combobox so füllen, dass alle Einträge "nur" einmal vorkommen und Leere Zellen nicht auftauchen ?
Sowie dass der User auch bei einem Neuen Datensatz auch einen neuen "Namen" eintragen kann - und dieser dann später mit aufgenommen wird.
Siehe Musterdatei:
https://www.herber.de/bbs/user/63753.xls
Gruß und vielen Dank !
Kay
Suche mal im Forum nach Dictionary oder Collection
11.08.2009 12:15:53
NoNet
Hallo Kay,
im Forumsarchiv findest Du etliche Lösungen hierzu durch Verwendung einer COLLECTION bzw. eines DICTIONARY-Objektes. Suche mal danach, Du wirst sicherlich einige tolle Musterlösungen finden.
Eine Frag sei hier noch gestattet : Wieviele Zeilen Code in Deinem aktuellen Projekt hast Du eigentlich slebst entwickelt ? Ich gewinne in den letzten Wochen immer mehr den Eindruck, dass Du (fast) alles durch das Forum lösen lasst ! Ich würde Dir die Anschaffung eines geeigneten VBA-Buches zum Selbststudium oder den Besuch eines VBA-Kurses (bei Deinen Fragen eher einen Fortgeschrittenen-Kurs als einen Anfängerkurs) empfehlen. Das soll nicht heißen, dass Du hier keine Fragen mehr stellen darfst, aber es ist schon sehr auffällig, mit welcher Frequenz Du hier Fragen zu den unterschiedlichsten Themen einstellst ! Das ist schon keine punktuelle Hilfe mehr sondern eine echte Team-Arbeit ("TEAM" = "Toll, ein anderer macht's !").
Gruß, NoNet
Anzeige
AW: Combobox - additem oder so ?
11.08.2009 12:16:56
Daniel
HI
probiers mal damit:
Private Sub UserForm_Initialize()
Dim Zelle As Range
Dim i As Long
With ComboBox1
For Each Zelle In Range("Daten")
If Zelle.Value  "" Then
For i = 0 To .ListCount - 1
If Zelle.Value = .List(i) Then Exit For
Next
If i = .ListCount Then .AddItem Zelle.Value
End If
Next
End With
End Sub
Gruß, Daniel
Alternative ohne Dictionary/Collection
11.08.2009 12:30:42
NoNet
Hallo Daniel,
Deinen Code halte ich (ausnahmsweise mal ;-) für eher suptoptimal, da nicht sonderlich performant (bei 1600 Datensätzen), da für jede Zeile alle bereits in der Listbox enthaltenen Elemente überprüft werden müssen (im schlimmsten Fall also 1600 x 800 / 2 = 640.000 Überprüfungen !).
Sinnvoller wäre es (wenn schon auf COLLECTION und DICTIONARY verzichtet wird), die jeweiligen Inhalte in der Tabelle zu überprüfen, also z.B. für A2 nur Zelle A$2, für A3 => A$2:A3, für A4 => A$2:A4 etc. und den Inhalt nur dann in die ComoboBoxx aufzunehmen, wenn der Begriff erstmalig vorkommt. Dafür bietet sich hervorragend die Funktion ZÄHLENWENN() (VBA : CountIf() ) an :
Private Sub UserForm_Initialize()
Dim lngZ As Long
With Range("Daten")
For lngZ = 1 To .Rows.Count
If Application.CountIf(.Resize(lngZ), .Offset(lngZ - 1).Resize(1)) = 1 Then
ComboBox1.AddItem .Offset(lngZ - 1).Resize(1)
End If
Next
End With
End Sub
Gruß, NoNet
Anzeige
AW: Alternative ohne Dictionary/Collection
11.08.2009 12:43:48
k
Hallo NoNet,
...erst einmal vielen Dank für den Hinweis der Schnelligkeit - werde es mit Deiner Version versuchen.
Dann noch auf Deine Ausführungen zu meinem "Fragetonus" noch einige Zeilen:
Ja, ich bin "noch" Anfänger und kann zwar ziemlich gut ein System mir erdenken, was wie gehen sollte, aber kenne dazu noch nicht die Programm-Codes. Diese lerne ich im Moment und versuche bei allen Antworten von Euch nicht nur zu "kopieren" sondern probiere an Ihnen herum, um sie zu verstehen.
Gebe zu, gelingt mir nicht immer ;o)
Ansonsten gebe ich Dir Recht, es mag den Eindruck erwecken, dass "IHR" mein Excel-Tool schreibt. Aber, dies ist ein sehr komplexes Tool was ich hier für unsere Firma entwickle und der Anteil von Euch ist riesig, wenn in Programmzeilen gesprochen - es etwa 40-50% ausmacht. Ja, ich bin schon am überlegen, wie ich mich dafür "erkenntlich" zeigen kann. Dachte daran, wenn das nächste Treffen stattfindet - vorbei zukommen, bzw. Euch einen Kasten Bier zur Verfügung zu stellen - oder so.
Nein, ich mag es zwar auch nicht immer wieder hier "der Fragende" zu sein, aber aus meinen Büchern (davon habe ich mir in den letzten 2 Wochen 3 zugelegt) werde ich nur teilweise schlauer. Habe noch keines gefunden was wirklich "für mich" geeignet ist. Fast alle beschreiben wie man Formeln und Formatierungen setzen kann, aber stets nur sehr kurz über den Umgang und Einsatz von Userformen, Datenbänken oder Outlook-Anbingungen...
Vielleicht kannst Du mir ja noch ein Buch empfehlen ?
Ich Danke Euch und Dir für Eure Geduld, die ihr mir zu Tage gebracht habt und ich werde in Zukunft auch wieder weniger Fragen stellen - da mein Projekt in diesen Tagen fertiggestellt werden muss...
Werde vermutlich im September ggf. noch mal aktiv werden, wenn es um die Auswertung der 30 Dateien der Außendienstmitarbeiter geht ,o)
Also, habt Vielen Dank für Eure Unterstützung und Lehrreichen Hinweise...
Gruß
Kay
PS: Übrigens gibt es hier 2 Kay's inzwischen, wobei ich am aktivsten bin - gebe ich zu ;o)
Anzeige
AW: Alternative ohne Dictionary/Collection
11.08.2009 12:55:48
Daniel
HI
Zählenwenn macht auch nichts anderes, als die Liste einzeln durchgehen und prüfen, ob der Wert schon vorhanden ist, dh so furchtbar schnell ist das auch nicht, wahrscheinlich auch nicht schneller als das Prüfen in der Combobox, bei bestimmten Konstellationen (viele Doppelte), ist die Prüfung in der Combobox wahrscheinlich sogar schneller, weil weniger zu prüfende Datensätze da sind, außerdem bricht die Comboboxprüfung beim ersten Fund ab, während CountIF immer bis zum Ende durchzählt.
wenn man Performance bei grossen Datenmengen braucht (ohne Dictionary), dann müsste man so vorgehen:
Daten in ne Hilfsspalte kopieren, Daten sortieren, Daten 1x von oben nach unten durchgehen und immer wenn ein Datensatz nicht mit dem benachbarten übereinstimmt, diesen in die Combobox eintragen.
dann bist du bei 1600 Datensätzen mit 1600 überprüfungen dabei.
alternativ könnte man auch den Spezialfilter ohne Duplikate verwenden, bei grossen Datenmengen wird der aber auch langsam, Sortieren ist in Excel einfach eine der schnellsten Funktionen.
Gruß, Daniel
Anzeige
Ich glaube, Du unterschätzt da etwas
11.08.2009 13:43:55
NoNet
Hallo Daniel,
ich glaube, Du unterschätzt da die Geschwindigkeit der Exceleigenen Funktionen gewaltig !
ZÄHLENWENN() ist um einiges schneller als eine selbst programmierte Schleife in VBA - und in meinem Codebeispiel ist nur 1 Schleife enthalten !
Schau Dir mal die Alternativen in folgendem Beispiel an, dann siehst Du, was ich meine :
https://www.herber.de/bbs/user/63757.xls
Die Werte der Spalte A habe ich übrigens mit der "Zufallsfunktion" aus D2 erstellt. Die Funktion RANDBETWEEN() heißt in der deutschen Variante ZUFALLSBEREICH() - dazu müssen die Analysetools aktiviert sein !
Gruß, NoNet
Anzeige
AW: Ich glaube, Du unterschätzt da etwas
11.08.2009 15:00:17
Daniel
Hi
ok, hast recht.
wobei sich da noch einiges rausholen lässt, wenn man nicht mit den Zellobjekten arbeitet, sondern sich das ganze erst in ein Array kopiert.
die 2. von mir beschriebene Methode ist mindestens genauso schnell wie deine Collections-Methode und verwendet nur Elemente, die man vom Arbeiten mit Excel her sowieso kennt.
allerdings, sehr schnell und elegant von der Programmierung her ist das hier, auch für den VBA-Anfänger verständlich,da es nur Funktionen nutzt, die auch in Excel ohne VBA nachvollziehbar sind.
Schleifen oder Variablen werden gar nicht benötigt und die Performace ist bei dieser Datenmene über jeden Zweifel erhaben:
Einzige bedingung ist ne freie Spalte
Private Sub UserForm_Initialize()
Application.ScreenUpdating = False
Range("A1:A1600").AdvancedFilter xlFilterCopy, , Cells(1, 13), True
ComboBox1.List = Range(Cells(2, 13), Cells(Rows.Count, 13).End(xlUp)).Value
Columns(13).Clear
Application.ScreenUpdating = True
End Sub

Anzeige
AW: Ich glaube, Du unterschätzt da etwas
11.08.2009 16:31:49
Rudi
Hallo,
Einzige bedingung ist ne freie Spalte

Unnötig. Du kannst auch auf ein anderes (auch verstecktes) Blatt filtern.
Private Sub UserForm_Initialize()
Application.ScreenUpdating = False
Sheets("Daten").Range("A1:A1600").AdvancedFilter xlFilterCopy, , Sheets("Temp").Cells(1, 1),  _
True
With Sheets("Temp")
ComboBox1.List = .Range(.Cells(2, 1), .Cells(Rows.Count, 1).End(xlUp)).Value
.Columns(1).Clear
End With
Application.ScreenUpdating = True
End Sub
Gruß
Rudi
AW: Alternative ohne Dictionary/Collection
11.08.2009 13:22:58
Luschi
Hallo Nonet,
hübsche Idee, habe ich gleich archiviert. Jetzt muß nur noch der eine! Leereintrag aus der Combobox verschwinden.
Gruß von Luschi
aus klein-Paris
PS: Bin z.Z. in der Hauptstadt vom Norisland tätig!
Anzeige
AW: Combobox - additem oder so ?
11.08.2009 12:32:52
k
Hallo Daniel,
vielen Dank - perfekt !
Gruß
Kay

141 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige