67 votes

Déterminer si un objet est membre d'une collection dans VBA

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.

78voto

Vadim Points 380

N'est-ce pas assez bon?

 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
 

40voto

Mark Nold Points 3553

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
 

27voto

Gilligan Points 1051

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.

2voto

Gov_Programmer Points 29

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
 

2voto

Joe Points 60749

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X