Comment déterminer si un objet est membre d'une collection dans VBA? Plus précisément, j'ai besoin de savoir si une définition de table est membre de la collection TableDefs.
Réponses
Trop de publicités?Pas exactement élégant, mais la meilleure solution (et la plus rapide) que j'ai pu trouver était d'utiliser OnError. Ce sera beaucoup plus rapide que l'itération pour toute collection moyenne à grande.
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
Votre meilleur pari est de parcourir les membres de la collection et de voir s'ils correspondent à ce que vous recherchez. Croyez-moi, j'ai dû le faire plusieurs fois.
La deuxième solution (qui est bien pire) consiste à intercepter l'erreur «Élément non dans la collection», puis à définir un indicateur pour indiquer que l'élément n'existe pas.
J'ai créé cette solution à partir des suggestions ci-dessus mélangées à une solution de microsofts pour itérer à travers une collection.
Public Function InCollection(col As Collection, Optional vItem, Optional vKey) As Boolean
On Error Resume Next
Dim vColItem As Variant
InCollection = False
If Not IsMissing(vKey) Then
col.item vKey
'5 if not in collection, it is 91 if no collection exists
If Err.Number <> 5 And Err.Number <> 91 Then
InCollection = True
End If
ElseIf Not IsMissing(vItem) Then
For Each vColItem In col
If vColItem = vItem Then
InCollection = True
GoTo Exit_Proc
End If
Next vColItem
End If
Exit_Proc:
Exit Function
Err_Handle:
Resume Exit_Proc
End Function
Dans votre cas particulier (TableDefs) itération sur la collecte et la vérification du Nom est une bonne approche. C'est OK parce que la clé de la collecte (Nom) est une propriété de la classe dans la collection.
Mais dans le cas général de VBA collections, la clé ne sera pas nécessairement partie de l'objet dans la collection (par exemple, vous pourriez être en utilisant une Collection comme un dictionnaire, avec une clé qui n'a rien à voir avec l'objet dans la collection). Dans ce cas, vous n'avez pas d'autre choix que d'essayer pour accéder à l'élément et la capture de l'erreur.