Word/Excel-VBA: Listenfeld und Kombinationsfeld
Eigenes Array einsetzen
Eigenes Array einsetzen
Auf dieser Seite
Mit Bild
Sie wissen in einer typischen ForNext-Schleife genau, wie groß das Array am Ende dimensioniert sein muss.
Mit Bild
Anstatt dieses mit jeder AddItem-Zeile mühsam immer wieder neu zu dimensionieren, lässt sich das Array sogar mit einer einzigen Zeile der List-Eigenschaft direkt zuweisen. Das dauert für 100.000 Zeilen statt der eben gemessenen anderthalb Minuten weniger als eine Sekunde!
Mit Bild
Sie sollten also für längere Listen unbedingt vorher ein eigenes Array mit den Daten füllen und dieses erst am Ende, wie in diesem Listing, an das Listenfeld Listbox1 übergeben:
Mit Bild
Private Sub UserForm_Initialize() Dim Inhalt(1 To 1000000) As String Dim dblAnzahl As Double With Me.Listbox1 For dblAnzahl = 1 To 1000000 Inhalt(dblAnzahl) = "Zeile " & dblAnzahl Next .List = Inhalt() End With End Sub
Mit Bild
Mit dieser Technik erreichen Sie Bruchteile der sonst notwendigen Laufzeit, ohne dass der Programmieraufwand nennenswert gestiegen wäre.
Mit Bild
Listen-Auswahl vorbesetzen
Natürlich können Kombinationsfelder und Listenfelder mehr, als nur Daten anzuzeigen. Sie dienen ja im Wesentlichen der Auswahl eines Wertes aus einem Angebot von vielen.
Mit Bild
Wenn Ihr Dialog beim Bestätigen eine erfolgte Auswahl zwingend voraussetzt, ist es sinnvoll, direkt in UserForm_Initialize irgendeinen Wert auszuwählen. Das geschieht zum Beispiel mit Listbox1.Value = "gelb" nach Vorbelegung der Liste mit den AddItem-Methode-Aufrufen, falls der gewünschte Wert bekannt ist.
Um nur sicherzustellen, dass überhaupt ein Wert markiert ist, können Sie einfach den ersten Eintrag markieren, indem Sie Listbox1.ListIndex = 0 im Code schreiben. Möglicherweise sollten Sie vorher noch mit If Listbox1.ListCount > 0 Then überprüfen, ob überhaupt Zeilen enthalten sind.
Mit Bild
Mehrere Zeilen markieren
Bisher galt es als selbstverständlich, dass nur ein Wert auswählbar ist. Und nur so lange ist es auch sinnvoll, dies mit der Value-Eigenschaft auszulesen. Sobald Sie aber im Entwurf die Eigenschaft MultiSelect auf fmMultiSelectMulti oder fmMultiSelectExtended stellen, können beliebig viele Zeilen vom Benutzer markiert werden.
Der Wert fmMultiSelectMulti bedeutet, dass jeder Klick die jeweilige Zeile zwischen markiert und nicht-markiert umschaltet. Mit fmMultiSelectExtended verhält sich die Liste so wie der Windows-Explorer, also Einzel-Auswahl mit gedrückter Strg-Taste und Sammelauswahl mit gedrückter Umschalt-Taste beim Mausklick.