Ваш лучший выбор состоит в том, чтобы выполнить итерации по членам набора и видеть, если любое соответствие, что Вы ищете. Доверяйте мне, я должен был много раз делать это.
второе решение (который намного хуже) состоит в том, чтобы поймать "Объект не в наборе" ошибка и затем установить флаг, чтобы сказать, что объект не существует.
Не точно изящный, но лучшее (и самый быстрый) решение, которое я мог найти, использовало OnError. Это будет значительно быстрее, чем повторение для любого среднего и крупного набора.
Public Function InCollection(col As Collection, key As String) As Boolean
Dim var As Variant
Dim errNumber As Long
InCollection = False
Set var = Nothing
Err.Clear
On Error Resume Next
var = col.Item(key)
errNumber = CLng(Err.Number)
On Error GoTo 0
'5 is not in, 0 and 438 represent incollection
If errNumber = 5 Then ' it is 5 if not in collection
InCollection = False
Else
InCollection = True
End If
End Function
В Вашем конкретном случае (TableDefs), выполняющий итерации по набору и проверяющий Имя, хороший подход. Это в порядке, потому что ключ для набора (Имя) является свойством класса в наборе.
, Но в общем случае наборов VBA, ключ не обязательно будет частью объекта в наборе (например, Вы могли использовать Набор в качестве словаря с ключом, который не имеет никакого отношения к объекту в наборе). В этом случае у Вас нет выбора, кроме как пытаться получить доступ к объекту и зафиксировать ошибку.
Isn't it good enough?
Public Function Contains(col As Collection, key As Variant) As Boolean
Dim obj As Variant
On Error GoTo err
Contains = True
obj = col(key)
Exit Function
err:
Contains = False
End Function