
L’opérateur logique LIKE est un opérateur d’égalité strictement réservé aux chaines de type texte. Sa particularité est de pouvoir comparer des valeurs à un masque composé de caractères de substitution.
Glossaire
Dans cet article : Masque, caractères de substitution, masque de comparaison, règles désigne la deuxième partie du Like.
Comme le = mais plus flexible
Il s’utilise comme n’importe quel opérateur logique soit :
[Expression à comparer] Like [masque de comparaison]
Retourne un True, False ou Null.
'En VBA If ExpressionAcomparer Like ExpressionLike then 'Expression =iif(ExpressionAcomparer Like ExpressionLike;True;False) 'SQL ... WHERE ExpressionAcomparer Like ExpressionLike ...
La syntaxe est identique en SQL (*), VBA ou dans les expressions.
(*) Les moteurs de base de données utilisent plutôt les jockers ANSI.
* devient % et ? devient _.
Les jokers
Les jokers sont des caractères de substitution permettant de composer le masque de comparaison. Ils sont combinables.
L’astérisque *
L’astérisque * remplace plusieurs caractères alphanumériques et spéciaux.
| Expression | Description |
| « abcde45é# » like « abc* » | Toute chaine commençant par abc |
| « 01è+abc » like « *abc » | Toute chaine finissant par abc |
| « 01abc_ç » like « *abc* » | Toute chaine contenant abc |
| « ab(6ç1c » like « ab*c » | Toute chaine commençant pas ab et finissant par c |
Le point d’interrogation ?
Le point d’interrogation ? remplace un seul caractère quel qu’il soit : lettre, chiffre, caractère spécial.
| Expression | Description |
| « A » Like « ? » | Toute chaine contenant 1 caractère |
| « abcD » like « abc? » | Toute chaine commençant par abc avec 1 caractère à la fin. |
| « 0adc » like « ?abc » | Toute chaine commençant par 1 caractère et finissant par abc. |
| « 0abc) » like « ?abc? » | Toute chaine contenant abc avec 1 caractère de part et d’autre. |
| « x4z » like « ??? » | Toute chaine contenant 3 caractères contigus. |
Comme le point d’interrogation remplace 1 caractère on peut en utiliser plusieurs à la suite dans un masque de comparaison.
Le dièse #
Le caractère dièse # fonctionne comme le point d’interrogation mais remplace un chiffre, donc ni lettre, ni un caractère spécial.
| Expression | Description |
| « 1 » like « # » | un chiffre de 0 à 9 identique à [0-9] |
| « 100.99 » like « ###.## » | 3 chiffres et 1 point et 2 chiffres |
| « +100.99 » like « [!-]###.## » » | |
| « A25X17 » like « [A-C]##[!W]## » | A, B ou C, 2 chiffres, pas de W, 2 chiffres |
Les crochets [ ]
Les crochets permettent de remplacer un caractère situé dans une plage particulière. Il a aussi comme fonction de pouvoir utiliser les caractères de substitutions en tant que caractères numériques.
| Expression | Description |
| « B » Like « [A -C] » | Le tiret détermine une plage de caractères contigus entre 2 bornes. Ici A, B ou C. |
| « C » Like « [A,C,E] » | La virgule, détermine une série de caractères. Ici A, C ou E. |
| « ANZ » Like « A[M-O][W,Z] » | La combinaison des 2. Ici A, M ou N ou O et W ou Z. |
| « B2 » Like « [A-C][!1] » | A, B, C mais pas 1. |
| « Cbc3 » Like « [A-D]bc[!0] » | A à D puis bc puis <>0 « abc2 » vrai ! « add2 » faux ! (pas de bc) « abc0 » faux ! (0 à la fin) |
| « rL5 » Like « [a-z][A-Z][0-9] » | Uniquement en VBA avec un Option Compare Binary ! La réponse doit contenir 3 digits. 1 lettre en minuscule, 1 en majuscule, un chiffre. « aB1 » vrai ! « AX9 » faux ! A est en majuscule. « aAd » faux ! pas de chiffre à la fin. « aB123 » faux ! 2 et 3 en trop. « abR5 » faux ! a ou b en trop. |
| « BMW10 » Like « [A-C]M[S-Z]10 » | A,B ou C et M et X,S à Z et 10 |
| « ‘bonjour' » Like « [« »,’]*[« »,’] » | On teste si la chaine est entourée de » ou ‘. (*) |
(*) Ceci n’est que pour l’exemple, cette comparaison n’est pas du tout robuste.
Crochets avec des caractères spéciaux
Avec des caractères spéciaux la musique est la même. Seules les paroles changent.
| Expression | Description |
| « Ä » like « [À-Æ] » | du 0192 au 0198 |
| « ) » like « [!-/] » | du 0033 au 0047 |
Ce qui ne fonctionne pas avec les crochets
Les combinaisons ne fonctionnent pas. Il faut obligatoirement séparer vos règles. Ici quelques exemples.
| Expression FAUSSE | Description | Expression VRAI |
| « [Z-A] » | Toujours respecter l’ordre de tri. | « [A-Z] » |
| « [8-5] » | Toujours respecter l’ordre de tri. | « [5-8] » |
| « [A-C,!1] » | Pas d’assemblage | « [A-C][!1] » |
| « [a-z,A-Z,0-9] » | Pas d’assemblage | « [a-z][A-Z][0-9] » |
| « [a-z!] » | La négation toujours au début | « [!a-z] |
Attention ! Les plages de caractères doivent toujours être placées dans l’ordre croissant. Par exemple [A-C] est valide alors que [C-A] ne l’est pas, de même que [0-9] est valide et [9-0] ne l’est pas. Pour déterminer l’ordre des caractères, consultez la table ASCII et réalisez des tests.
La négation
On peut utiliser 2 types de négation avec l’opérateur Like.
Le Not habituel qui englobe l’ensemble de la comparaison, comme dans l’exemple suivant
| Expression | Description |
| Not « abc » Like « a?c » | Ne correspond pas |
| Not « abc » Like « a*c » | Ne correspond pas |
Le ! point d’exclamation dans les crochets du masque de comparaison. Dans ce cas on obtient plus de finesse dans la comparaison.
| Expression | Description |
| « abc » Like « [!a]bc » | Faux ! le premier caractère ne doit pas être « a ». |
| « 1bc » Like « [!a-z]bc » | Vrai ! le premier caractère n’est pas un caractère compris entre a et z. |
Rechercher les caractères génériques
On peut être emmené à rechercher l’un des caractères de substitution dans une chaîne. Quelques exemples dans le tableau suivant.
| Expression | Description |
| « Es-tu là ? » Like « Es-tu là [?] » | Le point d’interrogation à la fin d’une phrase. |
| « Es-tu là ! » Like « Es-tu là ? » | Un caractère à la fin. ? ou autre. |
| « 45 » like « []## » | Pas d’espace en début de chaine. |
« AB » Like « A[]B » | Pas d’espace entre A et B « A B » est faux ! |
| « [Vrai] » Like « [[]Vrai] » | Commence par le crochet ouvrant [. Le crochet fermant ] n’a pas besoin d’être isolé. |
| « #N/A » Like « [#]N/A » | Une chaîne commençant par le caractère #. |
| « » »abc » » » Like « » »??? » » » | Une chaine commençant par » et finissant par « . |
| « AOC « Médoc » 33″ like « AOC « »* » » ## » | AOC « une chaine » 33 |
| « » »abc » » » Like chr(34) & « abc » & chr(34) | On peut aussi utiliser ce genre de notation où on utilise chr(34) pour retourner le « . |
Avec d’autres types de données
Le LIKE peut fonctionner avec d’autres types de données mais les valeurs testées seront transformées en texte pour leur évaluation.
Par exemple avec des dates on peut rechercher des séries.
| Expression | Description | Equivalent VBA |
| date() Like « ##/##/2032 » | nous somme en 2032 | Year(date)=2009 |
| date() Like « ##/1#/2032 » | Nous sommes au 4e trimestre 2032 | Format(Date, »q »)=4 (*) |
| date() Like « 10/##/#### » | Nous somme le 10 | Day(date)=10 |
(*) Dans les expressions la virgule doit être remplacée par un point virgule.
Format(Date; »q »)
On peut trouver certains intérêts à utiliser un LIKE plutôt qu’une expression plus académique, mais attention aux résultats qui peuvent être surprenants et loin de vos attentes. Un Like n’est pas forcément plus performant par rapport aux fonctions prévues.
(*) t en SQL, q en VBA. On peut également utiliser la fonction DatePart().
Quelques tests dans la fenêtre d’exécution de VBE
Vous pouvez vous entrainer dans la fenêtre d’exécution pour concevoir vos masques.
? "ceci#est [la preuve] par 9 ?" LIKE "ceci[#]*[[]la preuve[]]*[0,9]?[?]" Vrai
La casse
Vous avez pu remarquer que Like n’est pas sensible à la casse lors de la comparaison.
Il y a cependant un moyen d’en tenir compte. Pour cela il faut modifier le paramètre Option Compare situé dans l’en-tête du module VBA qui contient l’instruction.
Option Compare Database Option Explicit
| Option | Description |
| Option Compare Database | Ne tient pas compte de la casse « AAA » est égal à « aaa » |
| Option Compare Binary | Tient compte de la casse « AAA » est différent de « aaa » |
Pour une prise en charge de la casse dans vos requêtes vous avez d’autres solutions :
- Changer de moteur de base de données. Ms Sql server, Mariadb, PostgreSQL, Oracle prennent en charge la casse.
- Créer votre propre fonction VBA que vous appellerez depuis vos requêtes. Voir l’exemple ci-dessous.
Mettez cette fonction dans un module Standard.
Option Compare Binary 'respect de la casse
Option Explicit
Public Function isLike(value As Variant, masque As Variant) As Variant
'Fabrice Constans (C2ED)
'Tient compte d'un passage de Null et de son retour.
'Appel de la fonction dans tous les composants d'Access
'VBA : If isLike(date() ,"##/##/2032") then
'Expression : =Iif(isLike(date() ;"##/##/2032");"Vrai";"False")
'SQL : SELECT madate FROM matable WHERE isLike(madate ,"##/##/2032");
isLike = value Like masque
End Function
Attention à la valeur Null !
Le Null est retourné lorsque au moins l’une des expressions vaut Null.
| Expression | Description |
| Null Like « * » | La valeur à comparer vaut Null |
| « abc » Like Null | Le masque de comparaison vaut Null |
| Null Like Null | Les 2 côté de la comparaison valent Null |
? Null Like "*" Null ? "giraphe sophie" Like Null Null ? Null Like null Null
Conclusion
En conclusion voici un opérateur bien utile qui rempli 90% des demandes en toutes circonstances. Il pêche cependant par le manque de prise en compte de la casse avec le moteur de base de données interne d’Access, ACE et dans les expressions des formulaires, état et macros. Ceci peut être rapidement contourné avec la petite fonction isLike() indiquée dans cet article.
Pour des besoins plus poussés n’hésitez pas à utiliser RegEx. Si le moteur ACE ne le prend pas en charge la plupart des autres moteurs de base de données ont intégré RegEx dans leur SQL.






