Cursus
Si vous avez déjà écrit plus de quelques macros VBA, vous avez sans doute eu besoin de vérifier si un texte existe dans une cellule. En VBA, InStr est l’une de ces fonctions que l’on finit par utiliser partout. Elle indique où un morceau de texte apparaît dans un autre. Vous pouvez l’utiliser pour vérifier si un texte existe dans une cellule, analyser des valeurs dans une chaîne ou piloter la logique conditionnelle de macros qui dépendent de motifs textuels.
Dans ce guide, je vous présente la syntaxe d’InStr, quelques exemples, le fonctionnement des modes de comparaison (ce point piège plus de monde qu’il ne devrait) et des schémas que vous réutiliserez réellement.
Je vous recommande de commencer par notre parcours de compétences Excel Fundamentals pour consolider vos bases avant de passer au VBA, ou de suivre notre cours Advanced Excel Functions si vous avez déjà un peu d’expérience, afin de voir comment les fonctions boostent l’efficacité de vos analyses.
Qu’est-ce que la fonction VBA InStr ?
InStr est une fonction VBA qui renvoie la position de la première occurrence d’une chaîne au sein d’une autre.
Les résultats se comportent comme suit :
- Si elle trouve un match, elle renvoie un nombre (la position où commence la correspondance)
- Si rien n’est trouvé, elle renvoie 0
Par exemple, si « cat » apparaît à la position 5 dans une chaîne, vous obtenez 5. S’il n’y est pas, vous obtenez 0.
Syntaxe d’InStr en VBA
Voici la syntaxe complète d’InStr :
InStr([start], string1, string2, [compare])
Où :
-
start(optionnel) : indique à VBA où commencer la recherche. Si vous l’omettez, VBA commence à la position 1. -
string1(obligatoire) : le texte complet dans lequel vous recherchez. -
string2(obligatoire) : le texte à trouver. -
compare(optionnel) : définit le mode de comparaison (sensible à la casse ou non). Si vous le laissez vide, VBA utilise le mode par défaut, généralement sensible à la casse.
Notez que vous pouvez ignorer les arguments start et compare (InStr(string1, string2)) pour une version plus simple. Mais si vous décidez d’utiliser l’argument compare, vous devez également fournir l’argument start.
Comment fonctionne InStr en VBA
Pensez à InStr comme à une lecture d’une phrase de gauche à droite, caractère par caractère.
La fonction part de string1, la parcourt et cherche le premier endroit où string2 correspond. Dès qu’elle trouve une correspondance, elle s’arrête et renvoie la position où elle a commencé.
La position du « match » est importante, car VBA compte à partir de 1, pas de 0. Le premier caractère d’une chaîne est donc en position 1, le second en 2, etc.
Valeurs de retour d’InStr expliquées
Interpréter le résultat d’InStr est simple. Vous obtiendrez l’un des cas suivants :
-
Nombre positif : s’il y a une correspondance, le nombre indique où elle commence.
-
0: s’il n’y a aucune correspondance dans la chaîne
Toutefois, si vos chaînes d’entrée valent Null, la fonction renvoie Null. Vous pouvez l’ignorer pour des macros basiques, mais gardez en tête que cette différence peut faire échouer une condition sans bruit.
Exemples simples avec VBA InStr
Voyons maintenant quelques exemples d’utilisation de la fonction VBA InStr.
Trouver un mot dans une phrase
Pour vérifier si le mot « before » est présent dans la note « Deliver before noon ».
Sub Before()
Dim result As Integer
result = InStr("Deliver before noon", "before")
MsgBox result
End Sub
Le résultat du code ci-dessus est 9 car « before » commence au 9e caractère.
Vérifier si un caractère existe
Pour vérifier si le caractère « 0 » existe dans une chaîne donnée, utilisez :
Sub ChExist()
Dim result As Integer
result = InStr(“A1023”, “0”)
MsgBox result
End Sub
Dans ce cas, tout résultat supérieur à 0 signifie que le caractère a été trouvé.
Rechercher depuis le début d’une chaîne
Pour rechercher depuis le début d’une chaîne, vous n’avez pas besoin d’indiquer la position de départ : cela commence donc à 1. C’est le comportement par défaut tant que vous n’en décidez pas autrement.
Sub ChExist()
Dim result As Integer
result = InStr("Report_2026_Final", "2026")
MsgBox result
End Sub
Utiliser VBA InStr dans des instructions If
Dans un fichier réel, vous ne cherchez pas qu’un nombre ; vous devez prendre une décision. La manière la plus courante d’utiliser InStr est dans une instruction If pour filtrer des données.
Tout au long de ce tutoriel, nous utiliserons un jeu de données d’exemple, Orders, avec les colonnes : ID, CustomerName, Email, City et OrderNotes.
If InStr(...) > 0 Then
Comme InStr renvoie 0 lorsqu’aucune correspondance n’est trouvée, on vérifie l’existence du résultat lorsqu’il est supérieur à 0.
Dans l’exemple ci-dessous, on parcourt la colonne OrderNotes (colonne 5). Si le mot « Fragile » est trouvé, on écrit « Handle Carefully » en colonne 6.
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
' Check if the order notes mention "Fragile"
If InStr(Cells(i, 5).Value, "Fragile") > 0 Then
Cells(i, 6).Value = "Handle Carefully"
End If
Next i
End Sub
Tests conditionnels par mots-clés et filtrage textuel
Vous pouvez également utiliser InStr pour rechercher des mots-clés dans des chaînes, surtout lorsque la formulation varie légèrement. Par exemple, le code ci-dessous vérifie si la note contient « Call » (comme « Call on arrival » ou « Call before delivery »). Il identifie ensuite la ligne et ajoute l’étiquette « Call Customer » en colonne 6.
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
' Check if the order notes mention “Call”
If InStr(Cells(i, 5).Value, “Call”) > 0 Then
Cells(i, 6).Value = “Call Customer”
End If
Next i
End Sub
Sensibilité à la casse et modes de comparaison d’InStr
Par défaut, InStr est sensible à la casse (appelé vbBinaryCompare). Si vous recherchez « chicago » mais que la donnée est « Chicago », InStr renverra 0.
Pour corriger cela, utilisez l’argument compare :
-
vbBinaryCompare(par défaut) : sensible à la casse (« A » est différent de « a ») -
vbTextCompare: insensible à la casse (« A » est identique à « a »)
Dans l’exemple ci-dessous, InStr renvoie 0 car il cherche « fragile » (minuscule) dans « Fragile items ».
Sub CheckFragile()
Dim result As Integer
result = InStr(1, "Fragile items", "fragile", vbBinaryCompare)
MsgBox result
End Sub
En revanche, avec vbTextCompare, la même recherche ignore la casse et renvoie 1.
Sub CheckFragile()
Dim result As Integer
result = InStr(1, "Fragile items", "fragile", vbTextCompare)
MsgBox result
End Sub
VBA InStr avec une position de départ
Parfois, vous ne souhaitez pas démarrer la recherche au début de la chaîne. L’argument start indique à VBA où commencer.
Dans l’exemple ci-dessous, l’argument start vaut 10 : VBA commence donc à partir du 10e caractère au lieu du premier. Il trouve ensuite "delivery" plus loin dans la chaîne.
Sub CheckUrgent()
Dim result As Integer
result = InStr(10, “Deliver before noon - urgent delivery”, “delivery”)
MsgBox result
End Sub
Le résultat de cet exemple est 31, la position où commence "delivery".
Cette méthode est utile lorsque vous voulez la deuxième occurrence d’un élément, ou ignorer un préfixe connu dans des motifs récurrents.
VBA InStr vs InStrRev
Comme vous l’avez vu, InStr recherche de gauche à droite. InStrRev, lui, recherche de droite à gauche.
Par exemple, nous avons utilisé InStrRev pour trouver le dernier point d’un e-mail. Le résultat est 18, la position du point avant « com ».
Sub CheckChr()
Dim result As Integer
result = InStrRev("john.jacobs@email.com", ".")
MsgBox result
End Sub
InStrRev est particulièrement utile lorsque vous avez besoin de la dernière occurrence d’un élément ou lorsque vous travaillez avec des noms de fichiers, des e-mails ou des chemins.
Cas d’usage courants d’InStr
Maintenant que nous avons vu comment fonctionne InStr en VBA, voyons des cas d’usage fréquents.
Vérifier si une cellule contient un mot-clé
Supposons que vous avez un jeu de données de commandes clients et que vous deviez signaler des commandes à traiter spécifiquement. Le code parcourt la colonne OrderNotes et signale toute note contenant « noon ».
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
If InStr(1, "Deliver before noon", "noon", vbTextCompare) > 0 Then
' Logic to mark as "Morning Delivery"
End If
Next i
End Sub
Valider un texte au format e-mail
Vous pouvez aussi utiliser InStr pour une vérification rapide des formats d’e-mail. Par exemple, le code ci-dessous vérifie si l’e-mail contient @ et écrit « Valid Email Format » en colonne 6.
Sub ValidateEmail()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
If InStr(Cells(i, 3).Value, "@") > 0 Then
Cells(i, 6).Value = "Valid Email Format"
End If
Next i
End Sub
Détecter des séparateurs comme virgules ou tirets
Vous pouvez utiliser InStr pour vérifier la présence d’un tiret, d’une virgule ou d’un slash dans un texte. Dans l’exemple ci-dessous, le code parcourt OrderNotes (colonne E), cherche s’il y a une virgule, puis écrit un résultat en colonne F.
Sub ValidateEmail()
Dim i As Integer
Dim commaPos As Integer
Dim OrderNotes As String
For i = 2 To 51
OrderNotes = Cells(i, 5).Value
commaPos = InStr(1, OrderNotes, ",")
' If a comma exists, mark it
If commaPos > 0 Then
Cells(i, 6).Value = "Has comma"
Else
Cells(i, 6).Value = "No comma"
End If
Next i
End Sub
Erreurs courantes avec VBA InStr
Même avec de l’expérience, vous pouvez rencontrer des problèmes avec InStr qui rendent votre code surprenant. Voici les pièges les plus fréquents que j’ai rencontrés et comment les éviter :
-
Oublier qu’InStr est indexé à partir de 1 : rappelez-vous que les positions commencent à 1, pas à 0. Si vous venez de Python ou JavaScript, cela peut dérouter au début.
-
Considérer InStr comme True/False : souvenez-vous qu’
InStrne renvoie pasTrueouFalse. Pour savoir si quelque chose est trouvé, testez si le résultat est> 0. -
Ignorer la sensibilité à la casse : par défaut,
InStrest sensible à la casse. Si la casse n’a pas d’importance, précisez-le avecvbTextComparedans l’argumentcompare. -
Inverser string1 et string2 : rappelez-vous que le premier argument est l’endroit où vous cherchez. Le second est ce que vous cherchez. Si vous écrivez
InStr(SearchTerm, FullText), vous obtiendrez toujours0.
VBA InStr vs autres fonctions de chaîne VBA
Puisqu’InStr sert généralement à localiser un texte dans une chaîne, comparons-la à d’autres fonctions de chaînes.
InStr vs Like
L’opérateur Like sert aux correspondances par motif. Par exemple, le code ci-dessous cherche « Fragile », mais utilise le motif *, qui signifie « n’importe quoi avant ou après ».
Sub ChExist()
Dim i As Integer
' Loop through rows 2 to 51
For i = 2 To 51
If Cells(i, 5).Value Like "*Fragile*" Then
Cells(i, 6).Value = "Handle Carefully"
End If
Next i
End Sub
Utilisez InStr si vous voulez simplement savoir si un texte existe, et Like lorsque vous devez vérifier des motifs plus complexes.
InStr vs Replace
Même si vous pouvez utiliser InStr pour modifier la valeur entière d’une cellule, la fonction Replace remplace un texte précis dans la cellule.
Dans l’exemple ci-dessous, Replace remplace directement « Fragile » par « Handle Carefully » dans le texte.
Sub ReplaceOrder()
Dim i As Integer
For i = 2 To 51
Cells(i, 5).Value = Replace(Cells(i, 5).Value, "Fragile", "Handle Carefully")
Next i
End Sub
InStr vs Mid
La fonction Mid sert à extraire du texte d’une chaîne. Vous combinerez donc souvent Mid avec InStr pour extraire le texte après en avoir trouvé la position.
Le code ci-dessous extrait le domaine des e-mails du jeu de données. La fonction InStr trouve où « @ » apparaît dans l’e-mail, puis Mid commence l’extraction juste après. Le domaine est ensuite écrit en colonne H.
Sub ExtractDomain()
Dim i As Integer
Dim pos As Integer
Dim domain As String
For i = 2 To 51
pos = InStr(1, Cells(i, 3).Value, "@")
If pos > 0 Then
domain = Mid(Cells(i, 3).Value, pos + 1)
Cells(i, 8).Value = domain
End If
Next i
End Sub
InStr vs Split
La fonction Split sert à découper un texte en parties selon un séparateur.
Dans l’exemple ci-dessous, le code lit chaque ligne de la colonne A, vérifie s’il y a une virgule, puis sépare le texte en deux parties. Il écrit Name → colonne B et City → colonne C.
Sub SplitTextColumn()
Dim i As Integer
Dim lastRow As Integer
Dim parts As Variant
Dim text As String
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
text = Cells(i, 1).Value
' Only split if a comma exists
If InStr(1, text, ",") > 0 Then
parts = Split(text, ",")
Cells(i, 2).Value = parts(0) ' Name
Cells(i, 3).Value = parts(1) ' City
End If
Next i
End Sub
Bonnes pratiques pour utiliser VBA InStr
Pour éviter les erreurs dans votre VBA, voici quelques bonnes pratiques qui m’ont fait gagner du temps :
-
Utilisez vbTextCompare quand la casse n’a pas d’importance : comme la casse est rarement cohérente dans les données réelles, vous risquez de manquer des correspondances avec le mode par défaut.
-
Combinez avec « If » pour une logique claire : incluez toujours une logique qui renvoie une valeur, car
InStrseul ne vous donne qu’un nombre. -
Testez > 0, pas des positions exactes, sauf si vous avez réellement besoin de la position.
-
Gardez un parsing lisible : évitez d’empiler trop de fonctions sur une seule ligne.
Conclusion
InStr est simple, mais vous l’utiliserez partout. Elle vous donne la position d’une chaîne dans une autre, et ce simple nombre alimente de nombreuses décisions en VBA : savoir si quelque chose existe, où extraire et quoi faire ensuite. Seule, c’est une recherche. Combinée à des fonctions comme Mid, Replace ou Split, elle devient un maillon d’un workflow efficace.
Suivez notre cours Data Analysis in Excel pour maîtriser l’analytique avancée. Suivez aussi notre cours Intermediate Power Query in Excel pour apprendre la transformation de données et le langage M.
FAQs
Que renvoie concrètement InStr ?
Elle renvoie la position où commence la correspondance. Si rien n’est trouvé, elle renvoie 0.
InStr est‑elle sensible à la casse ?
Oui, par défaut InStr est sensible à la casse. ”Fragile” et ”fragile” sont traités différemment. Utilisez vbTextCompare si vous ne souhaitez pas une comparaison sensible à la casse.
Que signifie le fait qu’InStr commence à 1 ?
Le premier caractère d’une chaîne est en position 1, pas 0. Cela compte lorsque vous utilisez le résultat dans d’autres fonctions.
Que se passe‑t‑il si l’une des valeurs est Null ?
Le résultat sera également Null, et non 0.
Quelle est la différence entre InStr et InStrRev ?
InStr recherche de gauche à droite, tandis que InStrRev recherche de droite à gauche. Utilisez la seconde lorsque la dernière occurrence est déterminante.
