Würden auch Sie spontan sagen, die Text-Eigenschaft einer Dropdown-Liste (ComboBox mit Style = "2 - Dropdown-Liste") sei schreibgeschützt? Ein Blick in die Dokumentation zu dieser Eigenschaft zeigt, dass dem nicht so ist. Sie können der Text-Eigenschaft durchaus einen Wert zuweisen - unter der Voraussetzung, dass dieser bereits in der Liste enthalten ist. Ist der Wert bereits mindestens einmal enthalten (unbeachtet der Groß-/Kleinschreibung), wird der ListIndex der ComboBox auf das erste entsprechende Element gesetzt. Ist der Wert nicht vorhanden, wird ein Laufzeitfehler ausgelöst. Der Text-Eigenschaft einer ListBox können Sie ebenfalls einen Wert zuweisen. Der Unterschied zur ComboBox besteht darin, dass bei einem noch nicht in der Liste enthaltenen Wert kein Laufzeitfehler ausgelöst, sondern der ListIndex auf den Wert -1 (keine Auswahl) gesetzt wird.
Der Gedanke, dieses Feature zur einfachen Feststellung zu nutzen, ob ein Wert in der Liste enthalten ist oder nicht, liegt nahe. Weil aber im Erfolgsfalle der ListIndex gesetzt wird, d.h. die aktuelle Auswahl wird geändert (und es wird das Click-Ereignis ausgelöst), wenn das betreffende Element noch nicht ausgewählt gewesen ist, ist diese Nutzungsmöglichkeit eher nicht so sinnvoll. Ohne sichtbare und spürbare Wirkung können Sie das besser erledigen, wie es in "Wer suchet - der findet" gezeigt wird.
Recht praktisch ist dagegen die Möglichkeit, die Auswahl in der Liste direkt anhand eines Wertes setzen zu können. Da ja immer bei einer ComboBox der mögliche Laufzeitfehler abzufangen ist, packen wir den Code der einfacheren Wiederverwendbarkeit halber in die Hilfsfunktionen ComboSel. Sie übergeben ihr die betreffende ComboBox und den zu suchenden und auszuwählenden String. Da beim Fehlschlagen der ListIndex nicht automatisch geändert wird, können Sie über den optionalen Parameter UnSel (Voreinstellung True) festlegen, ob dann die aktuelle Auswahl aufgehoben werden soll (ListIndex = -1). Die Funktion gibt im Erfolgsfall den gesetzten ListIndex zurück. Beim Fehlschlag wird entweder -1 als ListIndex (UnSel = True) oder der Wert -2 (UnSel = False, ListIndex unverändert) zurückgegeben.
Public Function ComboSel(ComboBox As ComboBox, Sel As String, _
Optional ByVal UnSel As Boolean = True) As Long
With ComboBox
On Error Resume Next
.Text = Sel
If Err.Number Then
If UnSel Then
.ListIndex = -1
ComboSel = -1
Else
ComboSel = -2
End If
Else
ComboSel = .ListIndex
End If
End With
End Function
Da bei der ListBox kein Laufzeitfehler ausgelöst wird, könnten Sie auf eine Hilfsfunktion verzichten und die Zuweisung an die Text-Eigenschaft direkt vornehmen. Die folgende Hilfsfunktion macht auch nichts anderes - außer dass sie gleich den neuen ListIndex zurückgibt.
Public Function ListSel(ListBox As ListBox, Sel As String) _
As Long
With ListBox
.Text = Sel
ListSel = .ListIndex
End With
End Function
Eine weitere Nutzungsmöglichkeit des Features bietet sich für das Einfügen und gleichzeitige Auswählen eines neuer Elemente in die Liste an. Sie können so sicher stellen, dass ein Element nur einmal in die Liste aufgenommen wird. Dabei wird entweder das neu hinzugefügte oder das schon vorhandene Element markiert. Den beiden folgenden Funktionen ComboAddUnique und ListAddUnique übergeben Sie die betreffende ComboBox bzw. ListBox und den einzufügen bzw. auszuwählenden String. Als optionalen Parameter können Sie die Index-Position angeben, an der das neue Element gegebenenfalls eingefügt werden soll. Sie können auch eine der beiden Enumerations-Konstanten angeben, wenn das Element an die Spitze der Liste oder an deren Ende (Voreinstellung) eingefügt werden soll.
Public Enum AddUniqueConstants
ainTop = 0
ainBottom = -1
End Enum
Public Function ComboAddUnique(ComboBox As ComboBox, Text As String, _
Optional ByVal Index As Long = ainBottom) As Long
With ComboBox
On Error Resume Next
If .ListCount Then
.Text = Text
If Err.Number Then
If .Sorted Then
.AddItem Text
Else
Select Case Index
Case Is < 0
.AddItem Text
Case Else
.AddItem Text, Index
End Select
End If
.ListIndex = .NewIndex
End If
ComboAddUnique = .ListIndex
Else
.AddItem Text
ComboAddUnique = 0
End If
End With
End Function
Public Function ListAddUnique(ListBox As ListBox, Text As String, _
Optional ByVal Index As Long = ainBottom) As Long
With ListBox
If .ListCount Then
.Text = Text
If .ListIndex = -1 Then
If .Sorted Then
.AddItem Text
Else
Select Case Index
Case Is < 0
.AddItem Text
Case Else
.AddItem Text, Index
End Select
End If
.ListIndex = .NewIndex
End If
ListAddUnique = .ListIndex
Else
.AddItem Text
ListAddUnique = 0
End If
End With
End Function
|