web-dev-qa-db-fra.com

Excel VBA: sélectionnez la casse si ActiveCell comme "* chaîne *"

Je travaille sur une macro qui prend la valeur actuelle de ActiveCell et modifie cette valeur en fonction d'un cas sélectionné.

Cependant, je ne peux pas déterminer si le ActiveCell contient une chaîne générique. Je ne sais pas si ma syntaxe est correcte. Comment comparer mon cas sélectionné?

Select Case ActiveCell.Value

    Case ActiveCell.Value Like "*string*"
        ActiveCell.Value = "contains string"

End Select
9
thedeepfield

Il est possible d'utiliser des caractères génériques. Gardez ces deux choses à l'esprit: Premièrement, les expressions de comparaison de chaînes sont évaluées en un type de données booléen (True/False); Deuxièmement, selon la référence du développeur pour l'instruction Select ... Case, toute expression (s) doit être "implicitement convertible" au même type de données comme celle de l'expression de test Select Case . Pour démontrer, utilisons le code du post original ci-dessus.

Select Case ActiveCell.Value  '-->ActiveCell.Value is the test expression

    Case ActiveCell.Value Like "*string*"  '-->(ActiveCell.Value Like "*string*") is the Case expression.
        ActiveCell.Value = "contains string"

End Select

Si nous sélectionnions une cellule contenant une valeur de chaîne dans une feuille de calcul, puis utilisions la fenêtre immédiate pour tester le type de données de ces deux expressions à l'aide de la fonction TypeName (), nous obtiendrions ce qui suit:

?TypeName(ActiveCell.Value)
 String
?TypeName(ActiveCell.Value Like "*string*")
 Boolean

Comme vous pouvez le voir, Select ... Case ne fonctionnera pas ici car les types de données ne sont pas implicitement les mêmes (une exception mineure à cela serait si la macro était exécutée sur des cellules d'une feuille de calcul contenant les valeurs de mot unique de "Vrai" ou "Faux", qu'Excel convertit automatiquement en booléen).

La solution est en fait très simple. Modifiez simplement l'expression de test en True.

Select Case True

    Case (ActiveCell.Value Like "*string*")
        ActiveCell.Value = "contains string"

End Select

C'est essentiellement la même chose que d'écrire:

If (ActiveCell.Value Like "*string*") = True Then ActiveCell.Value = "contains string"

C'est surtout une question de préférence personnelle que vous utilisiez If ... Then ou Select ... Case. Personnellement, j'aime la construction Select ... Case en raison de la lisibilité du code, mais aussi pour d'autres avantages (comme la possibilité de transmettre à chaque cas une liste d'expressions séparées par des virgules plutôt que d'utiliser un OR, rendant le code plus concis).

23
Nero057

Is et like ne peuvent pas être utilisés comme opérateurs de comparaison dans une instruction de sélection de cas dans VBA.
Si possible, il serait préférable de remplacer par une déclaration si-alors:

If ActiveCell.Value Like "*string*" Then ActiveCell.Value = "string"

Du glossaire VBA pour les opérateurs de comparaison:

Caractère ou symbole indiquant une relation entre deux ou plusieurs valeurs ou expressions. Ces opérateurs incluent inférieur à (<), inférieur ou égal à (<=), supérieur à (>), supérieur ou égal à (> =), différent de (<>) et égal (=). Les opérateurs de comparaison supplémentaires incluent Is et Like. Notez que Is et Like ne peuvent pas être utilisés comme opérateurs de comparaison dans une instruction Select Case.

4
Aaron Thomas