web-dev-qa-db-fra.com

Meilleur moyen de comparer des chaînes dans VBA?

J'utilise VBA depuis un mois maintenant (pour mon travail) et depuis que j'ai commencé à utiliser ce langage/script, il y a eu plusieurs cas où j'ai eu des problèmes en comparant des chaînes .. les façons dont Jusqu'à présent, j'ai comparé les chaînes:

  • str1 = str2 et str1 <> str2
  • (StrComp (str1, str2, méthode de comparaison))
  • InStr (str1, str2)

Parfois, avant d'utiliser l'une de ces méthodes de comparaison, je vais d'abord appliquer UCase (str1) ou même UCase (Trim (str1))}. D'après mon expérience, cependant, comparer des chaînes dans VBA semble être une chose plutôt capricieuse}, parce que j'ai l'impression d'obtenir des résultats incohérents.

QUESTION: Quelle est la meilleure procédure pour comparer deux chaînes dans VBA?

Par exemple: Imaginez qu'il existe deux listes. Une liste contient des modèles d'ordinateurs portables, l'autre des numéros de pièces. L'objectif est d'associer toutes les références à un modèle. Mes résultats ne produisent que des associations partielles, ce qui signifie que si j'ai 10 numéros de pièce à associer à un modèle, seuls 5 ou 6 le sont réellement. Je prends ensuite les chaînes qui ne comparent pas correctement et comparent à nouveau dans un code séparé et obtiendront ensuite le résultat correct. Ce type de comportement a été quelque peu cohérent tout au long de mon utilisation de VBA et c’est de là que vient le "sentiment".

2
Charles

La première question est de savoir si vous souhaitez comparer les majuscules et les minuscules - avec d'autres mots: is "ABC" = "abc".

Le comportement de l'opérateur =- est défini par Option Compare - la valeur par défaut est binary.

Option Compare text
sub foo1
    Debug.print "ABC" = "abc"    ' Prints "True"
end sub

Option Compare binary    ' <-- This is the default!
sub foo2
    Debug.print "ABC" = "abc"    ' Prints "False"
end sub

La fonction StrComp- obtient les mêmes résultats, mais sans qu'il soit nécessaire de définir l'option de comparaison en haut du module. Au lieu de cela, vous pouvez indiquer le moyen de comparaison souhaité en tant que paramètre:

sub foo3
    Debug.Print StrComp("ABC", "abc", vbBinaryCompare) = 0     ' <-- Prints "False"
    Debug.Print StrComp("ABC", "abc", vbTextCompare) = 0       ' <-- Prints "True"
end sub

si vous avez des espaces en début ou en fin de chaîne dans vos chaînes, vous devez toujours utiliser trim - c'est le cas dans tous les langages de programmation que je connais.

Utiliser Instr est plutôt une mauvaise idée de vérifier si deux chaînes identiques, vous pouvez les utiliser pour la recherche de sous-chaînes. Notez que InStr (et son homologue InstrRev) utilisent le paramètre option compare:

Option Compare text
sub foo4
    Debug.print Instr("ABCDE", "cd")   ' Prints "3"
end sub

Option Compare binary
sub foo5
    Debug.print Instr("ABCDE", "cd")    ' Prints "0"
end sub
6
FunThomas