Voir le flux RSS

Pierre Fauconnier

VBA: Option Compare, à quoi ça sert?

Noter ce billet
par , 22/10/2019 à 09h00 (223 Affichages)
Salut.

Il arrive que, lorsque l'on teste l'égalité de deux chaines de caractères, le résultat ne soit pas identique d'une fois à l'autre. Par exemple, "PIERRE" = "pierre" renvoie TRUE ou False, selon le contexte de compilation. Dès lors, est-ce une bonne idée d'utiliser Option Compare en en-tête de module?

Avant même de développer mes arguments, je vais répondre de façon directe: Non, ce n'est pas une bonne idée, voire même, c'est DANGEREUX! Dangereux, en tout cas, pour qui souhaite réutiliser le code qu'il produit dans un contexte différent.


Revoyons d'abord les bases du VBA, voulez-vous?

La ligne Option Compare... est une ligne de compilation de module. Cela signifie qu'elle impose au VBE (Visual Basic Editor) de tenir compte de l'option de comparaison choisie par le développeur pour le module considéré. Cela nous amène à penser que les options de compilation peuvent être spécifiques à chaque module d'un projet VBA.

En l'absence de cette ligne, le VBE va considérer que la ligne Option Compare Binary est présente. Le traitement d'une chaine de caractères va donc, par défaut, s'effectuer en testant le code ascii des caractères des chaînes à comparer. En clair et par abus de langage, cela revient à effectuer une différence de casse, ou encore à différencier les majuscules des minuscules. Dès lors, "PIERRE" = "pierre" renverra FALSE.

Il est possible de déroger à ce traitement pour un module donné en précisant la comparaison sans différenciation de la casse grâce à la ligne Option Compare Text. Dans ce cas, "PIERRE" = "pierre" renverra TRUE. Il faut toutefois bien noter que cette option de compilation s'applique à toutes les procédures et fonctions du module concerné. Il est donc important de bien vérifier l'impact de cette modification de compilation qui est tout sauf anodine, surtout pour un module dans lequel cette ligne est ajoutée alors qu'il contient déjà des procédures ou fonctions.


Impacts sur l'utilisabilité du code
L'on comprend donc rapidement que la création d'une fonction qui se voudrait générique ne le serait en fait pas si, de projet en projet, on la baladait dans des modules qui ne possèdent pas les mêmes options de comparaison, puisque la valeur renvoyée par le code dépendrait de Option Compare en début de module.

Nom : 2019-10-21_173006.png
Affichages : 37
Taille : 4,4 Ko

Nom : 2019-10-21_173028.png
Affichages : 37
Taille : 15,5 Ko

Nom : 2019-10-21_173058.png
Affichages : 36
Taille : 12,4 Ko

Vous comprenez mieux maintenant pourquoi je préfère me passer de ces options de compilation et piloter moi-même le type de comparaison effectuée pour augmenter la réutilisabilité de mon code, mais aussi le fiabiliser.


Comment se passer de ces options de compilation?

Il existe plusieurs méthodes. Dans le cas où l'on souhaite réaliser une comparaison textuelle, il est possible de convertir les deux textes à comparer en majuscules (ou en minuscules) avant d'effectuer la comparaison. Dans ce cas, quelle que soit l'option en entête de module, la comparaison sera de type Text, comme si on avait mis Option Compare Text en entête de module.

Nom : 2019-10-21_173946.png
Affichages : 35
Taille : 14,0 Ko

Les fonctions VBA de manipulation de chaines de caractères offrent une alternative intéressante qui permet de se passer de l'option en début de module. En effet, elles permettent d'utiliser un argument qui spécifie comment la (les) chaines doivent être considérées.

InStr(), par exemple, reçoit l'argument optionnel Compare

Nom : 2019-10-21_175740.png
Affichages : 36
Taille : 7,0 Ko

Si je souhaite forcer la comparaison textuelle quelle que soit l'option de compilation en début de module, je peux valoriser cet argument.

Nom : 2019-10-21_181403.png
Affichages : 35
Taille : 11,9 Ko

Nom : 2019-10-21_181304.png
Affichages : 35
Taille : 13,3 Ko


Il en va de même pour la fonction strComp qui compare deux chaines de caractères. Elle renvoie 0 si les chaines sont identiques , -1 si la première chaine est inférieure à la seconde et 1 si la première est supérieure à la seconde (dans l'ordre alphabétique). Là encore, on peut utiliser un argument pour préciser si la comparaison est textuelle ou binaire.

Nom : 2019-10-21_203647.png
Affichages : 36
Taille : 2,5 Ko


On voit donc que ces fonctions permettent de se détacher de Option Compare placée en début de module. On préfèrera dès lors utiliser ces fonctions qui permettent un type de comparaison explicite plutôt que "de laisser la main" aux options de module.


Attention, toutefois, car les infobulles d'aide sont trompeuses
. Elles laissent sous-entendre que la valeur par défaut est BinaryCompare
Nom : 2019-10-21_204033.png
Affichages : 34
Taille : 6,2 Ko

Or, c'est FAUX! Sans préciser l'option de comparaison, ce n'est pas BinaryCompare qui est utilisé, mais l'option précisée au début du module. Dans l'illustration suivante, strComp renvoie 0 alors que le troisième argument est omis. L'option du module Option Compare Text est donc l'option prise par la fonction, a contrario de ce que l'infobulle renseigne.
Nom : 2019-10-21_204057.png
Affichages : 34
Taille : 6,9 Ko

Il conviendra donc, lors de l'utilisation de ces fonctions, de toujours préciser la comparaison souhaitée.

Bon travail en VBA...

Envoyer le billet « VBA: Option Compare, à quoi ça sert? » dans le blog Viadeo Envoyer le billet « VBA: Option Compare, à quoi ça sert? » dans le blog Twitter Envoyer le billet « VBA: Option Compare, à quoi ça sert? » dans le blog Google Envoyer le billet « VBA: Option Compare, à quoi ça sert? » dans le blog Facebook Envoyer le billet « VBA: Option Compare, à quoi ça sert? » dans le blog Digg Envoyer le billet « VBA: Option Compare, à quoi ça sert? » dans le blog Delicious Envoyer le billet « VBA: Option Compare, à quoi ça sert? » dans le blog MySpace Envoyer le billet « VBA: Option Compare, à quoi ça sert? » dans le blog Yahoo

Mis à jour 22/10/2019 à 20h04 par Pierre Fauconnier

Catégories
VBA , MS Office

Commentaires