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

Macros et VBA Excel Discussion :

Recherche d'un mot ENTIER dans une autre chaîne, sans respecter la casse (+ ponctuation) [XL-2007]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Points : 14
    Points
    14
    Par défaut Recherche d'un mot ENTIER dans une autre chaîne, sans respecter la casse (+ ponctuation)
    Bonjour à tous !!!!!!

    Voilà mon soucis :

    Je voudrais pouvoir vérifier la présence d'un mot dans une autre chaîne. Je connais la fonction InStr mais ça ne me convient pas pour la raison suivante : je veux savoir si le mot entier uniquement est présent.

    Exemple :

    Je recherche le mot
    lan
    dans le texte suivant :

    L'athlète lance le javelot à une distance phénoménale !!!
    (désolé j'ai mangé trops de J.O. cet été ^^")

    La fonction InStr va donc me renvoyer "11" ici puisqu'on trouve bien la chaîne "lan" à partir de la position 11.

    Or, dans mon cas, je veux uniquement trouver le mot "lan". Je ne veux pas qu'il fasse partis d'une autre mot.

    De plus, il faut prévoir les points, points d'exclamation, points d'interrogation, etc...

    Par exemple, dans la phrase suivante, la recherche devra me renvoyer VRAI :

    J'ai fait bon nombre de lan. Notamment sur Counter Strike Source.

    Quelqu'un aurait-il une idée ?

    Merci d'avance.
    Cordialement.


    PS : j'ai pensé aux expressions régulières, mais je ne maitrise pas ça du tout, et je ne suis même pas certain qu'elles permettent de faire ça. De plus leur utilisation sous Excel en VBA m'est inconnue...

  2. #2
    Membre expert Avatar de QuestVba
    Homme Profil pro
    Enseignant
    Inscrit en
    Juillet 2012
    Messages
    2 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2012
    Messages : 2 477
    Points : 3 864
    Points
    3 864
    Par défaut
    Bonjour,

    Voici un début.

    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
    Sub Chercher()
     
    For j = 1 To ActiveWindow.RangeSelection.Count
     
      nomachercher = "lan"
     
      Sheets(1).Select
      Range("a1").Select
      tailledemot = Len(nomachercher)
      Do While ActiveCell.Value <> ""
        For x = 1 To Len(ActiveCell)
            Car = Mid(ActiveCell, x, tailledemot)
            apr = Mid(ActiveCell, x + 3, 1)
                If Car = nomachercher And Mid(ActiveCell, x + 3, 1) = " " Or Mid(ActiveCell, x + 3, 1) = "." Then
                        MsgBox nomachercher & " trouvé"
                  End If
        Next x
        ActiveCell.Offset(1, 0).Select
      Loop
     
    Next j
     
    End Sub

  3. #3
    rdp937
    Invité(e)
    Par défaut
    Bonjour,

    Un truc comme ça..


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Sub test()
        testChaine ("lan") 'Chaine à rechercher'
    End Sub
    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
     
    Function testChaine(chaineRecherchee)
     
    Dim signePonctuation As String, chaineParcourue As String
     
    signePonctuation = "[.!#$%&'*/=?^_`{|}~+-]"
     
     
    For n = 1 To Range("A65536").End(xlUp).Row 'Parcours de toutes les chaines dans la colonne A
     
        chaineParcourue = Cells(n, 1).Value 'Chaine de recherche'
     
        nbreCaractereChaineRecherche = Len(chaineRecherchee) 'nombre de caractere de la chaine recherchée
        nbreCaractereChaine = Len(chaineParcourue) 'nombre de caractere de la chaine de recherche
     
     
        StrValue = InStr(1, chaineParcourue, chaineRecherchee, 1) '
     
        chaineDroite = Right(Left(chaineParcourue, StrValue - 1), 1)
        chaineGauche = Right(Left(chaineParcourue, StrValue + nbreCaractereChaineRecherche), 1)
     
        If chaineDroite = " " Then 'Si la chaine avant est vide
            If Mid(chaineGauche, 1, 1) Like signePonctuation Then 'Si c'est un signe de ponctuation
                Cells(n, 2).Value = "VRAI"
            Else
                Cells(n, 2).Value = "FAUX"
            End If
        Else
            Cells(n, 2).Value = "FAUX"
        End If
     
    Next n
     
    End Function

  4. #4
    Membre éprouvé Avatar de issoram
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    665
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 665
    Points : 929
    Points
    929
    Par défaut
    Bonjour,

    Les expressions régulières sont très pratiques pour ce genre de problème. Mais si tu veux t'en passer il te faudra faire une "fonction maison"

    Un pseudo-algo à implémenter (dans la même idée que les 2 réponses précédentes).
    • On cherche la chaine1 dans la chaine2 (avec instr)
    • Si on la trouve: on regarde les caractères qui l'entourent dans la chaine2
    • Si ces caractères sont dans les listes des caractères de début et fin de mot (libres à toi de mettre ce que tu veux en fonction de ton problème) alors renvoi vrai
    • sinon renvoie faux


    Bon courage

  5. #5
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Bonjour,

    Essaies ceci :
    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
    Sub Test()
    Dim texte As String
    Dim chaine As String
     
      chaine = "language"
      texte = "Les languages et les abus de language."
      If testChaine(texte, chaine) Then MsgBox "Trouvé" Else MsgBox "Pas trouvé"
     
    End Sub
     
    Function testChaine(texte As String, chaine As String) As Boolean
    Dim ptr As Long
     
      ptr = 0
      Do
        ptr = InStr(ptr + 1, " " & texte, chaine, 1)
        If ptr = 0 Then Exit Do
        testChaine = Mid(" " & texte & " ", ptr - 1, Len(chaine) + 2) _
                     Like "[ (""']" & chaine & "[ ,.!?'""]"
      Loop While Not testChaine
     
    End Function
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour

    Si j'ai bien compris.

    En utilisant un tableau et en mettant chaque mot dans ce tableau à l'aide de la fonction split.

    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
    Public Function RechercheDansChaine(strChaine As String, strMot As String) As Long
        ' déclaration
        Dim tabString() As String 'on déclare un tableau
        Dim i As Integer          ' pour parcourir le tableau
        Dim cpt As Long        ' pour compter les occurences
     
        ' on remplit le tableau un mot par ligne
        tabString = Split(strChaine, " ")
     
        ' on liste les mots
        For i = 0 To UBound(tabString())
            If tabString(i) = strMot Then
                cpt = cpt + 1
            End If
        Next i
     
        RechercheDansChaine = cpt
    End Function
    exemple :

    recherchedanschaine("qsdsd lan sqdfs qsdfsdf lan lan qsdfs","lan")

    retourne 3, car le mot lan apparait 3 fois dans la chaine.

    Il te suffit donc de tester la valeur de retour.

    Philippe

  7. #7
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Avril 2011
    Messages
    1 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 858
    Points : 3 974
    Points
    3 974
    Par défaut
    Bonjour,

    J’ai repris l’idée de issoram pour vérifier la présence du mot.
    La difficulté est de définir quels sont les caractères admis avant et après le mot recherché.
    Dans le code que je te propose, cette liste est pré renseignée dans un tableau, le problème étant que le résultat sera erroné si cette liste n’est pas exhaustive.
    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
    Option Explicit
    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim Tablo
    Dim Pos As Integer, i As Integer, j As Integer
    Dim Chaine As String, Mot As String, Resultat As String
        Chaine = Target.Value
        Mot = InputBox("Mot à rechercher ?")
        If Mot = "" Then Exit Sub
        Resultat = "Absent"
        'On liste les caractères acceptés pour préceder ou suivre le mot recherché.
        Tablo = Array(".", ",", ";", "-", "!", "?", ":", "'", "(", ")", " ", "{", "}", "[", "]")
        ' on recherche le mot dans la ligne
        Pos = InStr(1, Chaine, Mot, 1)
        'Si le mot a été trouvé
        If Pos > 0 Then
            'On vérifie que le caractère précédant et le caractère suivant appartiennent à la liste.
            'Nota : le mot ayant été trouvé, si les caractères précédant et suivant le mot font partie de la liste
            'des caractères acceptés, on considère que le mot est présent.
            For i = 0 To UBound(Tablo)
                If Mid(Chaine, Pos - 1, 1) = Tablo(i) Then
                    For j = 0 To UBound(Tablo)
                        If Mid(Chaine, Pos + Len(Mot), 1) = Tablo(j) Then Resultat = "Présent"
                    Next j
                End If
            Next i
        End If
        MsgBox "Le mot " & Mot & " est " & Resultat
    End Sub
    Cordialement.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Je tiens tout d'abord à remercier tout le monde d'avoir pris du temps pour tenter de résoudre mon problème !!!

    J'ai essayé la plupart des propositions faites. Certaines se repprochent de mon problème, d'autres un peu moins. Il y en a certaines que j'ai eu un peu plus de mal à comprendre, mais en définitif j'ai retenu la suivante :

    Citation Envoyé par Patrice740 Voir le message
    Bonjour,

    Essaies ceci :
    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
    Sub Test()
    Dim texte As String
    Dim chaine As String
     
      chaine = "language"
      texte = "Les languages et les abus de language."
      If testChaine(texte, chaine) Then MsgBox "Trouvé" Else MsgBox "Pas trouvé"
     
    End Sub
     
    Function testChaine(texte As String, chaine As String) As Boolean
    Dim ptr As Long
     
      ptr = 0
      Do
        ptr = InStr(ptr + 1, " " & texte, chaine, 1)
        If ptr = 0 Then Exit Do
        testChaine = Mid(" " & texte & " ", ptr - 1, Len(chaine) + 2) _
                     Like "[ (""']" & chaine & "[ ,.!?'""]"
      Loop While Not testChaine
     
    End Function
    Bonjour Patrice,

    Ta solution est celle qui se rapproche le plus de mon problème. Elle convient parfaitement à un détail près : la fonction respecte la casse.

    En reprenant ton exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    chaine = "language"
      texte = "Les languages et les abus de language."
      If testChaine(texte, chaine) Then MsgBox "Trouvé" Else MsgBox "Pas trouvé"
    Si on remplace "language" par "Language", j'aimerais qu'on obtienne quand même un résultat positif ("Trouvé" dans ton exemple). En effet, le mot peut très bien être en début de phrase (donc majuscule oblige), les personnes tapant les mots peuvent se tromper et mettre une majuscule dans le mot, etc...

    Sinon pour le reste, la fonction tourne à merveille et correspond parfaitement à ce que je cherche. J'essaies de trouver comment contourner le problème de la casse de mon côté.

    Si vous avez des pistes n'hésitez pas.

    Cordialement

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Bon et bien ce n'était pas sorcier finalement j'ai trouvé pour la casse :
    j'ai simplement utilisé la fonction LCase qui permet de convertir tous les caractères des deux chaines en minuscule.

    Une des solutions finales possibles à mon problème est donc :

    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
    Function testChaine(texte As String, chaine As String) As Boolean
     
        Dim ptr As Long
     
        texte = LCase(texte)
        chaine = LCase(chaine)
        ptr = 0
     
        Do
            ptr = InStr(ptr + 1, " " & texte, chaine, 0)
            If ptr = 0 Then Exit Do
            testChaine = Mid(" " & texte & " ", ptr - 1, Len(chaine) + 2) _
                         Like "[ (""']" & chaine & "[ ,.!?'""]"
        Loop While Not testChaine
     
    End Function

    Encore merci à tous pour vos conseils

    Cordialement.

  10. #10
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 696
    Points
    6 696
    Par défaut
    Bonjour

    et bravo...mais modifie ton titre de message, vu qu'au final tu utilises InStr, ça favorisera les recherches futures

    cordialement,

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 20
    Points : 14
    Points
    14
    Par défaut
    Bonjour Ormonth,

    En effet j'avais oublié ce détail. Voilà qui est fait !

    Bonne journée !


    Cordialement.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 12/03/2015, 16h32
  2. [RegExp] recherche d'un mot précis dans une chaine
    Par oceane751 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 06/04/2012, 11h23
  3. [RegEx] preg_match : recherche d´un mot entier dans une chaine
    Par iOops dans le forum Langage
    Réponses: 7
    Dernier message: 04/04/2011, 15h34
  4. recherche emplacement d'un département dans une autre feuille
    Par bagheria85 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/08/2010, 15h16
  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