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 :

Rechercher plusieurs mots clés dans un range


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 66
    Points : 39
    Points
    39
    Par défaut [E-00] Rechercher plusieurs mots clés dans un range
    Salut,

    Je souhaiterais rechercher dans un cellule des mots clés précis. J'ai vu certain post parlant de la fonction Find, par contre je n'arrive pas à l'adapter pour rechercher plusieurs mots clés. Ex:

    Si je trouve les mots "azertyuiop" ou "qsdfghjklm" ou "wxcvbn" dans un range, alors je renvoie un booléan à la ligne correspondante.

    Comment puis-je faire cela ?

    Merci pour votre aide

  2. #2
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Bonjour,

    Une solution éventuelle
    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 test()
    Dim Achercher(1 To 3) As String, Trouve As Range
    Dim x As Byte, i As Integer, Adres1 As String
     
    Achercher(1) = "aaa" '<-- 1ère valeur à chercher
    Achercher(2) = "ddd" '<-- 2ème valeur à chercher
    Achercher(3) = "ggg" '<-- 3ème valeur à chercher
     
    For x = 1 To UBound(Achercher) '<-- de la 1ère à la dernière valeur à chercher
        With Sheets(1).Range("A:A") '<-- recherche dans la colonne A de la 1ère feuille
            Set Trouve = .Find(what:=Achercher(x), lookat:=xlWhole)
            If Not Trouve Is Nothing Then
                Adres1 = Trouve.Address
                Do
                    Trouve.Offset(0, 1) = "OK" '<-- si la valeur est trouvée, insertion de "OK" dans la colonne de droite
                    Set Trouve = .FindNext(Trouve)
                Loop While Not Trouve Is Nothing And Trouve.Address <> Adres1
            End If
        End With
    Next
     
    'pour l'explication de Find et FindNext se référer à l'aide de Visual Basic
    End Sub
    Cdlt
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 66
    Points : 39
    Points
    39
    Par défaut
    Merci pour cette réponse. Ca fonctionne très bien !
    Par contre, avec ce code on risque d'avoir des doublons.

    J'ai donc voulus mettre un test de doublon et depuis le code ne trouve plus de valeur à la ligne : Set Trouve = .FindNext(Trouve)

    Où ai-je écris des bétises ?

    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
     
    For x = 1 To F '<-- de la 1ère à la dernière valeur à chercher
        Adres1 = Range("F4").Address
        With Range("F:F") '<-- recherche dans la colonne A de la 1ère feuille
            Set Trouve = .Find(What:=mot(x), lookat:=xlWhole)
            If Not Trouve Is Nothing Then
                Adres1 = Trouve.Address
                Do
                    Num_cde = Trouve.Offset(0, -1)
                    Sheets("Liste cde avec restric").Activate
                    With Range("B:B")
                    Set doublon = Cells.Find(What:=Num_cde)
                       If doublon Is Nothing Then
                            Cells(r, 2).Activate 
                            ActiveCell.Value = Num_cde 'colle le numéro de cde
                            Cells(r, 3).Activate
                            ActiveCell.Value = Trouve 'colle le résultat de ma recherche
                            r = r + 1
                            Sheets("Tcd_restr").Activate
                            nbre_cde_restr = nbre_cde_restr + 1 '<-- si la valeur est trouvée, incrémente le compteur
                         End If
                    End With
                    Sheets("Tcd_restr").Activate
                    Set Trouve = .FindNext(Trouve)
                Loop While Not Trouve Is Nothing And Trouve.Address <> Adres1
            End If
        End With
    Next
    avec la fonction ci-dessus, comme puis je faire une recherche de type OU :
    si aaa ou bbb ou ccc, alors la ligne et filtré ?

  4. #4
    Membre chevronné Avatar de wilfried_42
    Homme Profil pro
    Auto-entrepreneur
    Inscrit en
    Novembre 2006
    Messages
    1 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Vendée (Pays de la Loire)

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 427
    Points : 1 900
    Points
    1 900
    Par défaut
    bonjour à tous

    personnellement, dans ce cas, je prefere changer de methode

    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
    dim chaine(3) as string, i as long, j as integer, total as double
    chaine(1) = "AAAA"
    chaine(2) = "BBBBB"
    chaine(3) = "CCCC"
     
    For i = 2 to range("A65536").end(xlup).row
         total = 0
         for j = 1 to 3
    ' Si tu cherches AAAA ou BBBBB ou CCCC
             total = total + instr(range("A" & i),chaine(j))
    ' si tu cherche que les 3 element doivent etre ensemble
             if j = 1 then total = instr(range("A" & i,chaine(j)) else total = total * instr(range("A" & i, chaine(j))
         next j
         if total > 0 then msgbox "Ligne " & i & " à filtrer"
    next i
    Wilfried

  5. #5
    Inactif  

    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    4 555
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 4 555
    Points : 5 535
    Points
    5 535
    Par défaut
    Bonsoir,

    je partage l'avis de wilfried_42

    (éviter d'utiliser 3 fois le Find et préférer la lecture et l'analyse en boucle).

    J'y apporte toutefois une petite idée de modif.

    Soit montexte le contenu à analyser
    On peut :
    - savoir combien d'occurence de la condition dans le texte
    - si > 0 alors c'est True

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    meschaines = Array("toto", "titi", "tata")
     montexte = "blabla toto blabla tata blaba"
     Dim present As Integer
     present = 0
     For i = 0 To UBound(meschaines)
       present = present + IIf(InStr(montexte, meschaines(i)), 1, 0)
     Next
     MsgBox present & " donc " & (present > 0)
    Je te laisse le soin du reste : relever la ligne concernée dans ta boucle

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 66
    Points : 39
    Points
    39
    Par défaut
    Merci pour vos réponses
    Je viens d'essayer vos deux dernieres propositions et la valeur de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InStr(Range("F" & i), mot(j))
    ne renvoie rien.
    Pourtant en survolant avec mon curseur j'ai pour
    - Range("F" & i), la valeur de ma cellule qui est testée
    - mot(j), la valeur du mot que je recherche.

    Avez-vous une piste ? J'ai regarder dans l'aide de la fonction InStr et je ne vois pas !

  7. #7
    Membre chevronné Avatar de wilfried_42
    Homme Profil pro
    Auto-entrepreneur
    Inscrit en
    Novembre 2006
    Messages
    1 427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Vendée (Pays de la Loire)

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

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 427
    Points : 1 900
    Points
    1 900
    Par défaut
    re:

    instr renvoie la position dans une chaine d'une valeur cherchée, si la valeur n'est pas dans la chaine, instr renvoie 0

    maintenant, tu peux avoir des problemes de Majuscules / Minuscules

    modifier par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    msgbox instr(lcase(range("F" & i)), lcase(mot(j)))
    Wilfried

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 66
    Points : 39
    Points
    39
    Par défaut
    Ca y est, j'obtiens le resultat attendu. Merci Wilfried et les autres.

    L'une des raisons du non-fonctionnement était que je recherchais mes mots en utilisant les *....* comme cet ex : mot(7) = "*" & mot7 & "*"
    En fait avec la fonction Instr ce n'ai pas necessaire !

    En tout cas, merci pour votre aide !!

    A bientot

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

Discussions similaires

  1. Recherche de mots clés dans mails
    Par AAWOOPY56 dans le forum Lotus Notes
    Réponses: 1
    Dernier message: 13/12/2011, 08h55
  2. Réponses: 33
    Dernier message: 22/08/2011, 14h33
  3. Recherche plusieurs mots clés
    Par assade dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 04/12/2009, 10h54
  4. Réponses: 2
    Dernier message: 24/02/2009, 10h43
  5. recherche par mots-clés dans base access
    Par syber72 dans le forum Access
    Réponses: 2
    Dernier message: 07/03/2006, 13h53

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