Vérifier si une cellule contient une sous-chaîne


229

Existe-t-il une fonction intégrée pour vérifier si une cellule contient un caractère / sous-chaîne donné?

Cela signifierait que vous pouvez appliquer des fonctions textuelles comme Left/ Right/ Midsur une base conditionnelle sans lancer d'erreurs lorsque les caractères de délimitation sont absents.

Réponses:


374

Essayez d'utiliser ceci:

=ISNUMBER(SEARCH("Some Text", A3))

Cela reviendra TRUEsi la cellule A3contient Some Text.


7
Ruse! Merci gwin003 :) Je suis toujours un peu surpris qu'il n'y ait pas de fonction plus intuitive pour cela.
geotheory

18
Oui, je suis d'accord, ce serait bien s'il y avait une CONTAINS("Text", cell)fonction.
gwin003

20
pourrait valoir la peine de noter que ce cas i est insensible, et si vous voulez faire correspondre la casse, vous devez utiliser FIND()à la place deSEARCH()
Code Jockey

7
a obtenu une erreur en utilisant ,au lieu de ;. Après avoir changé la formule fournie, =ISNUMBER(SEARCH("Some Text"; A3))cela a fonctionné. Merci!
renatov

6
@renatov qui dépend en fait des paramètres régionaux de votre système d'exploitation; en particulier, le caractère utilisé pour "séparateur de liste".
pepoluan

22

La formule suivante détermine si le texte "CHECK" apparaît dans la cellule C10. Si ce n'est pas le cas, le résultat est vide. Si c'est le cas, le résultat est le travail "CHECK".

=IF(ISERROR(FIND("CHECK",C10,1)),"","CHECK")

Vous pouvez utiliser 4 espaces ou tabulation au début de la ligne pour mettre en surbrillance le bloc de code.
NiematojakTomasz

@Steve, MERCI;)
Dimitri

12

Cette formule me semble plus intuitive:

=SUBSTITUTE(A1,"SomeText","") <> A1

cela renvoie VRAI si "SomeText" est contenu dans A1.

Les formules IsNumber / Search et IsError / Find mentionnées dans les autres réponses fonctionnent certainement, mais je me retrouve toujours à avoir besoin de consulter l'aide ou d'expérimenter dans Excel trop souvent avec celles-ci.


12

Pour ceux qui souhaitent le faire en utilisant une seule fonction à l'intérieur de l'instruction IF, j'utilise

=IF(COUNTIF(A1,"*TEXT*"),TrueValue,FalseValue)

pour voir si la sous-chaîne TEXT est dans la cellule A1

[REMARQUE: TEXT doit être entouré d'astérisques]


Cela fonctionne, mais l'utilisation de la formule COUNTIF lorsque des données volumineuses font que le fichier ne répond pas, même la taille du fichier devient énorme
Gaurravs

8

Découvrez la FIND()fonction dans Excel.

Syntaxe:

FIND( substring, string, [start_position])

Renvoie #VALUE!s'il ne trouve pas la sous-chaîne.


Oui imbriqué dans ISNUMBERcela fonctionne également, pour les correspondances sensibles à la casse uniquement.
géothèque

1

J'aime la réponse de Rink.Attendant.6. En fait, je veux vérifier plusieurs chaînes et je l'ai fait de cette façon:

Tout d'abord, la situation: les noms qui peuvent être des constructeurs de maisons ou des noms de communauté et je dois regrouper les constructeurs en un seul groupe. Pour ce faire, je recherche le mot "constructeur" ou "construction", etc. Donc -

=IF(OR(COUNTIF(A1,"*builder*"),COUNTIF(A1,"*builder*")),"Builder","Community")

Bienvenue chez SO. Vous devriez lire ce qui fait une bonne réponse .
geotheory

Je ne comprends pas ce que cela est censé faire .. il vérifie le constructeur deux fois alors qu'une fois suffit probablement. S'il trouve le constructeur, il renvoie le constructeur, sinon il renvoie la communauté. Le mot construction n'apparaît nulle part. Peut-être quelque chose comme ça =OR(COUNTIF(A1,"*builder*"),COUNTIF(A1,"*construction*"))?
Fantabolous

Il y a COUNTIFS:COUNTIFS(A1,"*builder*",A1,"*construction*")
vstepaniuk le

1

C'est une vieille question mais je pense qu'elle est toujours valable.

Puisqu'il n'y a pas de fonction CONTAINS, pourquoi ne pas la déclarer en VBA? Le code ci-dessous utilise la fonction VBA Instr, qui recherche une sous-chaîne dans une chaîne. Il renvoie 0 lorsque la chaîne n'est pas trouvée.

Public Function CONTAINS(TextString As String, SubString As String) As Integer
    CONTAINS = InStr(1, TextString, SubString)
End Function

Bon moyen d'améliorer l'efficacité personnelle, mais au détriment de la reproductibilité, je dirais :)
geotheory

0

C'est une vieille question, mais une solution pour ceux qui utilisent Excel 2016 ou une version plus récente est que vous pouvez supprimer le besoin de structures imbriquées if en utilisant le nouveau IFS( condition1, return1 [,condition2, return2] ...)conditionnel.

Je l'ai formaté pour le rendre visuellement plus clair sur la façon de l'utiliser pour le cas de cette question:

=IFS(
ISERROR(SEARCH("String1",A1))=FALSE,"Something1",
ISERROR(SEARCH("String2",A1))=FALSE,"Something2",
ISERROR(SEARCH("String3",A1))=FALSE,"Something3"
)

Étant donné que SEARCHrenvoie une erreur si une chaîne n'est pas trouvée, je l'ai enveloppée d'un ISERROR(...)=FALSEpour vérifier la vérité, puis renvoyer la valeur souhaitée. Ce serait génial si SEARCHrenvoyé 0 au lieu d'une erreur pour la lisibilité, mais c'est juste comment cela fonctionne malheureusement.

Une autre note importante est celle IFSqui rendra le match trouvé en premier et donc l'ordre est important. Par exemple, si mes chaînes étaient Surf, Surfing, Surfscomme String1,String2,String3ci-dessus et que ma chaîne de cellules l'était, Surfingelle correspondrait au premier terme au lieu du second en raison de la sous-chaîne Surf. Les dénominateurs communs doivent donc être les derniers de la liste. Mon IFSdevrait être ordonné Surfing, Surfs, Surfde fonctionner correctement (échange Surfinget Surfsfonctionnerait également dans cet exemple simple), mais Surfdevrait être le dernier.


la plupart voudront la capacité if / else, en d'autres termes une valeur par défaut. L'ajout de cette citation pourrait élargir l'attrait de votre réponse: "Il n'y a aucun moyen de définir une valeur par défaut si tous les tests retournent FAUX (c'est-à-dire une valeur si faux). Au lieu de cela, entrez VRAI pour le dernier test, puis une valeur à renvoyer en tant que valeur par défaut si FAUX "
whitneyland

-3

Voici la formule que j'utilise

=IF( ISNUMBER(FIND(".",A1)), LEN(A1) - FIND(".",A1), 0 )


Cela vérifie si "." est inclus dans A1, et s'il l'est, il renvoie ... le nombre de caractères restants dans A1, en commençant par ".". Je ne sais pas si ce calcul supplémentaire est pertinent ici.
Bacon `` Eh '

Au moins, utilisezIFERROR(LEN(A1) - FIND(".", A1), 0)
Nigel Touch
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.