Vérifiez si une chaîne contient une autre chaîne

233

Je veux savoir si une chaîne contient un "," (virgule). Avons-nous une autre option que la lecture caractère par caractère?

krishna
la source
14
Ça INSTRmarche pour vous?
Stephen Quan

Réponses:

386

Utilisez la fonction Instr

Dim pos As Integer

pos = InStr("find the comma, in the string", ",")

renverra 15 en pos

S'il n'est pas trouvé, il retournera 0

Si vous devez trouver la virgule avec une formule Excel, vous pouvez utiliser le =FIND(",";A1) fonction.

Notez que si vous voulez utiliser Instrpour trouver la position d'une chaîne insensible à la casse, utilisez le troisième paramètre de Instr et donnez-lui la const vbTextCompare(ou juste 1 pour les inconditionnels).

Dim posOf_A As Integer

posOf_A = InStr(1, "find the comma, in the string", "A", vbTextCompare)

vous donnera une valeur de 14.

Notez que vous devez spécifier la position de départ dans ce cas comme indiqué dans la spécification que j'ai liée: L'argument de début est requis si la comparaison est spécifiée.

rene
la source
4
Mais que faire si la chaîne trouvée est en position 0? Comment faites-vous la distinction entre "trouvé sur l'index 0" et "non trouvé (0)"?
gEdringer
10
@gEdringer. Lorsque la chaîne à trouver est au début, elle renvoie 1.
rene
69

Vous pouvez également utiliser le mot spécial like:

Public Sub Search()
  If "My Big String with, in the middle" Like "*,*" Then
    Debug.Print ("Found ','")
  End If
End Sub
Makah
la source
3
Lien vers le format de motif msdn.microsoft.com/en-us/library/…
Matthew Lock
23

Il y a aussi la fonction InStrRev qui fait le même type de chose, mais commence la recherche de la fin du texte au début.

La réponse de Per @ rene ...

Dim pos As Integer
pos = InStrRev("find the comma, in the string", ",")

... retournerait toujours 15 à pos, mais si la chaîne a plus d'une chaîne de recherche, comme le mot "the", alors:

Dim pos As Integer
pos = InStrRev("find the comma, in the string", "the")

... retournerait 20 en pos, au lieu de 6.

LimaNightHawk
la source
17

En vous basant sur la réponse de René, vous pouvez également écrire une fonction qui retourne soit TRUE si la sous-chaîne était présente, soit FALSE si elle ne l'était pas:

Public Function Contains(strBaseString As String, strSearchTerm As String) As Boolean
'Purpose: Returns TRUE if one string exists within another
On Error GoTo ErrorMessage
    Contains = InStr(strBaseString, strSearchTerm)
Exit Function
ErrorMessage:
MsgBox "The database has generated an error. Please contact the database administrator, quoting the following error message: '" & Err.Description & "'", vbCritical, "Database Error"
End
End Function
Barbe sinistre
la source
3
Quel genre d'erreur de base de données attendons-nous dans cette fonction? Le piégeage d'erreur et le message d'erreur semblent être totalement inutiles.
Roobie Nuby du
11
@RoobieNuby C'est juste ma gestion des erreurs par défaut. Je le mets dans toutes mes fonctions parce que si quelque chose ne va pas, je veux que le personnel m'appelle, pas pour essayer de le réparer lui-même.
Sinister Beard