Word/Excel-VBA: Listenfeld und Kombinationsfeld

Eigenes Array einsetzen

Bisher noch keine Bewertungen für diesen Artikel.

Eigenes Array einsetzen

Sie wissen in einer typischen ForNext-Schleife genau, wie groß das Array am Ende dimensioniert sein muss.

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!

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:

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 dieser Technik erreichen Sie Bruchteile der sonst notwendigen Laufzeit, ohne dass der Programmieraufwand nennenswert gestiegen wäre.

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.

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.

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.