IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Excel Discussion :

Recherche exacte d'une chaîne de caractères [XL-2016]


Sujet :

Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Janvier 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Janvier 2019
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Recherche exacte d'une chaîne de caractères
    Bonjour à tous,

    Sous Excel 2016, en VBA, je souhaite que la recherche d'une chaîne de caractères dans une plage me signale toutes les fois où le mot recherché est retrouvé exactement.

    Par exemple, pour la chaine "5000735310" recherchée, voici le résultat attendu :


    'Plage à chercher résultat attendu
    4466 5000735310 VRAI
    5000735310 VRAI
    444500073531055 FAUX
    4466;5000735310 VRAI


    Avec la fonction Instr ou l'opérateur Like, je ne parviens pas à mes fins, puisque la valeur "444500073531055" est aussi signalée vraie.

    Merci pour votre aide.

  2. #2
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    La condition suivante serait-elle suffisante pour décrire tous les cas :
    chaine présente dans la cellule ET caractère précédent non numérique ET caractère suivant non numérique.
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  3. #3
    Candidat au Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Janvier 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Janvier 2019
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    oui, en élargissant la condition à : Chaine présente et caractère précédent ou succédant non alphanumérique.

  4. #4
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Dans ce cas, tu utilises InStr pour trouver la position de ta chaine.
    Si le résultat est 0 -> Faux
    Sinon, si le contenu de la cellule est de la longueur de ta chaine -> Vrai
    Sinon, si le résultat est 1
    ----- Si le caractère juste après ta chaine (long chaine + 1) est numérique (fonction IsNum) -> Faux
    ----- sinon -> Vrai
    Sinon
    ----- Si le caractère juste avant ta chaine (InStr - 1) est numérique (fonction IsNum) -> Faux
    ----- Si le caractère juste après ta chaine (long chaine + InStr) est numérique (fonction IsNum) -> Faux
    ----- sinon -> Vrai
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  5. #5
    Candidat au Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Janvier 2019
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Janvier 2019
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Et voici le code
    Merci de ton aide et de ta réactivité Menhir,

    Cela me confirme qu'il était difficile de faire tenir ma fonction sur seule ligne avec juste une combinaison de Instr ou Like.
    La voici écrite. Elle semble répondre à mon besoin. J'ai laissé la logique proposée en commentaires.

    Comme je souhaitais vérifier que la valeur cherchée ne soit entourée ni par des caractères numériques, ni par du texte, je suis passé par une fonction.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    MyT = Range("H2").Value 'Valeur à rechercher
     
     
    For Each c In Range("A1:A10")
        MyPos = InStr(1, c, MyT, vbTextCompare)
        If MyPos = 0 Then   ' Si le résultat est 0 -> Faux
            c.Offset(0, 1) = "FAUX"
        ElseIf MyPos >= 1 Then
            ' Sinon, si le contenu de la cellule est de la longueur de ta chaine -> Vrai
            If Len(c.Value) = Len(MyT) Then
                c.Offset(0, 1) = "VRAI"
            Else
                If MyPos = 1 Then
                    ' ----- Si le caractère juste après ta chaine (long chaine + 1) est numérique (fonction IsNum) -> Faux
                    '----- sinon -> Vrai
                     c.Offset(0, 1) = AlphaNum(c.Text, MyPos + Len(MyT))
                Else
                    '----- Si le caractère juste avant ta chaine (InStr - 1) est numérique (fonction IsNum) -> Faux
                    If Not (AlphaNum(c.Text, MyPos - 1)) Then
                        c.Offset(0, 1) = "FAUX"
                    Else
                        '----- Si le caractère juste après ta chaine (long chaine + InStr) est numérique (fonction IsNum) -> Faux
                        '----- sinon -> Vrai
                        c.Offset(0, 1) = AlphaNum(c.Text, MyPos + Len(MyT))
                    End If
                End If
            End If
       End If
    Next c
     
    End Sub
     
    Function AlphaNum(MaCellule As String, MyPosition As Integer) As Boolean
    'Est-ce que le caractère contigu à la chaine n'est pas alphanumérique ?
    'Renvoie VRAI si le caractère est spécial --> la chaine inspectée est bien celle recherchée
    'Renvoi FAUX si c'est un caractère alphanumérique --> la chaine inspectée n'est pas celle recherchée
     
    AlphaNum = True
     
    If IsNumeric(Mid(MaCellule, MyPosition, 1)) Then
        AlphaNum = False
    ElseIf Mid(MaCellule, MyPosition, 1) Like "[A-z]" Then
        AlphaNum = False
    End If
     
    End Function

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Python 3.X] Recherche mots dans une chaîne de caractères
    Par Supernatural dans le forum Général Python
    Réponses: 3
    Dernier message: 11/12/2018, 15h39
  2. Réponses: 0
    Dernier message: 31/03/2017, 12h08
  3. recherche sur une chaîne de caractères
    Par bogsy15 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/07/2006, 12h01
  4. Rechercher une chaîne de caractère dans une série de fichier
    Par Edoxituz dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 28/02/2006, 12h51
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo