|
Bei den meisten Auflistungen (auch Sammlungen genannt) als auch
das Collection-Objekt
in Visual Basic, in Steuerelementen und in anderen ActiveX-Objekten
können Sie nicht direkt ermitteln, ob ein bestimmter Schlüssel
(der ja eindeutig sein muss) bereits vergeben ist. Oder, was
eigentlich auf dasselbe hinausläuft, Sie können nicht feststellen,
ob sich ein Objekt oder ein Wert mit einem bestimmten dazugehörigen
Schlüssel bereits in einer Collection enthalten ist.
Die Aufgabe lässt sich allerdings nach dem
Versuch-und-Irrtum-Prinzip lösen. Rufen Sie einfach ein Element aus
einer Collection ab - erhalten Sie es, ist es enthalten, erhalten
Sie nichts, ist es auch nicht drin. Das mag zwar banal klingen. Aber
erstens kommt man manchmal nicht auf die naheliegendsten Lösungen.
Und zweitens ist es in konkretem Code nicht ganz so einfach getan.
Das grundlegende Gerüst sieht so aus:
Dim nVar as Variant
On Error Resume Next
nVar = TestCollection(TestSchlüssel)
If Err.Number Then
' Ist nicht drin
Else
' Ist drin
End If
Geht es jedoch um in der Collection enthaltene Objekte, muss die
Zeile der Test-Zuweisung mit der Set-Anweisung formuliert werden:
Set nVar = TestCollection(TestSchlüssel)
Könnte die Collection allerdings sowohl Objekte als auch reine
Werte enthalten, wird die Angelegenheit ein wenig komplexer. Denn
die für Objekte notwendige Zuweisung mit Set löst auch dann einen
Fehler aus, wenn der Wert unter dem Schlüssel zwar enthalten, aber
kein Objekt ist. Je nach dem, ob der Schlüssel wirklich noch nicht
besetzt war, oder ob er nur mit einem Element des falschen
Datentyps, also nicht mit einem Objekt, besetzt war, wird ein
anderer Fehler ausgelöst. Beim falschen Datentyp wird ein Fehler Nummer
13 ("Typen unverträglich") ausgelöst, im Falle
des noch nicht besetzten Schlüssels ein Fehler Nummer 5
("Ungültiger Prozeduraufruf oder ungültiges Argument").
Wir müssen also beide Fehler unterscheiden, und im Falle des
falschen Datentyps die Zuweisung ohne Set wiederholen (das
Zurücksetzen des Err.Objekts mit Err.Clear zuvor nicht vergessen!).
Verpacken wir das gleich wieder in eine universell verwendbare
Funktion, die uns gegebenenfalls auch gleich das den Schlüssel
besetzende Element zurückgibt:
Public Function IsKey(Col As Object, Key As String, _
Optional Element As Variant) As Boolean
Dim nVar as Variant
On Error Resume Next
Set nVar = Col(Key)
Select Case Err.Number
Case 0
' Ist drin
Set Element = nVar
Case 5
' Ist nicht drin
Case 13
Err.Clear
nVar = Col(Key)
Select Case Err.Number
Case 0
' Ist drin
nVar = Element
Case 5
' Ist nicht drin
Case Else
' Anderer Fehler - ggfs. gesondert behandeln!
End Select
Case Else
' Anderer Fehler - ggfs. gesondert behandeln!
End Select
End Function
Sie können diese Funktion natürlich auch auf einen bestimmten
Datentyp hin spezifisch trimmen - aber das überlasse ich Ihnen
selbst.
|