Astuce VBA : la fonction InStr

La fonction InStr vérifie si une chaîne de caractères contient une valeur définie et renvoie la position de la première valeur trouvée (ou 0 si la valeur n'a pas été trouvée dans la chaîne).

Utilisation :

InStr(départ, texte, valeur_à_rechercher)

ou

InStr(départ, texte, valeur_à_rechercher, casse)


Rechercher la position

Recherche de la position de la valeur GA dans la chaîne :

Sub exemple()
   
    ma_chaine = "6397-GA12-D3-FR-GA15"
   
    'Première position de "GA"
    MsgBox InStr(1, ma_chaine, "GA") 'Renvoie : 6

End Sub

Pour rechercher la position de la seconde valeur GA modifiez l'argument "départ" pour démarrer la recherche plus loin dans la chaîne :

Sub exemple()
   
    ma_chaine = "6397-GA12-D3-FR-GA15"
   
    'Première position de "GA"
    premiere = InStr(1, ma_chaine, "GA") 'Résultat : 6
   
    'Seconde position de "GA"
    MsgBox InStr(premiere + 1, ma_chaine, "GA") 'Renvoie : 17

End Sub

Lorsqu'il y a plusieurs positions à relever, il est possible de créer une boucle et de quitter celle-ci lorsque InStr renvoie 0 (= plus de résultat) :

Sub exemple()
   
    ma_chaine = "6397-GA12-D3-FR-GA15-XT-54PGA-GAO-4-TE-6GA9"
   
    positions = "" 'Pour enregistrer la liste des résultats
    separateur = "" 'Séparateur pour la liste des résultats (vide pour la première position)
    derniere_pos = 1 'Dernière position (pour le premier argument de InStr)
   
    Do
        pos = InStr(derniere_pos, ma_chaine, "GA")
       
        If pos Then 'Si pas égal à 0
            positions = positions & separateur & pos
            separateur = "-"
            derniere_pos = pos + 1
        End If
   
    Loop While pos > 0
   
    'Résultat
    MsgBox positions

End Sub

Ce qui donne :

excel-vba-instr - instr

Rechercher si une chaîne contient une valeur

Il n'est pas toujours utile de connaître la position de la valeur, il faut parfois seulement vérifier si oui ou non la chaîne contient la valeur recherchée.

Dans ce cas, c'est encore plus simple :

Sub exemple()
   
    ma_chaine = "6397-GA12-D3-FR-GA15"
   
    If InStr(1, ma_chaine, "GA") Then 'Si une position est trouvée
        MsgBox "Oui !"
    Else
        MsgBox "Non ..."
    End If
   
End Sub

En bonus, la version raccourcie avec la fonction IIf :

Sub exemple()
   
    ma_chaine = "6397-GA12-D3-FR-GA15"
   
    MsgBox IIf(InStr(1, ma_chaine, "GA"), "Oui !", "Non ...")
   
End Sub
Le 4e argument (facultatif) permet de définir s'il faut tenir compte ou non de la casse (par défaut, la fonction fait la différence entre majuscules et minuscules). Pour ne pas faire de distinction, entrez simplement 1.