Méthode générique permettant de vérifier si une clé est dans une Collection en VBA Excel
J'ai différentes Collections dans mon code. Certaines tenir des Objets (de divers types), d'autres ont des types (type Long).
Est-il un moyen de vérifier si une clé est contenue dans la Collection qui fonctionne pour les types comme des objets?
Pour l'instant j'ai deux fonctions.
Première fonction:
Private Function ContainsObject(objCollection As Object, strName As String) As Boolean
Dim o As Object
On Error Resume Next
Set o = objCollection(strName)
ContainsObject = (Err.Number = 0)
Err.Clear
End Function
Deuxième fonction:
Private Function ContainsLong(AllItems As Collection, TheKey As String) As Boolean
Dim TheValue As Long
On Error Resume Next
TheValue = AllItems.Item(TheKey)
ContainsLong = (Err.Number = 0)
Err.Clear
End Function
La raison pour laquelle les deux fonctions est que ContainsObject ne semble pas fonctionner si je passe une Collection qui a de Longs paires (la fonction renvoie toujours False.)
P. S.: La première fonction est une copie de la troisième réponse à partir de Tester ou vérifier si la feuille existe
Il semble y avoir une faute de frappe d'erreur. Je pense que
Merci pour la correction! J'ai accepté la réponse qui explique rapidement et résout mon problème. Merci pour la réponse, aussi, la solution est là, aussi, mais un peu plus subtil...
Contains = (Err.Number = 0)
devrait être ContainsObject = (Err.Number = 0)
de Même CheckForKeyInCollection = (Err.Number = 0)
devrait être ContainsLong = (Err.Number = 0)
Merci pour la correction! J'ai accepté la réponse qui explique rapidement et résout mon problème. Merci pour la réponse, aussi, la solution est là, aussi, mais un peu plus subtil...
OriginalL'auteur user2606240 | 2016-06-24
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser un
Variant
dans la première fonction. Vous pouvez affecter unObject
à unVariant
, par exemple, ce ne sera pas d'erreur:Mais cela vous donnera une
Type Mismatch
erreur de compilation c'est à dire en essayant d'attribuer unLong
à unObject
:Ainsi, pour une fonction générique (le long de vos lignes de code) pour vérifier si un
Collection
clé est valide, vous pouvez utiliser:Code de Test:
Il y a un article utile sur MSDN à ce sujet. Le contexte est VB6, mais se rapporte à VBA.
Remercie de votre réponse conseille d'utiliser
Dictionary
objet qui j'en conviens est l'approche privilégiée. L'OP est à l'aide deCollection
objet et peuvent ne pas avoir la possibilité de passer àDictionary
. Pas toujours possible de "changer de chevaux de milieu de jet" comme ils le disent 🙂OriginalL'auteur Robin Mackenzie
Quelques fautes de frappe que par des commentaires ont déjà été corrigées lors de l'édition de votre message.
En réponse à votre question, je tiens à couvrir d'autres aspects connexes.
Tout en Utilisant les touches dans les collections a principalement trois avantages
- Si l'ordre change votre code d'accès de l'élément correct
- Vous pouvez directement accéder à l'élément sans lire l'intégralité de l'
collection
- Il peut vous rendre le code plus lisible.
*Mais en même temps il y a principalement trois problèmes avec l'utilisation de clés
collections
Vous ne pouvez pas vérifier si la clé existe
Vous ne pouvez pas modifier la clé
Vous ne pouvez pas récupérer la clé
Comme par Pearsons article les Clés d'une Collection sont en écriture seule, il n'y a aucun moyen d'obtenir la liste des Clés d'une Collection. Poursuite à travers citation:-
Personnalisé Classes De Collection
Une façon est d'itérer sur les membres de la collecte et de voir si il y a match pour ce que vous êtes à la recherche pour, l'autre pour attraper le
Item not in collection
erreur, puis définir un indicateur pour dire que l'article n'existe pas. Les Opinions diffèrent sur ces approches alors que certaines personnes se sentent ce n'est pas une bonne méthode pour attraper erreur, tandis que d'autres de la section estime qu'il sera nettement plus rapide que d'itération pour tout moyen à large collection.Donc, si nous faisons une méthode de capture d'erreur puis le numéro de l'erreur nous obtenons dépend exactement ce qui a causé l'erreur. Nous avons besoin d'un code de routine pour vérifier l'erreur. La manière la plus simple qu'il pourrait être.
Erreur attraper les routines proposées par les différents professionnels diffèrent dans le nombre d'erreur qu'ils jugent importants et de les inclure dans leur routine.Divers fréquentes numéros d'erreur associée à l'objet de collection sont:-
Error 5
Invalid argument ou appel de procédure.Cette erreur peut également se produiresi une tentative est faite pour appeler une procédure qui n'est pas valide sur le
plate-forme actuelle. Par exemple, certaines procédures ne peut être valable pour
Microsoft Windows ou pour Macintosh, et ainsi de suite.
error 438
"cet objet ne gère pas cette propriété ou cette méthode d'Un objetest une instance de classe. Une instance de classe prend en charge certaines propriétés
définis dans cette classe de la définition de type et ne prend pas en charge cette.
Error 457
Cette clé est déjà associé à un élément de cettecollection.Vous avez spécifié une clé pour une collection membre déjà
identifie un autre membre de la collection. Choisissez une clé différente
pour ce membre.
Error 91
Variable objet ou variable bloc with non définie.Il y a deuxétapes pour la création d'une variable objet. D'abord, vous devez déclarer le
variable objet. Ensuite, vous devez attribuer une référence valide à l'objet
variable à l'aide de l'instruction Set. Vous avez tenté d'utiliser un objet
variable qui n'est pas encore le référencement d'un objet valide.
Error 450
Mauvais nombre d'arguments ou de propriété non valideaffectation.Le nombre d'arguments dans l'appel à la procédure
n'était pas le même que le nombre d'arguments requis prévu par la
procédure.Si vous avez essayé d'assigner une valeur à une propriété en lecture seule,
Parmi les erreurs ci-dessus le numéro de l'erreur 438 a été considéré comme important, et l'autre est de 5. Je suis en intégrant une Fonction de routine dans mon exemple de programme de test, qui a été publiée par la Marque Nold 7 ans en arrière, en 2008, vide DONC, la question Déterminer si un objet est un membre d'une collection en VBA avec du crédit en raison de lui.
Certains comme l'erreur 457 ne sera pas autorisée au moment de l'essai. J'ai essayé de me renseigné avec des doubles de clés de données, il a donné à l'erreur au moment de l'essai lui-même comme le montre le cliché.
Après le retrait c'est de montrer de bons résultats, comme indiqué dans la capture d'écran.
Il peut ne pas être possible d'obtenir la liste des clés d'une collection de vanille collection sans stocker les valeurs dans un tableau indépendant. La meilleure alternative à faire est d'ajouter une référence à Microsoft Scripting Runtime & utilisation plus capable d'Dictionnaire de la place.
J'ai inclus cette approche pour obtenir la liste des clés dans mon programme.
Pendant le remplissage de la Collection de veiller à ce que la clé est le deuxième paramètre doit être une chaîne unique.
Code complet de mon programme.
Sortie finale selon le programme, comme indiqué dans la fenêtre d'exécution a été montré dans la capture d'écran.
Dictionary
de Scripting Runtime library. C'est une honte que ce n'est pas un défaut d'Excel VBA.OriginalL'auteur skkakkar
La méthode de Robin échouera si la Collection contient des objets plutôt que des types primitifs parce qu'ils ont besoin d'être affectée à l'aide d'Ensemble et autrement générer une erreur de sorte que la méthode de retour Faux. Voici une petite adaptation:
OriginalL'auteur Apostle
Apôtre est presque correct avec leur réponse. Robin réponse ne fonctionnera pas avec des objets génériques, mais fonctionne comme écrit en raison d'Excel objet de la Plage sera de retour la valeur de la cellule. J'aime Apôtre de l'utilisation de IsObject (surtout parce que la sat est ce que j'avais compris ainsi). Le code est un peu plus compliqué.
Si la clé existe dans la collection IsObject sera de définir la variante à True ou à False, sinon une erreur sera ignorée de quitter la variante vide.
OriginalL'auteur PaulE