@ Mark Biek Ваш keyExists близко соответствует моей стандартной функции Exists (). Чтобы сделать класс более полезным для коллекций, представленных COM, и для проверки числовых индексов, я бы рекомендовал изменить sKey и myCollection, чтобы они не печатались. Если функция собирается использоваться с коллекцией объектов, требуется 'set' (в строке, где установлено val).
РЕДАКТИРОВАТЬ : Меня беспокоило, что я никогда не замечал разных требований для объектной и основанной на значениях функции Exists (). Я очень редко использую коллекции для не-объектов, но это казалось таким прекрасным узким местом для ошибки, которую было бы так трудно отследить, когда мне нужно было проверить существование. Поскольку обработка ошибок завершится ошибкой, если обработчик ошибок уже активен, для получения новой области ошибок требуются две функции. Когда-либо нужно вызывать только функцию Exists ():
Public Function Exists(col, index) As Boolean
On Error GoTo ExistsTryNonObject
Dim o As Object
Set o = col(index)
Exists = True
Exit Function
ExistsTryNonObject:
Exists = ExistsNonObject(col, index)
End Function
Private Function ExistsNonObject(col, index) As Boolean
On Error GoTo ExistsNonObjectErrorHandler
Dim v As Variant
v = col(index)
ExistsNonObject = True
Exit Function
ExistsNonObjectErrorHandler:
ExistsNonObject = False
End Function
И для проверки работоспособности:
Public Sub TestExists()
Dim c As New Collection
Dim b As New Class1
c.Add "a string", "a"
c.Add b, "b"
Debug.Print "a", Exists(c, "a") ' True '
Debug.Print "b", Exists(c, "b") ' True '
Debug.Print "c", Exists(c, "c") ' False '
Debug.Print 1, Exists(c, 1) ' True '
Debug.Print 2, Exists(c, 2) ' True '
Debug.Print 3, Exists(c, 3) ' False '
End Sub