La fonction VBA InStr() permet de tester si un texte contient une chaîne de caractères spécifiée et si oui, elle permet de savoir où cette chaîne se trouve exactement dans le texte de départ.
Il s'agit donc d'une fonction très pratique, voir indispensable si vous travaillez avec des textes en VBA (ou en Excel).
Syntaxe de la fonction VBA InStr()
La fonction a 4 paramètres dont 2 sont obligatoires et 2 sont facultatifs.
x = InStr(DebutDeRecherche, LeTextePrincipal, LaChaineRecherchee, TypeDeComparaison)
Dans l'éditeur VBA (VBE), les paramètres de la fonction InStr() ont les noms anglais suivants:
x = InStr(Start, String1, String2, Compare)
Le détail des paramètres de la fonction InStr()
DebutDeRecherche
("Start"): le numéro (de typeInteger
) du caractère à partir duquel la recherche doit se faire. Pour une recherche simple (par exemple vérification si le texte contient un autre texte), la valeur sera1
ce qui signifie que la recherche se fait dans tout le texte. Ce paramètre est facultatif. Si vous le omettez, la recherche se fera dans tout le texte.LeTextePrincipal
("String1"): ceci est le texte dans lequel la recherche se fait. Ce paramètre est obligatoire.LaChaineRecherchee
("String2"): ceci est le texte (la chaîne de caractères) que l'on essaie de trouver dansLeTextePrincipal
. Ce paramètre est également obligatoire.TypeDeComparaison
("Compare"): paramètre technique pour choisir entre recherche Textuelle et Binaire. En gros, ce paramètre détermine si la recherche doit ou pas sensible aux minuscules/majuscules. Il est facultatif et peut contenir une de ces deux valeurs:vbBinaryCompare
(ou sa représentation numérique = 0) – avec cette valeur, la recherche EST sensible aux majuscules et minuscules. Ceci est la valeur par défaut.vbTextCompare
(ou sa représentation numérique = 1) – avec cette valeur, la recherche N'EST PAS sensible aux majuscules et minuscules.
L'illustration pratique de toutes les possibilités se trouve plus bas, dans la section "Exemples d'utilisation de la fonction InStr()".
Valeurs possibles du résultat de la fonction InStr()
Selon le contenu des deux textes (chaînes de caractères) à comparer, plusieurs types de résultats de la fonction InStr() sont possibles. En voici la liste…
- Si
LeTextePrincipal
("String1") est vide, la fonction retournera comme résultat 0 - Si
LaChaineRecherchee
("String2") est vide, la fonction retournera comme résultat la valeur deDebutDeRecherche
("Start") (donc habituellement "1") - Si
LaChaineRecherchee
("String2") ne se trouve pas dansLeTextePrincipal
("String1"), la fonction retournera comme résultat 0 - Si
LaChaineRecherchee
("String2″) se trouve dansLeTextePrincipal
("String1"), la fonction retournera comme résultat le numéro de la position par laquelle commenceLaChaineRecherchee
("String2")
Les exemples pratiques suivent pour montrer ces différentes possibilités…
Exemples d'utilisation de la fonction InStr()
Les exemples suivants vous permettront de vous faire une idée de différent cas qui peuvent se produire lors de l'utilisation de la fonction VBA InStr(). Chaque cas est expliqué pour faciliter la compréhension.
Exemple de fonction & résultat | Explications |
InStr(1, "Ceci est un test.", "test") = 13 | On recherche "test" dans la chaîne "Ceci est un test." Le mot "test" est trouvé et la fonction retourne comme résultat 13 ce qui correspond à l'emplacement du début du mot recherché. |
InStr(1, "Ceci est un test.", "livre") = 0 | On recherche "livre" dans "Ceci est un test.". Le mot n'est pas trouvé et la fonction retourne le résultat = 0 |
InStr(1, "test", "Ceci est un test.") = 0 | Une erreur habituelle: on inverse la chaîne recherchée et le texte dans lequel on cherche. Ici donc, on recherche "Ceci est un test." dans "test". Comme "Ceci est un test." n'est pas trouvé, la fonction retourne le résultat = 0 |
InStr(1, "réf: 123-A-126", "a", vbBinaryCompare) = 0 | On recherche "a" dans "réf: 123-A-126". Comme le type de comparaison est vbBinaryCompare (et donc sensible aux majuscules et minuscules), le "a" n'est pas trouvé. La fonction retourne le résultat = 0 |
InStr(1, "réf: 123-A-126", "a", vbTextCompare) = 10 | On recherche "a" dans "réf: 123-A-126". Comme le type de comparaison est vbTextCompare (et donc insensible aux majuscules et minuscules), le "a" est trouvé et la fonction retourne le résultat = 10 |
InStr(1, "réf: 123-A-126", "123") = 6 | On recherche "123" dans "réf: 123-A-126" – dans le texte entier. La chaîne "123" est trouvée à la position n°6. |
InStr(9, "réf: 123-A-126", "123") = 0 | On recherche "123" dans "réf: 123-A-126" à partir du 9ème caractère (= les 8 premiers caractères ne sont pas vérifiés! On vérifie seulement dans "-A-126"). La chaîne "123" n'est pas trouvée et le résultat de la fonction est donc 0. |
InStr(1, "réf: 123-A-126", "") = 1 | LaChaineRecherchee ("String2") est vide. La fonction retourne donc la valeur de DebutDeRecherche ("Start"): ici donc 1 |
InStr(1, "", "123") = 0 | LeTextePrincipal ("String1") est vide. La fonction retourne donc 0 |
Équivalent de InStr() dans Excel
La fonction InStr() a son équivalent également parmi les fonctions disponibles directement dans les Classeurs Excel. En fait, elle en a même deux. La fonction InStr() en VBA utilise 4 paramètres (comme vous avez pu voir plus haut). Dans Excel, le paramètre qui détermine si la fonction est ou n'est pas sensible aux majuscules et minuscules est omis et on se retrouve avec deux fonctions différentes:
- Fonction Excel TROUVE – tient compte des majuscules (tout comme la fonction InStr() avec l'utilisation de la comparaison binaire –
vbBinaryCompare
) - Fonction Excel CHERCHE – ne tient pas compte des majuscules et minuscules (comme InStr() utilisant la comparaison textuelle –
vbTextCompare
)
On peut se demander si Microsoft a voulu jouer sur les mots lors de la traduction des noms de fonctions (qui cherche, trouve, n'est-ce pas?) mais au moins vous voilà prévenus.
En VBA, vous trouverez également la fonction InStrRev() qui est très proche de InStr() mais présente quelques spécificités intéressantes. Tout sur la fonction VBA InStrRev().
À quoi cette fonction peut-elle bien servir?
Principalement, cette fonction sert à vérifier si un texte contient un autre texte. Déjà cette fonctionnalité nous permet par exemple de vérifier si un fichier existe (ou un dossier), vérifier les fichiers journaux (logs), vérifier les références produits,…
De plus, la position exacte du texte trouvé nous permet de "découper" un texte en parties qui nous intéressent (par exemple parser des codes HTML de pages web). Si vous trouvez une autre utilisation intéressante de la fonction InStr(), n'hésitez pas de nous en faire part dans les commentaires…
Pour aller plus loin en VBA…
Voici quelques autres articles & tutoriels qui pourraient vous être utiles, notamment si vous travaillez avec des textes dans Excel et dans VBA:
- Liste de toutes les fonctions VBA
- Extraire une chaîne délimitée en VBA
- VBA: Vérifier si un fichier existe
- Lire fichier texte en VBA
- Toutes les fonctions Excel
- Comment utiliser RECHERCHEV en VBA – mode d'emploi
- La page de la fonction InStr() sur le site de Microsoft
5 commentaires sur “InStr() – Fonction VBA (tutoriel d’utilisation)”
Débutant en vba, j'ai trouvé quelqu'un qui suggérait, pour n'autoriser que la saisie de chiffres par exemple dans une textbox:
Private Sub txtNaissance_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr("1234567890", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
Ça marche impeccable. Impossible de taper d'autres caractères. Je l'ai adapté pour les caractères. Idem
Bonjour Jean-Yves, je crois qu'il manque une partie de votre commentaire…
Correction de mon précédent commentaire.
Débutant en vba, j'ai trouvé quelqu'un qui suggérait, pour n'autoriser que la saisie de chiffres par exemple dans une textbox:
Private Sub txtNaissance_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If InStr("1234567890", Chr(KeyAscii)) = 0 Then KeyAscii = 0
End Sub
Ça marche impeccable. Impossible de taper d'autres caractères que des chiffres. Je l'ai adapté pour les caractères alphabétiques. Idem, impossible de taper des chiffres. c'est exactement le but que je recherchais.
Merci pour cette expliacation tres interessante.
Petite question: est-il possible d'utiliser une variable String en guise "String1" ?
Merci d'avance.
Bien cordialement,
Bonjour Guillaume,
aucune variable ne peut s’appeler
String
. C'est un "mot réservé" qui sert à définir le type de variable (String
,Boolean
,Single
,…) et donc vous ne pouvez pas l'utiliser comme nom de variable.C'est pour cela que j'utilise
String1
,String2
, etc.Cordialement, Martin