Vérifier si une valeur est membre d'une liste
- Je dois vérifier un morceau de saisie de l'utilisateur dans une liste d'éléments; si l'entrée est dans la liste des éléments, puis de diriger le flux d'une seule manière. Si non, diriger le flux à l'autre.
- Cette liste est PAS visible sur la feuille de calcul elle-même; elle doit être dissimulé sous le code.
J'ai pensé à deux stratégies pour ce faire:
- Déclarer comme un
enum
et de vérifier si l'entrée est une partie de ceenum
bien que je ne suis pas sûr de la syntaxe de cette ai - je besoin d'initialiser leenum
à chaque fois que je veux l'utiliser? - Déclarer un tableau et vérifier si l'entrée est une partie de ce tableau.
Je me demandais pour VBA qui est de mieux en termes d'efficacité et de lisibilité?
source d'informationauteur Evil Washing Machine
Vous devez vous connecter pour publier un commentaire.
Contrairement à .NET langages VBA ne pas exposer Enum en tant que texte. Il est strictement un certain nombre et il n'est pas
.ToString()
méthode qui exposerait le nom de l'Enum. Il est possible de créer votre propreToString()
méthode et de retourner une représentation sous forme de Chaîne d'un enum. Il est également possible de énumérer un type Enum. Bien que tous est possible, je ne recommanderais pas en le faisant de cette manière que les choses sont trop compliqué pour une telle tâche.Que diriez-vous de créer un Dictionnaire de la collecte des éléments et de l'utiliser simplement
Exist
méthode et une sorte d'erreur de manipulation (ou simple if/else) pour vérifier si ce que les entrées d'utilisateur dans la zone de saisie en existe un dans votre liste.Par exemple:
Remarque: Si vous ajoutez des références à
Microsoft Scripting Runtime
bibliothèque vous serez alors en mesure d'utiliser le logiciel intelli-sense avec lemyList
objet tel qu'il aurait été lié au plus tôt en remplacement deavec
C'est à vous de la façon dont vous voulez aller à ce sujet et ce qui est plus pratique. Notez que vous n'avez pas besoin d'ajouter des références si vous allez avec la Liaison Tardive alors que les références sont nécessaires si vous voulez au Début de Liaison avec l'intelli-sense.
Juste pour le plaisir des lecteurs d'être en mesure de visualiser la version en utilisant le protocole Enum laissez-moi vous montrer comment ce mécanisme pourrait éventuellement travailler
Tout d'abord vous déclarer votre Liste comme Enum. J'ai ajouté seulement 3 éléments pour l'exemple pour être aussi simple que possible.
[_Min]
et[_Max]
indiquer la valeur minimale et la valeur maximale de l'enum (il est possible d'ajuster cette mais encore une fois, nous allons garder les choses simples pour l'instant). Vous déclarez à la fois à être en mesure d'effectuer une itération sur votreEList
.ToString()
méthode renvoie une représentation sous forme de Chaîne de l'Enum. Tout développeur VBA se rend compte à un moment que c'est dommage de VBA est manquant cela comme une caractéristique intégrée. De toute façon, vous avez votre propre mise en œuvre maintenant.Exists
prend tout ce quiuserInput
magasins et lors de l'itération sur les EnumEList
des matchs contre d'une représentation de Chaîne de votre Enum. C'est inutile parce que vous avez besoin à appeler un grand nombre de méthodes et de la boucle sur les enum pour être en mesure de réaliser ce une simpleDictionary
'sExists
méthode ne permet en une seule fois. C'est principalement pourquoi je ne recommande pas d'utiliser les Énumérations pour votre problème spécifique.Puis à la fin vous avez le
Main
sous qui rassemble simplement l'entrée de l'utilisateur et appelle laExists
méthode. Il affiche une Boîte de Message avec soittrue
oufalse
qui indique si la Chaîne n'existe qu'un type Enum.Vous pouvez exécuter un tableau simple test ci-dessous vous permet d'ajouter les mots à une seule liste:
Ou si vous souhaitez faire une recherche plus détaillée, et de retourner une liste de sous-chaîne correspond pour le travail, puis utiliser
Filter
. Ce code serait de retour parvFilter
si recherchedog
Dans ce cas particulier, le code vérifie ensuite une correspondance exacte pour
dog
.Suffit d'utiliser la
Select Case
avec une liste: